Javascript 使用内容脚本从chrome扩展中的当前DOM中删除某些元素

Javascript 使用内容脚本从chrome扩展中的当前DOM中删除某些元素,javascript,google-chrome-extension,Javascript,Google Chrome Extension,如果在某些网页中有许多这样的s: <div tbinfo="ouid=1234567890&rouid=987654321"></div> <div tbinfo="ouid=1234567891&rouid=987654321"></div> <div tbinfo="ouid=1234567892&rouid=987654321"></div> ... 但是chrome说错误处理响应:TypeE

如果在某些网页中有许多这样的
s:

<div tbinfo="ouid=1234567890&rouid=987654321"></div>
<div tbinfo="ouid=1234567891&rouid=987654321"></div>
<div tbinfo="ouid=1234567892&rouid=987654321"></div>
...
但是chrome说
错误处理响应:TypeError:div.getAttribute不是一个函数

这里怎么了


根据@wOxxOm的建议,我修改了我的代码如下:

for (i = 0; i < arrID.length; i++) {
    alert(arrID[0] + ' ' + (typeof arrID[0])); // Alert No.1 // result: 123456789 string
    chrome.tabs.query(
        {active: true}, function(tabs) {
            var tab = tabs[0];

            const params = { ID: arrID[i] };
          alert(arrID[i] + ' ' + JSON.stringify(params)); // Alert No.2 // result = undefined {}

         alert(`(${ removeContent })(${ JSON.stringify(params) })`); // Alert No.4
            chrome.tabs.executeScript({
                code: `(${ removeContent })(${ JSON.stringify(params) })`
            }, ([result] = []) => {
                //
            });
        }
    );
}

function removeContent(ID) {
    var allElement = document.querySelectorAll('div[tbinfo]');
    alert(JSON.stringify(ID)); // Alert No.3
    var key = ID.ID;
    allElement.forEach(div => {
        const tbinfoArr = div.getAttribute('tbinfo');
        if (tbinfoArr.includes(key)) {
            div.remove();
        }
    });
    return {
        success: true,
    };
}
此值来自第4号警报,如中所述,for循环内部的异步进程将导致问题


用forEach替换for loop解决了这个问题。

好吧,
div
肯定不是jQuery对象——因为您不使用jQuery——但是getAttribute不是一个函数,您不能通过executeScript传输元素,这看起来确实很奇怪。只能传输简单类型,如字符串/数字、数组或此类简单类型的对象。当我需要从外部生成的实际
值(例如
var key=arrayFromOutside[0];
)时,在您的
代码内进行处理,例如@wOxxOm如果我在代码内进行处理,它会有范围问题吗?@wOxxOm我按照那篇文章中的建议修改了我的代码并更新了我的问题。@wOxxOm这只是字符串类型中的一个数字。我尝试了
alert(arrID[0]+''+(typeof arrID[0]),结果是:
5510540272字符串
for (i = 0; i < arrID.length; i++) {
    alert(arrID[0] + ' ' + (typeof arrID[0])); // Alert No.1 // result: 123456789 string
    chrome.tabs.query(
        {active: true}, function(tabs) {
            var tab = tabs[0];

            const params = { ID: arrID[i] };
          alert(arrID[i] + ' ' + JSON.stringify(params)); // Alert No.2 // result = undefined {}

         alert(`(${ removeContent })(${ JSON.stringify(params) })`); // Alert No.4
            chrome.tabs.executeScript({
                code: `(${ removeContent })(${ JSON.stringify(params) })`
            }, ([result] = []) => {
                //
            });
        }
    );
}

function removeContent(ID) {
    var allElement = document.querySelectorAll('div[tbinfo]');
    alert(JSON.stringify(ID)); // Alert No.3
    var key = ID.ID;
    allElement.forEach(div => {
        const tbinfoArr = div.getAttribute('tbinfo');
        if (tbinfoArr.includes(key)) {
            div.remove();
        }
    });
    return {
        success: true,
    };
}
(function removeContent(ID) {
    var allElement = document.querySelectorAll('div[tbinfo]');
    var key = ID.ID;
    allElement.forEach(div => {
        const tbinfoArr = div.getAttribute('tbinfo');
        if (tbinfoArr.includes(key)) {
            div.remove();
        }   
    });
    return {
        success: true,
    };
}) ({})