JavaScript & jQuery 的應用(三):Initialization - The document ready handler

JavaScript & jQuery 的應用(三):Initialization - The document ready handler

在第一節的時候提到了關於Unobtrusive JavaScript,行為會和結構分離;為了達到這樣的目的,必需在DOM Element載入完成的時候再進行操作,例如:替buttion加上click事件。

在傳統的寫法,通常會使用window.onload

{    
    $("table tr:nth-child(even)").addClass("even");
    $(".delbtn").click(function(){alert(" are you sure?");});
} 

但window.onload有個缺點,他會在網頁所有內容全部載入之後才會執行。如果今天網頁內容包含了大量的圖片,可能會造成Unobtrusive JavaScript運作失敗;比較好的情況應該是DOM元件已經產生完畢之後,就能夠進行操作。

在jQuery提供了一個方式,一旦DOM樹產生完畢(但尚未載入外部圖片前)就觸發程式碼的執行。

{
    $("table tr:nth-child(even)").addClass("even");
    $(".delbtn").click(function(){alert(" are you sure?");});
}); 

//縮寫式
$(function()
{
	$("table tr:nth-child(even)").addClass("even");
	$(".delbtn").click(function(){alert(" are you sure?");});	
});

既然提到了初始化,在ASP.NET Ajax中也有提供類似的方法來處理同樣的事情,雖然行為類似,不過和jQuery卻不太相同。

第一個是pageLoad(),在引用了Ajax的UpdatePanel之後,pageLoad觸發的時間點,會在第一次及postbacks之後執行,也包含了asynchronous postbacks。

    // Initialization code here, meant to run once. 
    alert("pageLoad");
    $get("Button2").onclick = function(){alert("Button2 click");};
} 

另外一個是Sys.Application.add_init();相較於pageLoad(),asynchronous postbacks不會觸發該事件。

{ 
    // Initialization code here, meant to run once.
    alert("Sys.Application.add_init");
    $get("Button2").onclick = function(){alert("Button2 click");};
}); 

一般的情況下大力推薦jQuery,因為jQuery還有進行優化的動作,四個方法jQuery永遠都是最先執行的;但是要特別注意:如果UpdatePanel內含有需要控制的項目,就需要額外做處理,因為asynchronous postbacks 後會全部取消,這時候可以透過Sys.WebForms.PageRequestManager 再重新處理。(當然網頁內容不大的時候,直接使用pageLoad會省事很多)

註:在jQuery 1.3版的時候,有提供了新的方式可以處理這個問題,改用live()來取代原有的bind()操作方式。
UpdatePanel回傳之後事件仍然生效,但並不是所有的事件都可以透過這個函式處理,也有可能會產生其它的效能問題。

Possible event values: click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup
Currently not supported: blur, focus, mouseenter, mouseleave, change, submit

{
    alert("jQuery");
    $("#Button2").live("click", function(){alert("button click");});
}); 

執行順序:
jQuery > window.onload > Sys.Application.add_init > pageLoad

 

相關連結:

$(document).ready() and pageLoad() are not the same!
ASP.NET AJAX Client Life-Cycle Events  
jQuery live() and ASP.NET Ajax asynchronous postback  
jQuery Events/live 
jQuery.live()與Event Delegation

 

Dotblogs 的標籤:,,,