Chrome用户脚本在线程页面上工作,但不在主论坛页面上,具有相同的结构?

时间:2013-06-04 06:19:25

标签: javascript jquery google-chrome userscripts content-script

因此,我制作了一个简单的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"]


this thread page上的工作(删除CSS)。

this main page 无效(CSS仍然存在)。

我希望我不会错过任何简单的事情。

1 个答案:

答案 0 :(得分:1)

Adblock Plus非常适合这种事情。不要尝试使用用户脚本或扩展程序来阻止外部文件,只需安装Adblock Plus,然后为http://website.com/e3/2013/css/styles.css添加过滤器。


如果您坚持使用usercript方法,那么您的现有代码似乎正在与竞争条件作斗争。 <link>节点是存储在div中的文档的一部分,显然是由javascript(AJAX)操纵的。有时您的脚本会及时触发以捕获副本,有时则不会。 Chrome scripts fire at unpredictable times, by default

这一事实加剧了这种情况

可能足以将"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);
    }
}