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

Chrome userscript works on a thread page, but not on a main forum page, with the same structure?

本文关键字:一个 论坛 用户 结构 工作 线程 Chrome 脚本      更新时间:2023-09-26

所以我做了一个简单的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保留)在这个主页

我希望我没有错过一些简单的东西。

Adblock Plus对于这种事情是完美的。而不是尝试用户脚本或扩展来阻止外部文件,只需安装Adblock Plus,然后为http://website.com/e3/2013/css/styles.css添加过滤器。


如果您坚持使用userscript方法,那么您现有的代码似乎正在与竞争条件作斗争。该<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);
    }
}