2011-02-12 169 views
22

我正在爲Firefox編寫一個插件並使用greasemonkey腳本來做到這一點(我使用此工具編譯用戶腳本http://arantius.com/misc/greasemonkey/script-compiler)。如何在頁面內容顯示之前運行greasemonkey腳本?

問題是腳本在頁面完全加載後運行。這意味着用戶將以原始形式看到所查看的頁面,然後該腳本將應用我所做的更改。我的問題是,在頁面內容顯示給用戶之前,有一種方法可以運行用戶腳本,因此用戶只需要最終版本的網站?

+0

這可能與該編譯器生成的附加組件無關 - 它像GM一樣,在DOM完全加載並通過JavaScript注入進行操作之後運行。您可能需要使用更多「典型」附加/擴展技術來篩選下載的頁面。也就是說,你需要寫一個擴展名,而不是移植一個GM腳本。 – 2011-02-12 15:46:48

+0

即使您編寫了擴展名,瀏覽器也會在其完全加載之前以其原始格式顯示頁面。 – Neil 2011-02-12 17:41:54

回答

24

編輯:這篇文章是在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加入到發行版本)。

2

使用@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); 

} 
2

除了以前的答案,我發現了一個完美的解決方案,就像之前版本的Firefox & GreaseMonkey。 首先,運行在必須設置爲最早的時刻,所以文檔的開始:

// @run-at  document-start 

因爲DOM很可能尚未加載,等待該文檔獲得的互動readyState的:

document.onreadystatechange = function() { 
    if (document.readyState === "interactive") { 
     // Do something 
    } 
} 

儘管Greasemonkey在文檔結束時實現的差不多,但我注意到上面的技術工作得更快。 使用此功能可以解決我在Firefox中彈出/跳轉屏幕時遇到的所有問題,當DOM更改啓動時,它會按照用戶腳本的指定直接加載頁面。

相關問題