obj.onclick=method
這種綁定事件的方式,兼容主流瀏覽器,但如果一個(gè)元素上添加多次同一事件呢?
六盤(pán)水ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!obj.onclick=method1;
obj.onclick=method2;
obj.onclick=method3;
如果這樣寫(xiě),那么只有最后綁定的事件,這里是method3會(huì)被執(zhí)行,這個(gè)時(shí)候我們就不能用onclick這樣的寫(xiě)法了,主角改登場(chǎng)了,在IE中我們可以使用attachEvent方法
//object.attachEvent(event,function);btn1Obj.attachEvent("onclick",method1);
btn1Obj.attachEvent("onclick",method2);
btn1Obj.attachEvent("onclick",method3);
使用格式是前面是事件類型,注意的是需要加on,比如onclick,onsubmit,onchange,執(zhí)行順序是
method3->method2->method1
可惜這個(gè)微軟的私人方法,火狐和其他瀏覽器都不支持,幸運(yùn)的是他們都支持W3C標(biāo)準(zhǔn)的addEventListener方法
//element.addEventListener(type,listener,useCapture);btn1Obj.addEventListener("click",method1,false);
btn1Obj.addEventListener("click",method2,false);
btn1Obj.addEventListener("click",method3,false);
執(zhí)行順序?yàn)閙ethod1->method2->method3
做前端開(kāi)發(fā)工程師,最悲劇的某過(guò)于瀏覽器兼容問(wèn)題了,上面有兩種添加事件的方法,為了同一添加事件的方法,我們不得不再重新寫(xiě)一個(gè)通用的添加事件函數(shù),幸虧再有前人幫我們做了這件事
function addEvent(elm, evType, fn, useCapture) {
if (elm.addEventListener) {
elm.addEventListener(evType, fn, useCapture);//DOM2.0return true;
}
else if (elm.attachEvent) {
var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+return r;
}
else {
elm['on' + evType] = fn;//DOM 0}
}
下面是Dean Edwards 的版本
function addEvent(element, type, handler) {
//為每一個(gè)事件處理函數(shù)分派一個(gè)唯一的IDif (!handler.$$guid) handler.$$guid = addEvent.guid++;
//為元素的事件類型創(chuàng)建一個(gè)哈希表if (!element.events) element.events = {};
//為每一個(gè)"元素/事件"對(duì)創(chuàng)建一個(gè)事件處理程序的哈希表var handlers = element.events[type];
if (!handlers) {
handlers= element.events[type] = {};
//存儲(chǔ)存在的事件處理函數(shù)(如果有)if (element["on" + type]) {
handlers[0] = element["on" + type];
}
}
//將事件處理函數(shù)存入哈希表handlers[handler.$$guid] = handler;
//指派一個(gè)全局的事件處理函數(shù)來(lái)做所有的工作element["on" + type] = handleEvent;
};
//用來(lái)創(chuàng)建唯一的ID的計(jì)數(shù)器addEvent.guid = 1;
function removeEvent(element, type, handler) {
//從哈希表中刪除事件處理函數(shù)if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
};
function handleEvent(event) {
var returnValue = true;
//抓獲事件對(duì)象(IE使用全局事件對(duì)象)event = event || fixEvent(window.event);
//取得事件處理函數(shù)的哈希表的引用var handlers = this.events[event.type];
//執(zhí)行每一個(gè)處理函數(shù)for (var i in handlers) {
this.$$handleEvent = handlers[i];
if (this.$$handleEvent(event) === false) {
returnValue= false;
}
}
return returnValue;
};
//為IE的事件對(duì)象添加一些“缺失的”函數(shù)function fixEvent(event) {
//添加標(biāo)準(zhǔn)的W3C方法event.preventDefault = fixEvent.preventDefault;
event.stopPropagation= fixEvent.stopPropagation;
return event;
};
fixEvent.preventDefault= function() {
this.returnValue = false;
};
fixEvent.stopPropagation= function() {
this.cancelBubble = true;
};
功能非常強(qiáng)悍,解決IE的this指向問(wèn)題,event總是作為第一個(gè)參數(shù)傳入,跨瀏覽器就更不在話下。
最后貢獻(xiàn)一個(gè)HTML5工作組的版本:
var addEvent=(function(){
if(document.addEventListener){
return function(el,type,fn){
if(el.length){
for(var i=0;i<el.length;i++){
addEvent(el[i],type,fn);
}
}else{
el.addEventListener(type,fn,false);
}
};
}else{
return function(el,type,fn){
if(el.length){
for(var i=0;i<el.length;i++){
addEvent(el[i],type,fn);
}
}else{
el.attachEvent(‘on‘+type,function(){
return fn.call(el,window.event);
});
}
};
}
})();
可能細(xì)心的讀者發(fā)現(xiàn)了IE的attachEvent和W3C標(biāo)準(zhǔn)的addEventListener綁定多個(gè)事件的執(zhí)行順序是不一樣的
文章轉(zhuǎn)自:http://www.oschina.net/question/54100_25614 http://www.popo4j.com/article/js-add-event-attachEvent-and-addEventListener.html,