有没有办法可以使用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 = '';
}
}
}
但它对我不起作用。
答案 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
或设置defer
或async
属性的内容)中可能除外。
在明确反对虚假JS设置的处理程序和计时器之前,你不会有任何影响 - 这是特定于页面的,并不总是可行。
运行此代码以便亲自查看。
答案 1 :(得分:-1)
这是来自Greasemonkey论坛的Matt Sargent的更短的一篇:
var badWidget = document.getElementById('challengeWinnersWidget');
badWidget.parentNode.removeChild(badWidget);
简单,优雅,有效!