2009-09-04 55 views
2

我正在開發一個使用Web技術開發桌面應用程序的平臺。在這樣做的過程中,我一直在努力獲得一些與瀏覽器配合使用的文檔/準備就緒功能,我將集成到該平臺中。這就是爲什麼我以前在SO上問過這個問題:javascript-framework-that-primarily-provides-just-document-onready-functionality正在檢查DOM矯枉過正的準備情況?

然而,我沒有能夠讓我的瀏覽器選擇(噓,它的祕密;)成功地利用了一個建議的功能和只回答上述問題。所以,在試圖弄清楚可能會發生什麼的過程中,我偶然發現了以下情況。

下面的代碼在這個瀏覽器中具有相同的效果我簡單地通過在1毫秒超時後執行函數來使用:我可以在加載大圖時寫入DOM。這對我來說可能不是最終的解決方案,我可以寫一些具體的東西來說明這個瀏覽器的Javascript引擎如何實現DOM功能。不過,我決定看看它是否可以在標準瀏覽器中正常工作,而且讓我驚訝的是,它確實如此!鑑於此,我的問題是:各種Javascript框架提供的dom/readyiness功能的各種實現,只是矯枉過正?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>Untitled Document</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<script> 
setTimeout(function() { 
    var txtNode = document.createTextNode("ready_yet?"); 
    var ready_yet_el = document.getElementById("ready_yet"); 
    ready_yet_el.appendChild(txtNode); 
},1); 
</script> 
</head> 

<body> 
<div id="ready_yet"></div> 
<img src="http://www.ryanmorr.com/tests/ondomready/pic.jpg" /> 
</body> 

</html> 

編輯/再思考 在the page linked to by the answer to my previous related question它指出:「對於Firefox和Opera的事件類型的簡單檢查將確定它是否是DOMContentLoaded。Safari和IE將檢查對文檔的準備狀態....終於在如果一切都失敗了,onload事件會引起後面的情況。「或許一個類似於我的setTimeout的setInterval可能是倒數第二的行爲,在依靠onload作爲最後的手段之前?無論如何,在我選擇的嵌入式瀏覽器中,DOMContentLoaded事件和document.readyState都不受支持。

+0

你的例子的工作原理是因爲(你可能知道)在div被解析之後調用超時函數,一個更簡單的版本會在div關閉後運行(沒有超時)腳本,而不是規範,但所有瀏覽器在繼續解析xml/html節點(或者至少在下一個dom元素被完全讀取和執行之前可用)之前將使dom節點可用。 – meandmycode 2009-09-04 20:58:37

+3

我認爲你在前3個小時中得到的答案只能讀取問題的標題。他們都說「不,在DOM準備好之前運行腳本是不好的」。 – 2009-09-05 00:26:30

+0

我希望得到更嚴厲的處理;)但是爲了得到我的直覺的確認,即使提到其他人已經「毆打我」,這正是我所尋找的,並且讓我繼續下去這條路有一定的信心;接下來我會看看CSS選擇框架(如Peppy或Sizzle)是否可以與這個特定的瀏覽器實現協同工作。 – 2009-09-05 07:06:34

回答

3

你的預感是好的,以及IMO成立。但是someone has beat you to the punch already。簡短的回答是,setTimeout檢測在所有情況下DOM準備工作落實。這可能是確定爲您所關注的瀏覽器,但IE瀏覽器在某些情況下會失敗。

它可能感興趣你知道,微軟自己的ASP.NET AJAX框架使用setTimeout伎倆來檢測DOM準備。驚喜:it fails in certain use cases as well

簡而言之,問題似乎在於緩慢加載腳本的IE,無論是由於大文件大小(例如〜500K)或網絡/服務器延遲。

3

沒有,因爲當DOM「還未準備」錯誤的清單,他們在極其不尋常,很難做到預測和跟蹤的方式 - 每一個(當然)獨有的,它發生在瀏覽器

這是多少更容易完全避免這些問題,並知道你總是要處理一個準備好的DOM。作爲一個例子,前一段時間我在每個人最喜歡的瀏覽器中都有一個DOM沒有準備好的錯誤,而不是99%的時間都完美地工作,但是如果頁面內容有一個帶有src屬性的img元素它,如果內容也有一個ul元素與任何數量的裏面在...它沒有錯誤,如果任何這些事情是不正確的。

對我來說,現在很容易說'哦,這是一個DOM問題',但在當時......不,並不那麼容易。

0

簡單地說,沒有。有些人連接速度較慢,需要加載多個文件,他們不會欣賞他們的瀏覽器嘗試在尚不存在的元素上運行腳本。

相關問題