[英]When does $(document).ready() fire?
這個問題的評論讓我想到了什么。 什么時候$(document).ready()
函數才會觸發? 顯而易見的答案是“當文件准備就緒時”,但究竟是什么時候?
例如, 如果我在PHP繼續執行時打開輸出緩沖並刷新輸出 ,那么不會將輸出發送到瀏覽器嗎? 那么,在PHP腳本執行完畢之前,文檔是否可以准備就緒,或者事件是否等到請求完成之后?
編輯:
響應似乎基本上同意當客戶認為它准備就緒時事件會發生。
為了更好地理解(我本來應該首先做的),我只是設置了一個測試:
<?php ob_start(); ?>
<html>
<head>
<script type="text/javascript" src="lib/js/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
alert("READY");
});
</script>
</head>
<body>
<?php
ob_flush();
for ($i=0; $i<999999; $i++) {
echo "HELLO$i\n";
ob_flush();
}
?>
</body>
</html>
結果是在這個例子中,內容立即開始在頁面上顯示,但是在循環完成之前警報沒有發生,或者腳本超時(30秒)。
為了取決於您使用的瀏覽器,我嘗試在我的循環中插入:
if ($i == 99) {
echo "</body></html>";
}
Chrome似乎通過將這些標簽放在頁面的末尾來自動糾正它(如Web開發檢查器中所示)。 查看頁面的來源顯示它在中間,我在那里回應它。
只要jQuery確定DOM可訪問,jQuery就會觸發文檔的ready
事件。 確切的機制取決於瀏覽器。
看一下相關的源代碼 。
首先,檢查是否在嘗試將偵聽器綁定到事件時可以訪問DOM。 如果是,則調度回調被立即觸發 - 盡管它們實際上並未立即觸發 ,以允許已占用當前執行槽的代碼在需要時取消處理程序。
如果DOM尚不可訪問,則嘗試將事件偵聽器綁定到瀏覽器的本機DOMContentLoaded
事件 - 這是要求瀏覽器在DOM可用時通知您的“正確”本機方式,但它是相對現代的特征。 如果這是不可能的(這幾乎可以肯定地表明您的代碼在舊版本的IE中運行),代碼可以回溯到幾種機制:
onreadystatechange
事件。 這不是DOMContentLoaded
會比DOMContentLoaded
更晚,但它非常好。 window
對象的load
事件。 這通常比DOM可用時間晚得多,但確保事件最終會終止,這是最后的失敗保障。 從PHP的角度來看, 可能 (但不太可能)在PHP腳本完成執行之前發生這種情況。 有些情況(例如長輪詢)會在腳本完成之前觸發事件,但這只會發生在舊版瀏覽器中。 但是,在這些情況下,您根本不會(不應該)使用這些事件,您只需將相應的<script>
元素放在頁面正文中,以便在加載后立即執行它們,而不是等待DOM的其余部分。
就個人而言,由於這個原因,我從不或多或少地使用任何這些負載驅動的事件。 因人而異。
例如,如果我在PHP繼續執行時打開輸出緩沖並刷新輸出,那么不會將輸出發送到瀏覽器嗎?
是的,它會發送輸出,但這並不意味着瀏覽器認為服務器已經完成。 我知道它不是PHP,但我喜歡Perl文章遭受緩沖 。 當UserAgent認為它已准備就緒時,該文檔已准備就緒。 但是,瀏覽器將保持套接字打開,同時它仍然認為它正在接收數據並且沒有發送END信號。
那么,在PHP腳本執行完畢之前,文檔是否可以准備就緒,或者事件是否等到請求完成之后?
通常,瀏覽器將一直等到服務器完成數據發送。 如果你正在刷新輸出,那么當腳本仍在運行時,Web服務器可能會超時,例如,我認為Apache默認為2分鍾。 如果服務器發送結束信號,則文檔已完成,您的瀏覽器可能會准備DOM並觸發DOMReady事件,即使您的腳本仍在服務器上運行。
與其他一些評論相反, </body>
和</html>
不是DOM准備就緒的好指標,主要是因為頁面可能格式錯誤(有錯誤拼寫或不包括那些結束標記)。 在這些情況下,瀏覽器仍將在Quirksmode中呈現並觸發DOMReady。
根據jQuery站點, $( document ).ready()
只會在頁面文檔對象模型(DOM)准備好執行JavaScript代碼時運行。
參考: http : //learn.jquery.com/using-jquery-core/document-ready/
它在DOM層次結構完全構建之后觸發,並且不再需要執行PHP代碼(因為PHP代碼在頁面發送之前執行)。
這意味着一旦客戶端收到頁面就會執行它。 其他事情可能會在之后加載,例如圖像,CSS和其他Javascript。
DOM完成加載后會觸發Document.ready()
。 當所有HTML都存在時,將激活DOM ready
事件。
PHP 不會干擾 DOM ready
因為PHP是服務器端編碼語言。 它將從服務器進行處理,服務器發送請求的頁面,然后您的broswer加載頁面並激活DOM ready
事件。
DOM ready
和window load
之間的區別在於load將等到每個 image / css都被加載。 標記存在於HTML中,但圖像未顯示。
基本上,我們可以說當瀏覽器讀取HTML結束標記( </html>
)時會觸發DOM就緒
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.