2013-06-03 7 views
1

以下注入在Chrome中完美運行,但是在最新的Firefox(版本21)中,文檔始終保持「連接...」狀態,甚至連其元素像<img>加載。 (但如果你點擊重新加載他們,他們表現出了罰款...)注入來自Greasemonkey腳本的document.write調用不會導致任何事情加載

截圖:
Screenshot of problem

腳本:

// ==UserScript== 
// @name   Test 
// @namespace  Test 
// @author   Owyn 
// @match   http://* 
// ==/UserScript== 

function inject(func) { 
    var source = func.toString(); 
    var script = document.createElement('script'); 
    script.innerHTML = "("+ source +")()"; 
    document.body.appendChild(script); 
} 

function myf() { 
    document.write('<html>TEST</html>'); 
} 

inject(myf); 

任何修復,任何變通辦法?我應該聯繫Mozilla瞭解錯誤嗎?

P.S. - 我使用document.write去除了所有事件監聽器(我不知道),但沒有找到替代方案。

回答

4

最聰明/最好(est)要做的是避免document.write()使用DOM技術。下面是一個完整的腳本

// ==UserScript== 
// @name  _Replace a target page using DOM techniques 
// @include http://YOUR_SERVER.COM/YOUR_PATH/* 
// @grant GM_addStyle 
// ==/UserScript== 
/*- The @grant directive is needed to work around a design change 
    introduced in GM 1.0. It restores the sandbox. 
*/ 
var D  = document; 
var newDoc = D.implementation.createHTMLDocument (""); 

D.replaceChild (
    D.importNode (newDoc.documentElement, true), 
    D.documentElement 
); 

D.body.innerHTML = '<h1>TEST</h1>' 



Greasemonkey的正常觸發上DOMContentLoaded當頁面完全加載完畢。默認情況下,Chrome比此更晚觸發。

無論如何,在DOMContentLoaded,在Firefox;當您清除當前文檔時,某些事情變得孤立。因此,「悸動者」永遠不會停止,其他一些清理工作可能會被忽略。

這可能是一個錯誤,但不應該使用document.write()。此外,根據the DOC,您應該撥打電話document.close()

一個骯髒的解決方法是等到頁面加載之前觸發。因此,而不是直接調用inject(myf);,這樣稱呼它:

function myf() { 
    document.write ('<html>TEST</html>'); 
    document.close(); 
} 

window.addEventListener ("load", function() { inject(myf); }, false); 


但使用DOM方法,而不是!它們會更快,並且不會觸發邊緣案例錯誤和安全違規。

+0

事件負載似乎可以解決它,但現在它等待一切可能會浪費很長時間,所以沒有辦法像Chrome一樣修復它的工作方式嗎? (頁面剛剛打開,document.write立即運行而沒有凍結連接...) – Owyn

+0

是的,使用DOM方法。這在兩個瀏覽器中都有效,並且不需要等待'load'事件。 –

+0

什麼DOM方法? FireFox中的DOMContentLoaded破壞頁面以無限加載並破壞圖像? – Owyn

相關問題