Greasemonkey脚本关闭烦人的事情

时间:2010-12-23 04:10:58

标签: javascript greasemonkey

有没有办法可以使用Greasemonkey有选择地删除网站上的脚本?

免责声明:我认识JS,但对GM没有太多(读:无)直接经验。

我只需要停止加载外部脚本(不能使用NoScript,因为我想加载其他不那么烦人的脚本)。

我试过这样做:

// ==UserScript==
// @name           turn_shit_off
// @namespace      http://www.google.com
// @include        http://www.xyz.com/*
// ==/UserScript==

window.onload = function() {
    var d = document;   // shorthand
    var scripts = d.getElementsByTagName('script');
    for(var i = 0; i < scripts.count; i++) {
        if(scripts[i].src.indexOf('foobar.js') != -1) {
            scripts[i].src = '';
        }
    }
}

但它对我不起作用。

2 个答案:

答案 0 :(得分:3)

是的,Adblock Plus是最好的方法,如果适用的话。

GM代码可能无法及时触发以阻止所有损坏,但是 - 对于咯咯笑声 - 您的代码的工作版本将是这样的:

// ==UserScript==
// @name           turn_shit_off
// @namespace      http://www.google.com
// @include        http://www.xyz.com/*
// ==/UserScript==

var scripts = document.getElementsByTagName('script');

for (var J = scripts.length-1;  J >=0;  --J)
{
    if (/foobar\.js/i.test (scripts[J].src) )
    {
        console.log ("Killed", scripts[J].src);
        scripts[J].parentNode.removeChild (scripts[J]);        
    }
}

/*--- Now you have to unload any unwanted event handlers and/or timers 
    that were set before the above code could fire.
    This is highly page-specific and may not be possible if anonymous
    functions were used.
*/


您将看到它实际上删除了脚本元素 但是,唉,改变或删除script元素本身在大多数情况下都不会起作用。在<延迟加载/运行代​​码(触发onload或设置deferasync属性的内容)中可能除外。

在明确反对虚假JS设置的处理程序和计时器之前,你不会有任何影响 - 这是特定于页面的,并不总是可行。

运行此代码以便亲自查看。

答案 1 :(得分:-1)

这是来自Greasemonkey论坛的Matt Sargent的更短的一篇:

var badWidget = document.getElementById('challengeWinnersWidget');
badWidget.parentNode.removeChild(badWidget);

简单,优雅,有效!