1. 程式人生 > >頁面載入過程中的三個事件

頁面載入過程中的三個事件

頁面在載入的時候會先後觸發兩個事件:document的DOMContentLoaded,以及window.onload事件.

DOMContentLoaded

MDN上的解釋是當初始的 HTML 文件被完全載入和解析完成之後,DOMContentLoaded 事件被觸發,而無需等待樣式表、影象和子框架的完成載入。IE9及其以上版本相容.
此時的document.readyState == ‘interactive’.

$(document).ready()
其實並不存在document.ready這樣的原生事件。在jQuery中,$(function(){})$(document).ready(function(){})

相同,都是用來表示文件載入完成,但是頁面的其他資源,例如<img>,<iframe>有可能未載入完成.
此時document.readyState == ‘interactive’ 或者是 ‘complete’
原生js實現 $(document).ready() 方法,其實就是監聽documnent.readyStateChange事件,檢視是否document.readyState == ‘complete’。參考

window.onlaod
此時HTML文件全部解析完成,依賴的所有資源都已經解析完成。
此時,document.readyState == ‘complete’


這個只讀屬性用來描述html文件當前的載入狀態.有效的值有:
loading:載入中
interactive:文件載入解析完畢,但是子資源可能還未載入完成.
complete:文件載入解析完畢,全部資源載入完成.

HTML 文件的解析和資源載入
瀏覽器對於html文件裡面的所有的資源(類似於<img><link><script><iframe>)都是並行載入。主執行緒不會等到一個資源載入完才開始載入下一個.它會同時開啟多個下載執行緒(可能是4-6後者N個,不同的瀏覽器並行下載數不一樣).而對於<script>來說就有些特殊,他的下載和執行都會阻塞主執行緒,也就是說當HTML文件的解析遇到<script>

時候,瀏覽器就不會繼續往下解析html 文件。後面的資源也不會開始下載。只有等到<script>載入執行完成後,主執行緒才會繼續往下解析html 文件。

這樣設計的考量是js檔案有可能會修改DOM樹,所以穩妥的做法是先暫停html文件的解析.在chrome 上,還有一種預解析的技術。就是在併發解析多個<script>標籤裡面的內容,如果發現某個<script>的內容不改變DOM樹,那麼主執行緒就會直接使用這個結果,否則就放棄,主執行緒自己再解析。

但是無論怎樣,<script> 都是按照在頁面中出現的順序來執行的。

ps:以下內容純屬胡說
對於<style><link>的載入和解析就完全是非同步的.因為除了主執行緒之外,每個頁面還有一個渲染執行緒.解析html文件生成DOM樹和渲染頁面完全是並行的。

如有紕漏,歡迎指出,反正我就是當筆記一樣給自己看的。

相關推薦

頁面載入過程事件

頁面在載入的時候會先後觸發兩個事件:document的DOMContentLoaded,以及window.onload事件. DOMContentLoaded MDN上的解釋是當初始的 HTML 文件被完全載入和解析完成之後,DOMContentLoaded

ajax用beforeSend自定義請求過程客戶端事件,提高用戶體驗

函數 fun 直接 alert 完成後 and success ram reat 本文為博主原創,未經允許不得轉載: 在應用ajax的過程中,當我們再前臺提交請求的時候,如果服務端響應事件比較長,就會導致需要等很長時間在前臺才能接受到服務端返回的 響應結果,往

js默認方法call,applay,bind

數據類型 div IV argument use 組類型 事件 實參 cti 這三個都是函數自帶的方法(Function.prototype),這三個方法都能夠改變函數內部 this的指向, call //call方法接收三個參數,第一個是this指向,第二個,三個

web頁面編寫過程的中文亂碼問題解決

中文亂碼的出現是由於編碼和解碼的方式不同,只要將二者修改為對應的方式就成。具體解釋如下: 在剛學習web開發的時候常遇見中文亂碼的問題,而且根據網上的教程時而能解決,時而不能,主要原因是很多初學者不知道中文系統的瀏覽器的預設解碼字符集是 GB2312,而我們的編輯器常採用的是 UTF-8的解碼方

專案實施最關鍵的干係人

