文章出處

 

HTML事件處理程序

<input type="button" value="Click Me" onclick"showMessage()"/>


通過HTML指定事件處理程序的的缺點是HTML與JavaScript代碼緊密耦合。如果要更換事件處理程序,就要改動兩個地方:HTML代碼和JavaScript代碼。

DOM0級事件處理程序

var btn=document.getElementById("myBtn");
btn.onclick=function(){
alert("Clicked");
}

在此,我們通過文檔對象取得了一個按鍵的引用,然后為它指定了OnClink事件處理程序。但要注意,在這些代碼運行以前不會指定事件處理程序,因此如果這些代碼在頁面中位于
按鍵后面,就有可能在一段時間內怎么單擊都沒有反應。
使用DOM0級方法指定的事件處理程序被認為是元素的方法。因此,這時候的事件處理程序是在元素的作用域中運行;換句話說,程序中的this引用當前元素。來看一個例子:

var btn=document.getElementById("myBtn");
btn.onclick=function(){
alert(this.id); //"myBtn"
}

也可以刪除DOM0級方法指定的事件處理程序,只要像下面這樣將事件處理程序屬性的值設置為Null即可:

btn.onclick=null;

DOM2級事件處理程序

"DOM2級事件"定義了兩個方法,用于處理指定和刪除事件處理程序的操作:addEventListener()和removeEventListener();
使用DOM2級方法添加事件處理程序的主要好處是可以添加多個事件處理程序。

var btn=document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(this.id);
},false);

btn.addEventListener("click",function(){
alert("hello world!");
},false);

這里為按鈕添加了兩個事件處理程序。這兩個事件處理程序會按照添加它們的順序觸發。
通過addEventListener()添加的事件處理程序只能使用removeEventListener()來移除;移除時傳入的參數與添加處理程序時使用的參數相同。這也意味著通過addEventListener()
添加的匿名函數無法移除,如下面所示:

var btn=document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(this.id);
},false);

btn.removeEventListener("click",function(){ //無效
alert(this.id);
},false);

有效的:

var btn=document.getElementById("myBtn");
var handler=function(){
alert(this.id);
}
btn.addEventListener("click",handler,false);

btn.removeEventListener("click",handler,false); //有效

IE事件處理程序

IE實現了與DOM中類似的兩個方法:attachEvent()和detachEvent()。

事件對象

兼容DOM的瀏覽器會將一個event對象傳入到事件處理程序中。無論指定事件處理程序使用什么方法(DOM0級或DOM2級),都會傳入event對象。來看下面的例子:

var btn=document.getElementById("myBtn");

btn.onclick=function(event){
alert(event.type); //"click"
};

btn.addEventListener("click",function(event){
alert(event.type); //"click"
},false);

在需要通過一個函數處理多個事件時,可以使用type屬性,例如:

var btn=document.getElementById("myBtn");
var handler=function(event){
switch(event.type){
case "click":
alert("Clicked");break;
case "mouseover":
alert("mouseover");break;
case "mouseout":
alert("mouseout");break;
}
}
btn.onclick=handler;
btn.onmouseover=handler;
btn.onmouseout=handler;

要阻止特定事件的默認行為,可以使用preventDefault()方法。

var link=document.getElementById("myLink");
link.onclick=function(event){
event.preventDefault();
}


只有cancelable屬性設置為true的事件,才可以使用preventDefault()來取消默認行為。

事件類型

只要用戶從一個頁面切換到另一個頁面,就會發生unload事件 。
只有在同一個元素上相繼觸發mousedown事件和mouseup事件,才會觸發click事件。
DOM的button屬性可能有如下3個值:0表示主鼠標按鈕,1表示中間的鼠標按鈕(滾輪),2表示次鼠標按鈕
keydown:當用戶按下鍵盤上的做任意鍵時觸發,而且如果按住不放的話,會重復觸發些事件。

事件委托

對“事件處理程序過多”問題的解決方案就是事件委托。事件委托利用了事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。例如,click事件會一直冒泡到
document層次。也就是說,我們可以為整個頁面指定一個onclick事件處理程序,而不必給每個可單擊的元素分別添加事件處理程序。以下面的代碼為例:

<ul id="myLinks">
<li id="goSomewhere">Go somewhere</li>
<li id="doSomething">Do something</li>
<li id="sayHi">Say Hi </li>
</ul>
var list=document.getElementById("myLinks");

EventUtil.addHandler(list,"click",function(event){
event=EventUtil.getEvent(event);
var target=EventUtil.getTarget(event);

switch(target.id){
case "doSomething":
document.tile="i changed the document's title";break;
case "goSomewhere":
location.href="http://www.wrox.com";break;
case "sayHi":
alert("hi");break;
}
}

最適合采用事件委托技術的事件包括click,mousedown,mouseup,keydown,keyup,keypress.


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()