1. 程式人生 > >JS中事件繫結函式,事件捕獲,事件冒泡

JS中事件繫結函式,事件捕獲,事件冒泡

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); //將會彈出aaa
7 } 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>

 

 

 

 

 

 

未完待續...