如何在显示页面内容之前运行greasemonkey脚本?

khr*_*003 25 javascript firefox greasemonkey firefox-addon

我正在为Firefox编写一个插件并使用greasemonkey脚本来执行此操作(我使用此工具http://arantius.com/misc/greasemonkey/script-compiler编译用户脚本).

问题是脚本在页面完全加载后运行.这意味着用户将以原始形式查看已查看的页面,然后脚本将应用我所做的更改.我的问题是有一种方法可以在向用户显示页面内容之前运行用户脚本,因此用户只能访问网站的最终版本吗?

kwa*_*wah 27

编辑:这篇文章是@run-at在Greasemonkey中实现密钥之前创建的- 正如Blaise所说,从Greasemonkey 0.9.8开始,您可以在页面开始加载后立即执行脚本.

@run-at document-start 在wiki中描述如下:

从版本0.9.8开始是新的.该脚本将在任何文档开始加载之前运行,因此在任何脚本运行或图像加载之前.

请注意,这意味着在创建DOM之前(可能)运行脚本,并可能导致一些不一致/异常行为.你需要(一点点)不仅仅是这个单线插入.

在Greasemonkey Wiki上还有一些细节:http: //wiki.greasespot.net/Metadata_Block#.40run-at

附注:我必须提供的信息与浏览器中的Greasemonkey特别相关.我不确定@run-at document-start脚本编译器是否运行良好 - 我建议生活危险..测试并找出答案!]



目前无法在页面加载之前运行用户脚本.

要使用当前版本的Greasemonkey来停止闪烁,您可以尝试在您的Firefox配置文件中添加用户样式(然后使用该脚本撤消),如Greasemonkey wiki所述,但这也需要您的每个用户都这样做从中受益.

这是长期以来一直需要的东西,并在Greasemonkey的Github网站上查看问题#1103,似乎已经制作了一个工作原型(但是没有时间尺度可以添加到发布版本afaik).

  • 该错误已得到修复,您现在可以在页面加载之前运行脚本,方法是将其添加到元部分:`@ run-at document-start` (2认同)

小智 7

除了之前的答案之外,我还找到了一个完美运行的解决方案,就像以前版本的 Firefox 和 GreaseMonkey 一样。首先,run-at 必须设置为最早时刻,因此 document-start:

// @run-at      document-start
Run Code Online (Sandbox Code Playgroud)

因为 DOM 可能还没有加载,所以等待文档获得交互的 readyState:

document.onreadystatechange = function () {
    if (document.readyState === "interactive") {
       // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然 Greasemonkey 的实现与 document-end 大致相同,但我注意到上面的技术运行得更快。使用这个解决了我在 Firefox 中遇到的所有问题,当 DOM 更改启动时,页面上会出现闪烁/跳转屏幕,并按照用户脚本的预期直接加载页面。