2010-01-03 50 views
8

我知道,在jQuery中,我們被告知要使用$(document).ready()以確保DOM元素已準備好進行交互。我知道,如果腳本標籤位於<head>中,這肯定適用。如果它們在<body>的末尾,在所有DOM元素之後,我是否仍然使用DOM準備功能?如果我沒有瀏覽器,我的代碼會失敗嗎?如果我的腳本位於主體的末尾,我應該使用DOM就緒函數嗎?

謝謝!

回答

13

有一件事你不能在</body>之前的<script>塊中做:將DOM內容附加到主體。這是相對於解析的追加問題,它導致IE與可怕的「操作中止」相適應。

所以,如果你有腳本或插件可以做到這一點,你不能在body元素的尾部調用它們。否則繼續。

它不會在最新的Mozilla,Opera或WebKit瀏覽器上爲您提供任何內容,因爲無論如何這些瀏覽器都會觸發ready。它將避免在IE中出現令人不快的但基本無害的黑客循環,並且對於其他(較老的或更隱蔽的)瀏覽器而言,它會很快啓動,否則這些瀏覽器會退回到等待onload

+1

+1擊敗我,所有偉大的點! – 2010-01-03 04:08:00

+0

很高興知道 - 謝謝! – Matchu 2010-01-03 04:14:37

+3

不,IE允許處理'

0

DOM就緒函數確保整個DOM實際上已經創建,以便可以到達文檔中的所有元素。正常的window.onload只有在加載所有圖像時加載,而jQuery的事件一旦文檔結構存在就會觸發。如果您需要在文檔加載時發生「正確的事情」,則除了$(document).ready()之外,沒有理由使用任何內容。

+0

所以我的問題是,我的腳本執行時足夠加載文件? – Matchu 2010-01-03 03:58:05

0

我從來沒有遇到過瀏覽器無法訪問出現在我的腳本之前的html元素的DOM。這就是說,如果你已經在使用jQuery,那麼我可能會使用ready()方法,只是爲了讓習慣jQuery的其他人更容易理解代碼。

是否有某些原因讓你想避免這種情況?

(如果你正在尋找一種方法來避免加載了jQuery,然後,嗯,是啊,以我的經驗,你可以隨時訪問腳本之前出現的元素的DOM)。

+0

我已經在使用jQuery進行一般的DOM訪問,但我的腳本的組織方式是,爲了正確地模塊化某些DOM準備好的動作,它們最終在代碼的不同部分。如果我可以刪除$(function(){}),它看起來更乾淨,但我不願意這樣做,直到我確信刪除它不會損害任何東西。 – Matchu 2010-01-03 03:59:38

1

還有另外一個理由將腳本放在最後:瀏覽器做而不是並行加載JS文件,因爲它們可能會影響到後面的所有內容。事實上,一切都停止在瀏覽器中,直到JS文件被下載並解析 - 文本,圖像,所有東西。所以除非你的不得不儘早加載它們,否則在頁面結尾加載你的JS。

+3

實際上大多數現代瀏覽器都可以並行加載腳本 - 請參閱http://www.browserscope.org/?v=top&category=network上的圖表 但是,並行加載並不能解決您提到的其他問題,即瀏覽器停止分析和渲染,直到腳本加載並執行,因此將腳本放在底部仍然是合理的建議。 – Annie 2010-01-03 04:08:39

+0

@安妮:感謝您的鏈接。我沒有意識到他們已經修復了FF 3.5和MSIE 8中的並行腳本下載問題。有趣的是,他們都將並行地下載腳本/腳本和腳本/樣式表,但不是腳本/圖像。任何想法爲什麼這可能是? – 2010-01-03 06:43:07

相關問題