我正在爲Firefox編寫一個插件並使用greasemonkey腳本來做到這一點(我使用此工具編譯用戶腳本http://arantius.com/misc/greasemonkey/script-compiler)。如何在頁面內容顯示之前運行greasemonkey腳本?
問題是腳本在頁面完全加載後運行。這意味着用戶將以原始形式看到所查看的頁面,然後該腳本將應用我所做的更改。我的問題是,在頁面內容顯示給用戶之前,有一種方法可以運行用戶腳本,因此用戶只需要最終版本的網站?
我正在爲Firefox編寫一個插件並使用greasemonkey腳本來做到這一點(我使用此工具編譯用戶腳本http://arantius.com/misc/greasemonkey/script-compiler)。如何在頁面內容顯示之前運行greasemonkey腳本?
問題是腳本在頁面完全加載後運行。這意味着用戶將以原始形式看到所查看的頁面,然後該腳本將應用我所做的更改。我的問題是,在頁面內容顯示給用戶之前,有一種方法可以運行用戶腳本,因此用戶只需要最終版本的網站?
編輯:這篇文章是在Greasemonkey中執行@run-at
鍵之前創建的 - 正如Blaise指出的,來自Greasemonkey 0.9.8,現在可以在頁面開始加載後立即執行腳本。
開始是作爲新的0.9.8版本:
@run-at document-start
在維基描述如下。該腳本將在任何 文檔開始加載之前運行,因此在任何腳本運行或圖像加載之前運行。
請注意,這意味着在創建DOM之前使腳本運行(可能),並可能導致某些不一致/異常的行爲。您將需要(一點)不僅僅是這一行的入門。
有超過在Greasemonkey的維基一些細節: http://wiki.greasespot.net/Metadata_Block#.40run-at
側面說明:到我手邊的信息具體涉及到的Greasemonkey在瀏覽器中。我不確定@run-at document-start
是否可以很好地與腳本編譯器配合使用 - 我建議生活得很危險。測試它並找出結果! ]
這是目前無法在頁面加載之前運行用戶腳本。
要使用Greasemonkey的當前版本停止閃爍,你可以嘗試將用戶添加樣式到你的Firefox配置文件作爲在Greasemonkey wiki描述(然後使用腳本撤消),但這也需要你的每一個用戶也可以從中獲益。
這是一直希望很長一段時間,並通過issue #1103上的Greasemonkey的Github的網站尋找,一個工作原型似乎已經作出一些(但沒有時間表爲此得到AFAIK加入到發行版本)。
使用@run-at document-start
在@kwah答案中建議我的腳本在我想要處理的內容之前執行的文檔正文中。作爲解決方法,我設置了一個間隔,每隔5秒鐘運行腳本,直到document.readyState == "complete"
(或直到20秒過去)。
這很適合我的情況:
// ==UserScript==
// ...
// @run-at document-start
// ==/UserScript==
var greasemonkeyInterval = setInterval(greasemonkey, 200);
var greasemonkeyStart = (new Date()).getTime();
function greasemonkey() {
// ...
// waiting for readyState (or timeout)
if (
(new Date()).getTime() - greasemonkeyStart > 20000
|| document.readyState == "complete"
) {
clearInterval(greasemonkeyInterval);
}
};
如果您更肯定的是,內容還會在documentready我覺得這樣的事情會更可取:
function greasemonkey() {
if (
document.readyState != "interactive"
&& document.readyState != "complete"
) {
return;
}
// ...
clearInterval(greasemonkeyInterval);
}
除了以前的答案,我發現了一個完美的解決方案,就像之前版本的Firefox & GreaseMonkey。 首先,運行在必須設置爲最早的時刻,所以文檔的開始:
// @run-at document-start
因爲DOM很可能尚未加載,等待該文檔獲得的互動readyState的:
document.onreadystatechange = function() {
if (document.readyState === "interactive") {
// Do something
}
}
儘管Greasemonkey在文檔結束時實現的差不多,但我注意到上面的技術工作得更快。 使用此功能可以解決我在Firefox中彈出/跳轉屏幕時遇到的所有問題,當DOM更改啓動時,它會按照用戶腳本的指定直接加載頁面。
這可能與該編譯器生成的附加組件無關 - 它像GM一樣,在DOM完全加載並通過JavaScript注入進行操作之後運行。您可能需要使用更多「典型」附加/擴展技術來篩選下載的頁面。也就是說,你需要寫一個擴展名,而不是移植一個GM腳本。 – 2011-02-12 15:46:48
即使您編寫了擴展名,瀏覽器也會在其完全加載之前以其原始格式顯示頁面。 – Neil 2011-02-12 17:41:54