JQuery中DOM載入與事件執行執行個體分析

來源:互聯網
上載者:User

JQuery中DOM載入與事件執行執行個體分析

 JavaScript和HTML之間的互動是通過使用者和瀏覽器操作頁面時引發的事件來處理的。當文檔或者它的某些元素髮生某些變化或操作時,瀏覽器會自動產生一個事件。例如當瀏覽器裝載完一個文檔後,會建置事件:當使用者單擊某個按鈕時,也會建置事件。雖然利用傳統的JavaScript事件能完成這些互動,但jQuery增加並擴充了基本的事件處理機制。jQuery不僅提供了更加優雅的事件處理文法,而且極大地增強了事件處理能力。

以瀏覽器裝載文檔為例,在頁面載入完畢後,瀏覽器會通過JavaScript為DOM元素添加事件。在常規的JavaScript代碼中,通常使用window.onload方法,而在jQuery中,使用的是$(document).ready()方法。$(document).ready()方法是事件模組中最重要的一個函數,可以極大地提高Web應用程式的響應速度。jQuery就是用$(document).ready()方法來代替傳統JavaScript的window.onload方法的。通過使用該方法,可以在DOM載入就緒時就對其進行操縱並調用執行它所綁定的函數。在使用過程中,需要注意$(document).ready()方法和window.onload方法之間的細微區別。

執行時機

$(document).ready()方法和window.onload方法有相似的功能,但是在執行時機方面是有區別的。window.onload方法是在網頁中所有的元素(包括元素的所有關聯檔案)完全載入到瀏覽器後才執行,即JavaScript此時才可以訪問網頁中的任何元素。而通過jQuery中的$(document).ready()方法註冊的事件處理常式,在DOM完全就緒時就可以被調用。此時,網頁的所有元素對jQuery而言都是可以訪問的,但是,這並不意味著這些元素關聯的檔案都已經下載完畢。

舉一個例子,有一個大型的圖庫網站,為網頁中所有圖片添加某些行為,例如單擊圖片後讓它隱藏或顯示。如果使用window.onload方法來處理,那麼使用者必須等劍每一幅圖片都載入完畢後,才可以進行操作。如果使用jQuery中的$(document).ready()方法來進行設定,只要DOM就緒就可以操作了,不需要等待所有圖片下載完畢。很顯然,把網頁解析為DOM樹的速度比把頁面中的所有關聯檔案載入完畢的速度快很多。

另外,需要注意一點,由於在$(document).ready()方法內註冊的事件,只要DOM就緒就會被執行,因此可能此時元素的關聯檔案末下載完。例如與圖片有關的HTML下載完畢,並且已經解析為DOM樹了,但很有可能圖片還未載入完畢,所以例片的高度和寬度這樣的屬性此時不一定有效。要解決這個問題,可以使用jQuery中另一個關於頁面載入的方法——load()方法。load()方法會在元素的onload事件中綁定一個處理函數。如果處理函數綁定給window對象,則會在所有內容(包括視窗、架構、對象和映像等)載入完畢後觸發,如果處理函數綁定在元素上,則會在元素的內容載入完畢後觸發。jQuery代碼如下:

1

2

3

$(window).load(function(){

// 編寫代碼

})

等價於JavaScript中的以下代碼:

1

2

3

window.onload = function(){

// 編寫代碼

})

現在詳細講解下windows.onload方法和$(document).ready()方法的區別:

假設網頁中有兩個函數,JavaScript代碼如下:

1

2

3

4

5

6

function one(){

alert("one");

}

function two(){

alert ("two");

}

當網頁載入完畢後,通過如下JavaScript代碼來分別調用one函數和two函數:

1

2

window.onload = one;

window.onload = two;

然而當運行代碼後,發現只彈出字串“two”對話方塊。字串“one”對話方塊不能被彈出的原因是JavaScript的onload事件一次只能儲存對一個函數的引用,它會自動用後面的函數覆蓋前面的函數,因此不能在現有的行為上添加新的行為。

為了達到兩個函數順序觸發的效果,只能再建立一個新的JavaScript方法來實現,Javascript代碼如下:

1

2

3

4

window.onload = function(){

one();

two();

}

雖然這樣編寫代碼能解決某些問題,但還是不能滿足某些需求,例如有多個JavaScript檔案,每個檔案都需要用到window.onload方法,這種情況下用上面提到的方法編寫代碼會非常麻煩。而jQuery的$(document).ready()方法能夠很好地處理這些情況,每次調用$(document).ready()方法都會在現有的行為上追加新的行為,這些行為函數會根據註冊的順序依次執行。例如如下jQuery代碼:

1

2

3

4

5

6

7

8

9

10

11

12

function one(){

alert("one");

}

function two(){

alert("two");

}

$(document).ready(function(){

one();

})

$(document).ready(function(){

two();

});

運行代碼後,會先彈出字串“one”對話方塊,然後彈出字串“two”對話方塊。

下面看看ready()與onload()的耗時:

jQuery的ready()耗時 : 498 ms

簡寫方式

上面我們ready函數寫成這樣:

1

2

3

$(document).ready(function(){

// 編寫代碼

})

也可以簡寫成這樣:

1

2

3

$(function(){

// 編寫代碼

})

另外,$(document)也可以簡寫為$()。當$()不帶參數時,預設參數就是“document”,因此可以簡寫為:

1

2

3

$().ready(function(){

// 編寫代碼

})

3種方式都是一樣的功能,讀者可以根據自己的喜好,選擇其中的一種。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.