簡體   English   中英

如何在顯示頁面內容之前運行greasemonkey腳本?

[英]how to run greasemonkey script before the page content is displayed?

我正在為Firefox編寫一個插件並使用greasemonkey腳本來執行此操作(我使用此工具http://arantius.com/misc/greasemonkey/script-compiler編譯用戶腳本)。

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

編輯:這篇文章是在Greasemonkey中實現@run-at鍵之前創建的 - 正如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按照@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);
    }

};

如果你更確定內容將在文檔准備就緒,我認為這樣的事情會更優選:

function greasemonkey() {

    if (
        document.readyState != "interactive"
        && document.readyState != "complete"
    ) {
        return;
    }

    // ...

    clearInterval(greasemonkeyInterval);

}

除了之前的答案,我發現了一個完美無瑕的解決方案,就像之前版本的Firefox和GreaseMonkey一樣。 首先,run-at必須設置為最早的時刻,因此文檔啟動:

// @run-at      document-start

因為DOM可能尚未加載,所以請等待文檔獲取interactiveState的readyState:

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

雖然Greasemonkey與document-end的實現方式大致相同,但我注意到上面的技術工作得更快。 使用此功能解決了我在Firefox中遇到的所有問題,當DOM更改啟動時,頁面上有閃爍/跳轉屏幕,並按照用戶腳本的意圖直接加載頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM