js 新增事件 attachEvent 和 addEventListener 的用法
一般我們在JS中新增事件,是這樣子的
obj.onclick=method
這種繫結事件的方式,相容主流瀏覽器,但如果一個元素上新增多次同一事件呢?
obj.onclick=method1; obj.onclick=method2; obj.onclick=method3;
如果這樣寫,那麼只有最後繫結的事件,這裡是method3會被執行,這個時候我們就不能用onclick這樣的寫法了,主角改登場了,在IE中我們可以使用attachEvent方法
//object.attachEvent(event,function); btn1Obj.attachEvent("onclick",method1); btn1Obj.attachEvent("onclick",method2); btn1Obj.attachEvent("onclick",method3);
使用格式是前面是事件型別,注意的是需要加on,比如onclick,onsubmit,onchange,執行順序是
method3->method2->method1
可惜這個微軟的私人方法,火狐和其他瀏覽器都不支援,幸運的是他們都支援W3C標準的addEventListener方法
//element.addEventListener(type,listener,useCapture); btn1Obj.addEventListener("click",method1,false); btn1Obj.addEventListener("click",method2,false); btn1Obj.addEventListener("click",method3,false);
執行順序為method1->method2->method3
做前端開發工程師,最悲劇的某過於瀏覽器相容問題了,上面有兩種新增事件的方法,為了同一新增事件的方法,我們不得不再重新寫一個通用的新增事件函式,幸虧再有前人幫我們做了這件事
functionaddEvent(elm, evType, fn, useCapture) { if(elm.addEventListener) { elm.addEventListener(evType, fn, useCapture);//DOM2.0 returntrue; } elseif(elm.attachEvent) { varr = elm.attachEvent(‘on‘ + evType, fn);//IE5+ returnr; } else{ elm['on'+ evType] = fn;//DOM 0 } }
|
|
下面是Dean Edwards 的版本
functionaddEvent(element, type, handler) { //為每一個事件處理函式分派一個唯一的ID if(!handler.$$guid) handler.$$guid = addEvent.guid++; //為元素的事件型別建立一個雜湊表 if(!element.events) element.events = {}; //為每一個"元素/事件"對建立一個事件處理程式的雜湊表 varhandlers = element.events[type]; if(!handlers) { handlers = element.events[type] = {}; //儲存存在的事件處理函式(如果有) if(element["on"+ type]) { handlers[0] = element["on"+ type]; } } //將事件處理函式存入雜湊表 handlers[handler.$$guid] = handler; //指派一個全域性的事件處理函式來做所有的工作 element["on"+ type] = handleEvent; }; //用來建立唯一的ID的計數器 addEvent.guid = 1; functionremoveEvent(element, type, handler) { //從雜湊表中刪除事件處理函式 if(element.events && element.events[type]) { deleteelement.events[type][handler.$$guid]; } }; functionhandleEvent(event) { varreturnValue =true; //抓獲事件物件(IE使用全域性事件物件) event = event || fixEvent(window.event); //取得事件處理函式的雜湊表的引用 varhandlers =this.events[event.type]; //執行每一個處理函式 for(variinhandlers) { this.$$handleEvent = handlers[i]; if(this.$$handleEvent(event) ===false) { returnValue =false; } } returnreturnValue; }; //為IE的事件物件新增一些“缺失的”函式 functionfixEvent(event) { //新增標準的W3C方法 event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; returnevent; }; fixEvent.preventDefault =function() { this.returnValue =false; }; fixEvent.stopPropagation =function() { this.cancelBubble =true; };
功能非常強悍,解決IE的this指向問題,event總是作為第一個引數傳入,跨瀏覽器就更不在話下。
最後貢獻一個HTML5工作組的版本:
varaddEvent=(function(){ if(document.addEventListener){ returnfunction(el,type,fn){ if(el.length){ for(vari=0;i<el.length;i++){ addEvent(el[i],type,fn); } }else{ el.addEventListener(type,fn,false); } }; }else{ returnfunction(el,type,fn){ if(el.length){ for(vari=0;i<el.length;i++){ addEvent(el[i],type,fn); } }else{ el.attachEvent(‘on‘+type,function(){ returnfn.call(el,window.event); }); } }; } })();
可能細心的讀者發現了IE的attachEvent和W3C標準的addEventListener繫結多個事件的執行順序是不一樣的
由龐順龍最後編輯於:5年前
內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。
相關文章
- 為什麼在js中需要新增addEventListener()?JSdev
- js 註冊事件的兩種方式詳解,傳統註冊事件與方法監聽註冊事件(addEventListener)JS事件dev
- JS的事件繫結和事件流模型JS事件模型
- 理解js的事件冒泡和事件捕獲JS事件
- js中try和catch的用法JS
- JS中的!=、== 、!==、=== 的用法和區別JS
- JS事件流和事件委託JS事件
- js中!和!!的區別與用法JS
- JS中排序的用法和例項JS排序
- 使用原生Js addEventListener給每個li元素繫結一個click事件輸出他們的順序JSdev事件
- js 建立和觸發事件 和 自定義事件JS事件
- JS/TS 的 import 和 export 用法小結JSImportExport
- 關於js事件冒泡和事件捕獲JS事件
- JS學習之事件和事件繫結JS事件
- js keyup、keypress和keydown事件JS事件
- FileReader 事件用法事件
- js中的this用法JS
- JS Object的用法JSObject
- js 監聽事件的疊加和移除JS事件
- JavaScript addEventListener()JavaScriptdev
- JS中的call()方法和apply()方法用法總結JSAPP
- js中的||與&&用法JS
- js裡document的用法JS
- JS 陣列的用法JS陣列
- addEventListener("touchend", function ()_devFunction
- JS的事件物件與事件機制JS事件物件
- addEventListener中的EventListener介面物件dev物件
- thinkphp: fastadmin頁面上新增css和jsPHPASTCSSJS
- js事件JS事件
- js之reduce的最全用法JS
- DOM0事件和DOM2事件模型 —— JS中的設計模式和元件封裝事件模型JS設計模式元件封裝
- node中事件(events)模組一些用法和原理事件
- JS裡關於事件的常被考察的知識點:事件流、事件廣播、原生JS實現事件代理JS事件
- addEventListener(自己的學習筆記)dev筆記
- 企圖為vuex新增發布訂閱:事件繫結和事件觸發Vue事件
- Datetimepicker.js用法JS
- js中的事件委託JS事件
- 滑鼠事件css的:hover和js的mouseover有什麼區別?事件CSSJS