2013-08-31 38 views
0

DOMContentLoaded加載文檔並且其腳本運行後觸發,我想在執行腳本之前但在document.body.outerHTMLdocument.childNodes[document.childNodes.length-1].outerHTML)之後運行我的代碼,充滿javascript事件:當文檔被完全加載但腳本尚未運行時得到

我試試這個,但看起來它多次運行還發現之後,現在我做一個定時器執行mycode的前200毫秒的工作,但我想這樣做沒有計時器

var observer = new MutationObserver(function(mutations) 
{ 
    if(document.body && document.childNodes[document.childNodes.length-1].outerHTML.lastIndexOf("</html>")!=-1) 
    { 
     observer.disconnect(); 
     mycode(); 
    } 
}); 
observer.observe(document, {subtree: true, childList: true}); 

需要在Chrome中工作(因此beforescriptexecuted事件不會在這裏工作)

回答

0

你不能那樣做。腳本立即執行,所以它們在文檔完全加載之前運行。

+0

所以我應該堅持我的方法(代碼)上面張貼? (cuz DOMContentLoaded可能會在10多個secons中觸發,因爲腳本垃圾和代碼幾乎馬上就會觸發) – Owyn

+0

@Owyn:不,因爲您正在使用的腳本不會執行您所要求的操作。 'html'元素在加載完整文檔之前有一個結束標記,它從開始處獲得結束標記。 (元素是單個對象,不是起始和結束標記的單獨對象,所以當您獲取元素的OuterHTML時,您總會得到結束標記。)之後DOMContentLoaded事件觸發的原因是您當前的代碼觸發方式太早了。這也是它多次觸發的原因,即每次文檔從創建時開始更新。 – Guffa

+0

我看到,所以對於正常情況,我應該使用settimeout而不是ms,而對於firefox + noscript用戶(settimeout不適用於他們)在每個突變上運行(並檢查文檔是否有足夠的內容),但刪除 – Owyn

1

如果你想在你調用它的所有「文本」之後但在其他js之前運行某些東西,則需要在頁面的最底部運行所有js(即,btw,建議的最佳實踐)並運行任何你需要的東西,不要跑到第一個頂部......

請注意,js是高度併發的 - 這意味着很多東西是同時發生的,所以我建議你包裝你的第一個代碼運行在一個匿名函數和其他所有東西,所以它首先被執行。

您的document.ready也可以在anon f。

+0

這聽起來像個好主意,但我從userscript空間運行我的代碼, - 如何在JavaScript中觸發事件,以便我的用戶腳本會選擇它(掛鉤它)並從它自己的空間執行代碼(不是文檔之一) ? – Owyn

+0

如果你在jsfiddle中給出mi示例代碼,也許我可以給你一些額外的想法......一般來說,你應該在第一個時間內爲所需的方法擴展特定的用戶空間並運行你剛剛在病房後面創建的特定方法...... It在anon f完成後立即從全局範圍移除... – Rastko

+0

示例代碼,如下所示:http://jsfiddle.net/muPaS – Owyn

相關問題