用attachevent和addEventListner添加事件不會(huì)被覆蓋乏梁,但是有兼容性問(wèn)題逮栅,因此封裝了一個(gè)函數(shù)拐迁,可以用來(lái)添加事件官地,移除事件
function addEvent(elem,type,handler){
if(elem.addEventListener){
elem.addEventListener(type,handler)
}else if(elem.attachEvent){
}
elem.attachEvent("on"+type,function(){
handler.call(elem)
})
}else{
elem["on"+type]=handle
}
}
移除事件
function removeEvent(elem,type,handler){
if(elem..removeEventListene){
elem.removeEventListener(type,handle)
}else if(elem.detachEvent){
elem.detachEvent("on"+type,handle)
}else{
elem["on"+type]=null
}
}
因?yàn)閍ttachEvent中的this值指向window怒详,所以我們要用call將其this值改為事件源炉媒。
調(diào)用
function fn(){
alert(1111);
}
addEvent(oDiv1,"click",fn)
removeEvent(oDiv1,"click",fn)
會(huì)產(chǎn)生一個(gè)問(wèn)題昆烁,移除事件是不好使的吊骤,因?yàn)樘砑拥奶幚砗瘮?shù)和移除的處理函數(shù)不是同一函數(shù)
為了確保處理的函數(shù)是同一個(gè)函數(shù)我使用了給對(duì)象下面添加一個(gè)函數(shù)屬性,這樣處理的函數(shù)就為同一個(gè)函數(shù)静尼。
這樣做
else if(elem.attachEvent){
elem.fn=function(){
handle.call(elem);//改變this指向
}
elem.attachEvent("on"+type,elem.fn)
}
else if(elem.detachEvent){
elem.detachEvent("on"+type,elem.fn)
}
這樣就可以移除事件了白粉,添加事件和移除事件就是一個(gè)事件了。
如果我們添加多個(gè)事件鼠渺,并移除
function fn1(){
alert(1111);
}
function fn2(){
alert(2222);
}
addEvent(oDiv1,"click"鸭巴,fn1)
addEvent(oDiv1,"click",fn2)
removeEvent(oDiv1,"click",fn1)
removeEvent(oDiv1,"click",fn2)
運(yùn)行的結(jié)果是彈出的是1111拦盹,因?yàn)槲覀僥lem.fn 時(shí)鹃祖,剛開(kāi)始elem.fn 指向的fn1 后來(lái)再addEvent(oDiv1,"click",fn2)后普舆,elem.fn 就是fn2恬口,fn1被覆蓋掉了校读,此時(shí)在移除事件時(shí),移除的是fn2祖能,因此fn1事件沒(méi)有被移除歉秫,我們給elem下加一個(gè)變量來(lái)存函數(shù)elem[type+handle]
最后完善的代碼是這樣的
添加事件
function addEvent(elem,type,handler){
if(elem.addEventListener){
elem.addEventListener(type,handler)
}else if(elem.attachEvent){
elem[type+handler]=function(){
handle.call(elem);//改變this指向
}
elem.attachEvent("on"+type,elem[type+handler])
}else{
elem["on"+type]=handle
}
}
移除事件
function removeEven(elem,type,handler){
if(elem..removeEventListene){
elem.removeEventListener(type,handle)
}else if(elem.detachEvent){
elem.detachEvent("on"+type,elem[type+handler])
}else{
elem["on"+type]=null
}
}