簡體   English   中英

使用內容腳本從 chrome 擴展中的當前 DOM 中刪除一些元素

[英]Remove some element from current DOM in chrome extension using Content Script

如果某個網頁中有很多<div>是這樣的:

<div tbinfo="ouid=1234567890&rouid=987654321"></div>
<div tbinfo="ouid=1234567891&rouid=987654321"></div>
<div tbinfo="ouid=1234567892&rouid=987654321"></div>
...

我有這個內容腳本,如果ouidrouid匹配某個鍵,則嘗試從中刪除一些分區:

var i;
for (i = 0; i < arrID.length; i++) {
    chrome.tabs.query(
        {active: true}, function(tabs) {
            var tab = tabs[0];

            let code = `document.querySelectorAll('div[tbinfo]')`;

            chrome.tabs.executeScript(tab.id, {code}, function (result) {
                const key = arrID[i];
                result.forEach(div => {
                    const tbinfoArr = div.getAttribute('tbinfo');
                    if (tbinfoArr.includes(key)) {
                        div.remove();
                    }
                });
            });
        }
    );
}

但是 chrome 說Error handling response: TypeError: div.getAttribute is not a function

這里有什么問題?


由@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,
    };
}

alert(JSON.stringify(ID)); 顯示ID參數為空(結果: {} )。

所以我測試了 ID 的值並發現// Alert No.1運行良好,但// Alert No.2為空。

所以它看起來像是chrome.tabs.query(不能在內部引用??


(${ removeContent })(${ JSON.stringify(params) })

(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,
    };
}) ({})

該值來自// Alert No.4

正如這篇文章中所討論,for 循環內部的異步進程會導致問題。

用 forEach 替換 for 循環解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM