我以前問過similar question,但我從未明確表達過我的觀點,或者至少我認爲這是一個相關的問題,值得提出來看看是否有人可以提出一些有見地的想法。爲什麼jQuery.ready在如此慢的時候推薦?
當使用jQuery時,我們很多人使用jQuery.ready
函數在DOM加載時執行init
。它已經成爲使用jQuery將DOM操作程序添加到網頁的事實上的標準方式。存在相關事件natively某些瀏覽器,但jQuery在其他瀏覽器(如某些IE版本)中模擬它。例如:
<head>
<script>
var init = function() { alert('hello world'); };
$.ready(init);
</script>
現在,我們所有的測試都顯示這個事件可能會很慢。它並不像window.onload
那麼慢,但它仍然通常在執行前大約100毫秒的延遲。如果FF可以高達200-300毫秒,尤其是刷新。
這些都是一些非常重要的毫秒,因爲這是在進行任何DOM操作(例如隱藏下拉列表)之前初始佈局顯示的時間量。很多時候,佈局「閃爍」主要是由於使用緩慢的DOM就緒事件造成的,迫使程序員使用CSS來隱藏元素,並可能使其不易訪問。
現在,如果我們不是放在一個腳本標記的初始化函數關閉標記之前,它將被更快執行,一般在半個月的時間,但有時甚至更快:
<head>
<script>
var init = function() { alert('hello world'); };
</script>
</head>
<body>
<!-- some HTML -->
<script>init();</script>
</body>
一個簡單的測試頁面這證明了不同之處:http://jsbin.com/aqifon/10
我的意思是,我們並不是在談論使用有效的選擇器時,某些「優化警察」所倡導的幾乎不可察覺的差異。我們在討論一些在執行DOM操作onload時的主要延遲。在FF中嘗試這個例子,domready有時可能會慢100倍(300ms vs 2ms)。
現在對我的問題:爲什麼jQuery.ready
建議使用時,它顯然比其他替代方案慢得多?在關閉BODY與使用jQuery.ready
之前撥打init
有什麼缺點?使用domReady
可以說是更「安全」,但在什麼情況下比其他選擇更安全? (我正在考慮像document.write
和延期腳本之類的東西)我們在許多客戶站點上使用了近3年的BODY
方式,我們從未遇到過任何問題。它快了很多。
我也想知道,因爲jsPerf和優化選擇器每10000次執行幾毫秒有很多模糊之處,怎麼會沒有太多的這方面的討論呢?這基本上是用戶面臨的第一個延遲,並且在每個頁面加載時切片50-100毫秒似乎相當簡單...
是的,這個說法可以被貼上'方便'的標籤,這很公平。你可能可以在模板拼接結束時觸發jQuery.ready綁定,雖然... – David 2012-03-04 19:22:01