JS中事件繫結函式,事件捕獲,事件冒泡
阿新 • • 發佈:2019-01-14
1 事件繫結:事件與函式繫結的方式
1.1 元素.onclick這種形式,如下:
1 <div id="div1">aaa</div> 2 3 <script type="text/javascript"> 4 var oDiv1 = document.getElementById('div1'); 5 oDiv1.onclick = function(){ 6 alert(this.innerHTML); //將會彈出aaa7 } 8 </script>
這種繫結不存在什麼相容性問題,但是如果想繫結2個事件,就麻煩了。上面的js程式碼改成如下:
1 var oDiv1 = document.getElementById('div1'); 2 oDiv1.onclick = function(){ 3 alert(this.innerHTML); //將會彈出aaa 4 } 5 oDiv1.onclick = function(){ 6 alert(this.nodeType); 7 }
我們給oDiv1後面又綁定了onclick,前面的那個alert(this.innerHTML)就會失效。
當然,這裡只是很簡單的兩個函式例子,可以很容易將2個onclick合併,但是如果是多人合作,程式碼多,結構複雜,還是看看其他的事件和函式繫結的方式吧。
1.2 元素.attachEvent 和 元素.addEventListener進行事件和函式繫結,如下:
這種方式存在瀏覽器相容性問題
/* 總結 ie6/7/8 :obj.attachEvent(事件名稱,事件函式); 1.沒有捕獲(事件捕獲在後面講,是和冒泡相反的,IE不支援) 2.事件名稱帶有on,如這裡是onclick 3.事件函式執行的順序是反著的,後繫結的那個函式先執行 4.事件函式中this指向window,這不是本意,帶來了不方便 標準瀏覽器及高版本IE:obj.addEventListener(事件名稱,事件函式,是否捕獲); 1.有捕獲 2.事件名稱不帶on 3.事件執行的順序是正常的 4.this觸發該事件的物件*/
上面的程式碼繼續改,如下:
下面的程式碼只能在IE6.7.8.9下執行,但是ie9也有addEventListener方法,就是IE9下attachEvent和addEventListener都行
1 <div id="div1">aaa</div> 2 3 <script type="text/javascript"> 4 var oDiv1 = document.getElementById('div1'); 5 //改的是這裡,事件和函式進行繫結 6 oDiv1.attachEvent('onclick',function(){ 7 //這裡的this變成了window,也不能用this.innerHTML了 8 alert(oDiv1.innerHTML); 9 }); 10 oDiv1.attachEvent('onclick',function(){ 11 alert(oDiv1.nodeType); 12 }); 13 </script>
再看看標準瀏覽器,如谷歌火狐瀏覽下怎麼寫
1 <div id="div1">aaa</div> 2 3 <script type="text/javascript"> 4 var oDiv1 = document.getElementById('div1'); 5 //改的是這裡,事件和函式進行繫結,IE.6.7.8不支援addEventListener 6 oDiv1.addEventListener('click',function(){ 7 //在標準瀏覽器下,this還是隻oDiv1 8 alert(this.innerHTML); 9 });//addEventListener第三個引數沒寫,預設:冒泡 10 oDiv1.addEventListener('click',function(){ 11 alert(this.nodeType); 12 }); 13 </script>
存在相容性問題,我們封裝一個函式進行事件繫結操作
1 <div id="div1">aaa</div> 2 3 <script type="text/javascript"> 4 var oDiv1 = document.getElementById('div1'); 5 6 //改的是這裡,封裝了一個bind函式來解決 7 function bind(obj,evname,fn){ 8 if(obj.addEventListener){ //IE9+、谷歌、火狐等 9 obj.addEventListener(evname,fn); 10 }else{//IE6.7.8,雖然IE9也支援attachEvent,但是IE9用上面的addEventListener了 11 obj.attachEvent('on'+evname,function(){ 12 fn.call(obj); 13 }); 14 } 15 } 16 17 //使用 18 bind(oDiv1, 'click', function(){ 19 alert(this.innerHTML); 20 }); 21 bind(oDiv1, 'click', function(){ 22 alert(this.nodeType); 23 }); 24 </script>
未完待續...