在浏览器中禁用JS时,setTimeout在Greasemonkey用户脚本中不起作用

pet*_*ter 7 javascript greasemonkey settimeout

我正在开发一个项目,该项目要求我的用户脚本在页面上运行,而不会执行任何页面的JavaScript.也就是说,我们需要禁用JavaScript浏览.

当我尝试延迟脚本中的函数执行时,我遇到了一个问题.每当我打电话时window.setTimeout,我传入的函数永远不会被执行.

我想也许这个函数实际上是调用unsafeWindow而不是窗口.这有什么解决方法吗?

我应该提一下,setTimeout当启用JavaScript并且我的脚本中的其他所有内容在没有启用JavaScript的情况下工作正常时,调用工作正常.

谢谢你的帮助!

Bro*_*ams 4

正如 Pointy 所说,尽管 Greasemonkey JavaScript 以提升的权限运行,setTimeout但函数仍会附加到页面的 JavaScript 空间中——根据需要包装在闭包中。(在正常操作中,油猴实例通常在任何计时器设置、触发时就消失了。)

因此,如果页面的主要 JavaScript 被禁用,计时器将永远不会运行。

可能的解决方法:

  • 用作GM_xmlhttpRequest粗略的延迟。您可以设置一个页面来故意绘制其响应。所以代码如下:

    GM_xmlhttpRequest
    (
        {
            method: "GET",
            url:    "http://YourTestServer.com/DelayService.php?Seconds=2",
            onload: function (response) {YourDelayedFunctionHere (); }
        }
    );
    
    Run Code Online (Sandbox Code Playgroud)

    将调用您设置的实用程序页面来为您执行延迟。

  • 使用 NoScript 禁用除主页之外的所有页面 JavaScript。例如,对于页面YourSite.com/testpage.htm,其中包含来自*SpamGenerator.net 的脚本...允许来自YourSite.com的脚本,但阻止来自SpamGenerator.net 的脚本