页面在html中有以下内容:
<script type="text/javascript">
// some code
</script>
我的greasemonkey脚本需要阻止该脚本运行。我怎么能这样做?
更新:据我所知,在一般情况下,这是不可能的。但是,在我的具体情况下,我可能有一个漏洞?
<script type="text/javascript">
if (!window.devicePixelRatio) {
// some code that I -don't- want to be run, regardless of the browser
}
</script>
在嵌入式脚本运行之前,我有什么方法可以定义window.devicePixelRatio
吗?
答案 0 :(得分:13)
现在可以使用@run-at document-start
和Firefox的beforescriptexecute
。仅在FF24中测试。
// ==UserScript==
...
// @run-at document-start
// ==/UserScript==
//a search string to uniquely identify the script
//for example, an anti-adblock script
var re = /adblock/i;
window.addEventListener('beforescriptexecute', function(e) {
if(re.test(e.target.text)){
e.stopPropagation();
e.preventDefault();
}
}, true);
2016年HTML 5的{p> beforescriptexecute
为rejected,Chrome is unlikely to implement it。
它不会运行其他脚本插入的<script>
个节点。
答案 1 :(得分:2)
用户脚本在加载页面后运行,因此您无法使用。
除非,代码使用“onload”事件。
用户脚本在执行之后执行 DOM已完全加载,但在onload之前 发生。这意味着你的脚本 可以立即开始,不需要 等待onload。
答案 2 :(得分:1)
另一个选择是使用Privoxy而不是GreaseMonkey。您只需使用Privoxy作为代理(在localhost上)并搜索/替换您不喜欢的字符串。
答案 3 :(得分:1)
回复:
在嵌入式脚本运行之前,我有什么方法可以定义
window.devicePixelRatio
吗?
现在有。像这样:
// ==UserScript==
// @name _Pre set devicePixelRatio
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @run-at document-start
// @grant none
// ==/UserScript==
//-- @grant none is imporatant in this case.
window.devicePixelRatio = "Unimportant string or function or whatever";
在一般情况下:
自Firefox 4以来,现在只能在Firefox上使用。使用the checkForBadJavascripts
utility来充分利用beforescriptexecute
的力量。像这样:
// ==UserScript==
// @name _Block select inline JS
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://gist.github.com/raw/2620135/checkForBadJavascripts.js
// @run-at document-start
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
checkForBadJavascripts ( [
[false, /window\.devicePixelRatio/, null]
] );
这将阻止第一个内联脚本,其中包含window.devicePixelRatio
,完全。如果您想有选择地修改该脚本的部分内容,请参阅this answer和/或this answer。