事件綁定,常見的是odiv.onclick=function(){..........}; 這種方式綁定事件太單一,若是綁定多個,那麼最後一個事件會覆蓋掉以前的,也就是說只執行最後一次綁定的事件,這裏要說的是addEventListener方法,和IE下的attachEvent方法:html
html代碼以下:瀏覽器
<html> <head> </head> <style> #box{ height:400px; width:400px; background: red; } #son1{ height:300px; width:300px; background: green; } #son2{ height:200px; width:200px; background: purple; } </style> <script> </script> <body> <div id='box'>box <div id='son1'>son1 <div id='son2'>son2 </div> </div> </div> </body> </html>界面以下圖:
下面是<script>中的代碼(非IE瀏覽器下addEventListener):函數
window.onload=function(){ var obox=document.getElementById('box'); var oson1=document.getElementById('son1'); var oson2=document.getElementById('son2'); oson2.addEventListener('click',function(){alert('son2 dinaji');}) oson1.addEventListener('click',function(){alert('son1 dinaji');}) obox.addEventListener('click',function(){alert('box dinaji');}) }
生活中仍是以冒泡階段處理爲多。下面是IE下:code
window.onload=function(){ var obox=document.getElementById('box'); var oson1=document.getElementById('son1'); var oson2=document.getElementById('son2'); oson2.attachEvent('onclick',function(){alert('son2 dinaji');}) oson1.attachEvent('onclick',function(){alert('son1 dinaji');}) obox.attachEvent('onclick',function(){alert('box dinaji');}) }IE下attachEvent()只有兩個參數,沒有第三個參數的true或false。由於IE默認的就只能是冒泡階段捕獲,這是當年瀏覽器大戰的緣由,我的猜想,多是由於IE用戶量多吧,致使如今默認的都是在冒泡階段處理。
非IE:htm
oson2.addEventListener('click',function(){alert('first');},true); //先彈出 first oson2.addEventListener('click',function(){alert('second');},true); //後彈出 secondIE:
oson2.attachEvent('onclick',function(){alert('first');}); //後彈出first oson2.attachEvent('onclick',function(){alert('second');}); //先彈出second
oson2.addEventListener('click',function(){alert('first');}); oson2.removeEventListener('click',function(){alert('first');}) //取消綁定不成功
本人又用了函數聲明式嘗試一下發現也不行:對象
oson2.addEventListener('click',function test(){alert('first');}); oson2.removeEventListener('click',function test(){alert('first');});
如上面兩段代碼所述把匿名函數function (){alert('first');} 改成function test(){alert('first');}同樣不行。事件
結論:無論是匿名函數,仍是函數聲明都視爲不一樣參數,不能成功取消綁定。先聲明函數:ip
var test=function(){alert('first');};再把函數名當參數傳入:
oson2.addEventListener('click',test); oson2.removeEventListener('click',test); //成功取消綁定以上代碼是能成功的,但還要注意第三個參數也要一致,上述代碼沒有第三個參數則默認都是false,若是一個爲true,那也不能取消成功:
oson2.addEventListener('click',t,true); //第三個參數爲true表示 捕獲時執行事件程序 oson2.removeEventListener('click',t); //默認爲false ,不一樣的參數,不能取消綁定
二者都爲true便可:
oson2.addEventListener('click',t,true); oson2.removeEventListener('click',t,true);下面是爲解決瀏覽器兼容封裝事件綁定:
function addEvent(element,event,fun){ if(element.addEventListener) { element.addEventListener(event,fun); } else if(element.attachEvent) { element.attachEvent('on'+event,fun);//注意要加on } }下面是取消事件綁定的封裝:
function removeEvent(element,event,fun){ if(element.removeEventListener) { element.removeEventListener(event,fun); } else if(element.detachEvent) { element.detachEvent('on'+event,fun);//注意要加on } }
var t=function(){alert(' box ');}; var t1=function(){alert(' son1 ');}; var t2=function(){alert(' son2 ');};
addEvent(obox,'click',t); addEvent(oson1,'click',t1); addEvent(oson2,'click',t2);取消綁定:
removeEvent(obox,'click',t); removeEvent(oson1,'click',t1); removeEvent(oson2,'click',t2);以上就是事件綁定的內容,也是本身的一次回顧。