簡體   English   中英

$(document).ready()什么時候開火?

[英]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可用時間晚得多,但確保事件最終會終止,這是最后的失敗保障。
  • 最糟糕的情況:繼續輪詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM