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人立場,如涉及侵權,請及時告知。
相關文章
- HTML addEventListener和attachEvent的區別詳解HTMLdev
- 為什麼在js中需要新增addEventListener()?JSdev
- js 註冊事件的兩種方式詳解,傳統註冊事件與方法監聽註冊事件(addEventListener)JS事件dev
- attachEvent()註冊事件處理函式this指向問題事件函式
- oncopy和onpaste事件用法AST事件
- JS的事件繫結和事件流模型JS事件模型
- 理解js的事件冒泡和事件捕獲JS事件
- JS事件(事件冒泡和事件捕獲)JS事件
- js中try和catch的用法JS
- JS中的!=、== 、!==、=== 的用法和區別JS
- JS中的!=、== 、!==、===的用法和區別。JS
- JS事件流和事件委託JS事件
- Js中的onblur和onfocus事件JS事件
- js 事件的冒泡和委託JS事件
- js中!和!!的區別與用法JS
- JS中排序的用法和例項JS排序
- JS中apply和call的用法JSAPP
- js 建立和觸發事件 和 自定義事件JS事件
- 使用原生Js addEventListener給每個li元素繫結一個click事件輸出他們的順序JSdev事件
- AngularJs 鍵盤事件和滑鼠事件AngularJS事件
- JS/TS 的 import 和 export 用法小結JSImportExport
- JavaScript addEventListener()JavaScriptdev
- 關於js事件冒泡和事件捕獲JS事件
- nodejs事件和事件迴圈簡介NodeJS事件
- nodejs事件和事件迴圈詳解NodeJS事件
- JS學習之事件和事件繫結JS事件
- JavaScript進階系列05,事件的執行時機, 使用addEventListener為元素同時註冊多個事件,事件引數JavaScript事件dev
- Jquery 給Js動態新新增的元素 繫結的點選事件jQueryJS事件
- java和js中正規表示式的用法和區別JavaJS
- js 監聽事件的疊加和移除JS事件
- FileReader 事件用法事件
- jQuery paste事件用法jQueryAST事件
- js中的this用法JS
- Seajs的用法JS
- JS Object的用法JSObject
- addEventListener("touchend", function ()_devFunction
- 事件委託---動態建立的元素新增事件事件
- js如何刪除和新增table中的行和列JS