這可以通過@run-at document-start
元規則完成。然後在構建文檔根之前執行該腳本。
下面的腳本會一直運行一段時間,直到存在document.documentElement
(<html>
)或document.head
(<head>
)。然後,它注入jQuery。
我已經證實,該代碼使用此小提琴工作:http://jsfiddle.net/VuJjT/show/(當Userscript不活躍,這表明undefined
2倍,否則,它顯示了function
2倍)。
// ==UserScript==
// @name jQuery before everything
// @namespace Rob W
// @description Inject jQuery as soon as possible, before start
// @include *
// @run-at document-start
// ==/UserScript==
var s = document.createElement('script');
s.onload = function() {
// Clean-up
this.parentNode.removeChild(this);
};
s.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js";
var poller = setInterval(function() {
var insertInto = document.head || document.documentElement;
if (insertInto) { // `<html>` or `<head>` exists
clearInterval(poller); // Clear poller
insertInto.appendChild(s); // Inject script.
};
}, 4); // Every 4 milliseconds. This interval may run a few times.
請注意,這並非萬無一失。早期的腳本節點可能會在此之前觸發。測試表明,即使[「零延遲」,計時器解決方法](http://ajaxian.com/archives/settimeout-delay)對於Firefox來說也不夠快。 – 2012-03-22 01:27:34
@BrockAdams'@ run-at document-start'使代碼在構建文檔之前執行。我多次測試了代碼+演示,沒有任何錯過(FF 11)。 – 2012-03-22 08:35:06
是的。但是,當文件被GM檢測到時和第一個doc腳本觸發時間之間的差距可能意味着GM注入對於第一個腳本或第二個腳本來說太晚了,這取決於文檔。我見過這個「野外」,這就是我提到它的原因。如果我覺得自己很活潑,我會安裝一個演示頁面(沒有承諾)。 – 2012-03-22 09:27:52