【javascript】事件處理程序

事件處理程序

  • 事件就是用戶或瀏覽器自身執(zhí)行的某種動作,而響應(yīng)某個事件的函數(shù)就叫做事件處理程序。

1、HTML 事件處理程序

  • 某個元素支持的每種事件,都可以使用一個與相應(yīng)事件處理程序同名的HTML 特性來指定。
<script type="text/javascript">
    function showMessage(){
        alert("Hello world!");
    }
</script>
<input type="button" value="Click Me" onclick="showMessage()" />
<!-- 輸出 "click" -->
<input type="button" value="Click Me" onclick="alert(event.type)">
<!-- 輸出 "Click Me" -->
<input type="button" value="Click Me" onclick="alert(this.value)">
  • 通過HTML 指定事件處理程序的最后一個缺點是HTML 與JavaScript 代碼緊密耦合。

2、DOM0 級事件處理程序

  • 通過JavaScript 指定事件處理程序的傳統(tǒng)方式,就是將一個函數(shù)賦值給一個事件處理程序?qū)傩浴?/li>
  • 每個元素(包括window和document)都有自己的事件處理程序?qū)傩裕@些屬性通常全部小寫。
var btn = document.getElementById("myBtn");
btn.onclick = function(){
    alert("Clicked");
};
  • 使用DOM0 級方法指定的事件處理程序被認(rèn)為是元素的方法,程序中的this引用當(dāng)前元素。
var btn = document.getElementById("myBtn");
btn.onclick = function(){
    alert(this.id); //"myBtn"
};
  • 刪除通過DOM0級方法指定的事件處理程序,可以將事件處理程序?qū)傩缘闹翟O(shè)置為null
btn.onclick = null; //刪除事件處理程序

3、DOM2 級事件處理程序

  • “DOM2級事件”定義了兩個方法,用于處理指定和刪除事件處理程序的操作:addEventListener()removeEventListener()
  • 所有DOM節(jié)點中都包含這兩個方法,并且它們都接受3個參數(shù):要處理的事件名、作為事件處理程序的函數(shù)一個布爾值。最后這個布爾值參數(shù)如果是true,表示在捕獲階段調(diào)用事件處理程序;如果是false,表示在冒泡階段調(diào)用事件處理程序。
var btn = document.getElementById("myBtn");
btn.addEventListener("click", function(){
    alert(this.id);
}, false);
  • 使用DOM2 級方法添加事件處理程序的主要好處是可以添加多個事件處理程序。
var btn = document.getElementById("myBtn");
btn.addEventListener("click", function(){
    alert(this.id);
}, false);
btn.addEventListener("click", function(){
    alert("Hello world!");
}, false);
//這兩個事件處理程序會按照添加它們的順序觸發(fā)
  • 通過addEventListener()添加的事件處理程序只能使用removeEventListener()來移除;
  • 移除時傳入的參數(shù)與添加處理程序時使用的參數(shù)相同。這也意味著通過addEventListener()添加的匿名函數(shù)將無法移除。
var btn = document.getElementById("myBtn");
btn.addEventListener("click", function(){
    alert(this.id);
}, false);
//這里省略了其他代碼
btn.removeEventListener("click", function(){ //沒有用!
    alert(this.id);
}, false);
  • 雖然調(diào)用remove-EventListener()時看似使用了相同的參數(shù),但實際上,第二個參數(shù)與傳入addEventListener()中的那一個是完全不同的函數(shù)。
var btn = document.getElementById("myBtn");
var handler = function(){
    alert(this.id);
};
btn.addEventListener("click", handler, false);
//這里省略了其他代碼
btn.removeEventListener("click", handler, false); //有效!
  • 大多數(shù)情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣可以最大限度地兼容各種瀏覽器。
  • IE9、Firefox、Safari、Chrome 和Opera 支持DOM2 級事件處理程序。

4、IE事件處理程序

  • IE 實現(xiàn)了與DOM 中類似的兩個方法:attachEvent()和detachEvent()。
  • 這兩個方法接受相同的兩個參數(shù):事件處理程序名稱與事件處理程序函數(shù)。
var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function(){
    alert("Clicked");
});
  • 在IE 中使用attachEvent()與使用DOM0 級方法的主要區(qū)別在于事件處理程序的作用域。
  • 在使用DOM0 級方法的情況下,事件處理程序會在其所屬元素的作用域內(nèi)運(yùn)行。
  • 在使用attachEvent()方法的情況下,事件處理程序會在全局作用域中運(yùn)行,因此this 等于window。
var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function(){
    alert(this === window); //true
});
  • 與addEventListener()類似,attachEvent()方法也可以用來為一個元素添加多個事件處理程序。
var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function(){
    alert("Clicked");
});
btn.attachEvent("onclick", function(){
    alert("Hello world!");
});
//這兩個事件處理程序以相反的順序被觸發(fā)
  • 使用attachEvent()添加的事件可以通過detachEvent()來移除,條件是必須提供相同的參數(shù)。只要能夠?qū)ο嗤瘮?shù)的引用傳給detachEvent(),就可以移除相應(yīng)的事件處理程序。
var btn = document.getElementById("myBtn");
var handler = function(){
    alert("Clicked");
};
btn.attachEvent("onclick", handler);
//這里省略了其他代碼
btn.detachEvent("onclick", handler);
  • 支持IE 事件處理程序的瀏覽器有IE 和Opera。

5、跨瀏覽器的事件處理程序

  • 要保證處理事件的代碼能在大多數(shù)瀏覽器下一致地運(yùn)行,只需關(guān)注冒泡階段。
  • 第一個要創(chuàng)建的方法是addHandler(),它的職責(zé)是視情況分別使用DOM0 級方法、DOM2 級方法或IE 方法來添加事件。
  • addHandler()方法接受3 個參數(shù):要操作的元素、事件名稱和事件處理程序函數(shù)。
  • 與addHandler()對應(yīng)的方法是removeHandler(),它也接受相同的參數(shù)。這個方法的職責(zé)是移除之前添加的事件處理程序——無論該事件處理程序是采取什么方式添加到元素中的,如果其他方法無效,默認(rèn)采用DOM0 級方法。
var EventUtil = {
    addHandler: function(element, type, handler){
        if (element.addEventListener){
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent){
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },
    removeHandler: function(element, type, handler){
        if (element.removeEventListener){
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent){
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;
        }
    }
};
var btn = document.getElementById("myBtn");
var handler = function(){
    alert("Clicked");
};
EventUtil.addHandler(btn, "click", handler);
//這里省略了其他代碼
EventUtil.removeHandler(btn, "click", handler);
好好學(xué)習(xí)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、事件流 1.1 事件流 事件流:從頁面中接受事件的順序 事件冒泡:即事件開始時由最具體的元素(文檔中嵌套層次最...
    范小飯_閱讀 1,165評論 1 9
  • __ 一、事件冒泡和事件捕獲__ 事件冒泡事件冒泡就是從HTML中具體的一個元素,沿著DOM樹,向父級冒泡,直到d...
    張延偉閱讀 423評論 0 1
  • 事件冒泡:事件在文檔樹上向上傳播,如有以下結(jié)構(gòu) 當(dāng)用戶點擊按鈕時,首先在按鈕上觸發(fā)點擊事件,接著在包著按鈕的div...
    柴柴總閱讀 424評論 0 3
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,242評論 1 6
  • JavaScript 程序采用了異步事件驅(qū)動編程模型。在這種程序設(shè)計風(fēng)格下,當(dāng)文檔、瀏覽器、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,333評論 3 11

友情鏈接更多精彩內(nèi)容