做事抓關鍵,打蛇打七寸。專案實施中干係人眾多,有三個最關鍵。只要抓住最關鍵的三個人,專案即成功了80%。 1)業主方的拍板人(最高決策人)。 業主方的人員分三類:終端使用者、技術決策人、拍板人。除網際網路專案外,使用者的數量較少,終端使用者通常只是附屬的角色。技術決策人只負責技術層面,無法直

tracert時間的含義

 可以看到每一跳都有三個時間,三個時間都表示什麼呢? tracert 每一跳會發出三個TTL包(TTL(Time To Live )是IP協議包中的一個值,它告訴網路,資料包在網路中的時間是否太長而應被丟棄。),返回三個時間都是從上個節點到這個節點的時間,三個數

java特殊的類------String類、Object類、包裝類

1.String類 1.1 String類的兩種例項化方式 直接賦值 String str = "hello" 通過構造方法例項化String類 String str = new String("hello") 1.2 字串相等比較(內容) public bo

Oracle型別轉換函式的使用

Oracle中有三個型別轉換函式,分別是to_char()、to_date()以及to_number()函式 一、to_char()函式的用法 (1)轉化日期、時間 to_char(data,'格式') select to_char(sysdate,'yyyy-mm-dd hh2

List集合的區別

在List集合中,有三個重要的常用子類:Vector,ArrayList,LinkedList。 Vector:內部是陣列資料結構,執行緒安全。增刪,查詢都很慢。 ArrayList:內部是陣列資料結構,執行緒不安全,替代Vector,查詢速度快,增刪速度慢。如果需要使用多

提高Web端頁面載入速度的6方法

阿伯丁集團曾對使用者進行調查,結果顯示,網站頁面載入時間每延長1秒,就會減少11%的頁面瀏覽量,降低16%的客戶滿意度,降低7%的轉化率。亞馬遜也通過調查證實,網頁開啟的速度每提高100毫秒,能為網站增多1%的收益。類似的證實還有很多,網頁開啟的速度直接關係到網站的收益,已毋庸置疑。 這就是為什麼

軟體測試分類及測試主要概念

軟體測試分類: 按測試技術,軟體測試可分為:黑盒測試、白盒測試、灰盒測試 黑盒測試:在程式介面進行測試,它只是檢查程式功能是否按照規格說明書的規定正常使用。也被稱為功能測試或者資料驅動測試。 白盒測試:要完全瞭解程式結構和處理過程,它按照程式內部邏輯測試程式,檢驗程式中每條

關於AsyncTask引數的理解

public abstract class AsyncTask<Params, Progress, Result> { 在使用AsyncTask時,要指定這三個泛型引數,三種泛型型別分

js事件繫結之間的關係和事件處理函式裡的this值

<!DOCTYPE HTML> <html > <head>     <meta charset="UTF-8"> </head> <body> <div id="b" onclick="cons

調取儲存過程方法,以及用mybatis呼叫儲存過程

調取儲存過程的三個方法: 1.如果是PL/SQL命令視窗就用execute(簡寫:exec )儲存過程名,舉個例子: EXEC procedure;--procedure是儲存過程名 2.如果是PL/SQL視窗就用 begin  儲存過程名  end; begi

多執行緒程式設計特性

多執行緒程式設計要確保併發程式正確地執行,必須要保證原子性、可見性以及有序性,缺一不可,不然就可能導致結果執行不正確。 1.原子性 即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 一個很經典的例子就是銀行賬戶轉賬問

WEB頁面載入過程

頁面載入過程 資源載入過程 URL解析->DNS查詢->資源請求->瀏覽器解析 1 URL結構 http://www.happymmall.com:80/get_data.do?productId=1#title 協議 域名+埠 路徑 引數 雜湊

jsp頁面select框值或事件操作方式

1.jsp頁面迴圈遍歷後臺傳過來的值      <div class="search_txt pull-left">所屬產品:</div>      <div class="search_input pull-left">    

頁面傳遞過程的編碼解碼

public class EncodeEscape {        private final static String[] hex = { "00", "01", "02", "03", "04"

inflate引數的含義

inflate三個引數如下: public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) 第一個引數是指定要加入父佈局的佈局檔案

java數值大小比較

在我們初學者學習過程中,都會有遇到要求編寫三個數值大小比較的程式碼 今天,在這裡我分享兩種方法去編寫這個問題。 1、if語句 if(a>b){if(a>c){System.out.println("三個數中的最大值為"+a);}else{System.out.p