onload事件屬性,JQ中的load,ready方法
前言
頁面中的很多操作,需要我們在所需資源下載完成后,才可以進行操作,而資源沒有及時下載,我們進行操作的話,是會報錯。因此我們需要熟練掌握哪些事件可以幫助我們在資源准備就緒后,再開始進行相關的操作。接下來我們就原生JS的事件屬性onload,JQ中的load,ready方法進行一些討論。
onload
HTML onload事件屬性,常用在<body>中,一旦完全加載所有內容(包括圖像,腳本文件,CSS文件等),就執行一段腳本。
以下內容是參考了《鋒利的Jquery》一書,感興趣的朋友也可以去原書了解.
window.onload的執行時機:必須等待網友中所有的內容加載完畢后(包括圖片)才能執行。
編寫個數: 不能同時編寫多個
1 window.onload = function() { 2 alert(" test1 "); 3 }; 4 window.onload = function() { 5 alert(" test2 "); 6 };
結果只會輸出“test2”。
特別注意: 像onload事件之類的使用匿名函數,即window.onload = function() { fnc(); //這里執行函數};這種形式的才是在頁面加載完成后執行。
另外使用DOM0級的方式是可以編寫多個的。例如:
<body onload="a();b()"> // 代碼 </body>
不推薦這么寫吧。
onload事件屬性存在用戶體驗的問題,如果當需要下載的資源很大時,需要用戶等待很長的時間。
JQ的ready()方法
通過這個方法,可以在DOM載入就緒能夠讀取並操縱時立即調用你所綁定的函數,可以極大地提高web應用程序的響應速度。
$(document).ready()執行的時機:網頁中所有DOM結構繪制完畢后就執行,可能DOM元素關聯的東西並沒有加載完.
編寫個數:能同時編寫多個,比如:
$(document).ready(function() { alert("Hello world"); }); $(document).ready(function() { alert("Hello world"); });
結果兩次都輸出。同一個頁面可以無限次使用$(document).ready()事件,其中注冊的函數會按照(代碼中的)先后順序依次執行
簡寫方式:
$(function() { //代碼 });
更詳細的介紹,可以看《鋒利的Jquery》一書,第四章4.1.1
JQ中的load()方法
但是比如我們需要對圖片進行剪切,縮放操作時,需要網頁所有的內容加載完畢后才執行的話,可以使用$(window).load()方法,這個方法會等到頁面所有內容加載完畢后才會觸發,並且同時沒有onload事件屬性的缺點。
$(window).load(function() { alert("test1"); }); $(window).load(function() { alert("test2"); });
代碼會在頁面所有內容加載完成后按照先后順序執行。
《鋒利的Jquery》中4.1.1中的描述如下:
另外需要注意一點,由於在$(document).ready()方法內注冊的事件,只要DOM就緒就會被執行,因此可能此時元素的關聯文件未下載完。例如與圖片有關的HTML下載完畢,並且已經解析為DOM樹了,但很可能圖片還未加載完畢,所有例如圖片的高度和寬度這樣的屬性此時不一定有效。要解決這個問題,可以使用jQuery中另一個頁面加載的方法--load()方法。load()方法會在元素的onload事件中綁定一個處理函數。如果處理函數綁定給window對象,則會在所有內容(包括窗口,框架,對象和圖像等)加載完畢后觸發,如果處理函數綁定在元素上,則會在元素的內容加載完畢后觸發。
補充說明下,JQ中有兩個load()方法,一個是JQuery事件load()方法,一個是JQuery Ajax load()方法.
具體調用哪個函數,根據參數而定。
JQuery事件load()方法:
$("img").load(function() { $("div").text("圖像已加載"); });
在圖像加載完成后,輸出“圖像已加載”;
JQuery Ajax load()方法:
load() 方法通過 AJAX 請求從服務器加載數據,並把返回的數據放置到指定的元素中。
$("button").click(function() { $("div").load("demo_ajax_load.txt"); });
通過AJAX請求來改變div元素的文本。