-1

所以我做了一个简单的 Chrome 扩展,它只加载一个简单的脚本来从论坛中删除一个特定的.css文件。问题是在线程页面上,脚本有效;但在主论坛页面上却没有。

这是脚本:

[...]
//e3 2012/2013
var E3 = document.querySelector('#website-specials');
E3.remove();
//var cssE3 = document.querySelectorAll('[href="http://website/e3/2013/css/styles.css"]')[0];
//cssE3.remove(); works too
alert('debug: removed');
[...]

相关manifest.json位:

"matches": ["*://*.website.com/*"]
...

"js": ["jquery-2.0.1.min.js", "my_script.js"]


它在线程页面上有效(删除 CSS)。

在这个主页上它不起作用(CSS 仍然存在)。

我希望我不会错过一些简单的东西。

4

1 回答 1

1

Adblock Plus非常适合这种事情。与其尝试使用用户脚本或扩展名来阻止外部文件,不如安装 Adblock Plus,然后为http://website.com/e3/2013/css/styles.css.


如果您坚持使用用户脚本方法,那么您现有的代码似乎正在与竞争条件作斗争。该<link>节点是存储在 div 中的文档的一部分,显然是由 javascript (AJAX) 操作的。有时您的脚本会及时触发以捕获副本,有时则不会。默认情况下, Chrome 脚本会在不可预知的时间触发,这一事实加剧了这种情况。

只需添加到您"run_at": "document_end"的 manifest.json就足够了。(具有讽刺意味的是,在默认脚本执行时间之前触发。)

但是,可以肯定的是,使用间隔并删除该链接的所有副本。像这样:

var cssChkInterval = setInterval (killBadCSS, 222);

function killBadCSS (x) {
    var cssE3 = document.querySelectorAll (
        'link[href="http://website.com/e3/2013/css/styles.css"]'
    );
    if (cssE3.length) {
        for (var J = cssE3.length - 1;  J >= 0;  --J) {
            cssE3[J].remove ();
        }

        clearInterval (cssChkInterval);
    }
}


或者,既然您正在加载 jQuery,请使用它!:

var cssChkInterval = setInterval (killBadCSS, 222);

function killBadCSS (x) {
    var cssE3 = $('link[href="http://website.com/e3/2013/css/styles.css"]');
    if (cssE3.length) {
        cssE3.remove ();

        clearInterval (cssChkInterval);
    }
}
于 2013-06-04T15:48:43.457 回答