greasemonkey:阻止嵌入式JS运行

时间:2010-07-15 04:53:38

标签: javascript greasemonkey

页面在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吗?

4 个答案:

答案 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> beforescriptexecuterejectedChrome 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