亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript事件冒泡和事件捕獲詳解

 更新時間:2015年05月26日 10:00:51   投稿:hebedich  
最近在學習javascript中遇到了一些困難,比如冒泡和捕獲,很多次被提到,但又不知究竟應用在何處。找到了一些好文章解惑,在這里分享給大家。

事件冒泡和事件捕獲分別由微軟和網景公司提出,這兩個概念都是為了解決頁面中事件流(事件發(fā)生順序)的問題。

<div id="outer">
  <p id="inner">Click me!</p>
</div>

上面的代碼當中一個div元素當中有一個p子元素,如果兩個元素都有一個click的處理函數,那么我們怎么才能知道哪一個函數會首先被觸發(fā)呢?

為了解決這個問題微軟和網景提出了兩種幾乎完全相反的概念。

事件冒泡

微軟提出了名為事件冒泡(event bubbling)的事件流。事件冒泡可以形象地比喻為把一顆石頭投入水中,泡泡會一直從水底冒出水面。也就是說,事件會從最內層的元素開始發(fā)生,一直向上傳播,直到document對象。

因此上面的例子在事件冒泡的概念下發(fā)生click事件的順序應該是p -> div -> body -> html -> document

事件捕獲

網景提出另一種事件流名為事件捕獲(event capturing)。與事件冒泡相反,事件會從最外層開始發(fā)生,直到最具體的元素。

上面的例子在事件捕獲的概念下發(fā)生click事件的順序應該是document -> html -> body -> div -> p

addEventListener的第三個參數

“DOM2級事件”中規(guī)定的事件流同時支持了事件捕獲階段和事件冒泡階段,而作為開發(fā)者,我們可以選擇事件處理函數在哪一個階段被調用。

addEventListener方法用來為一個特定的元素綁定一個事件處理函數,是JavaScript中的常用方法。addEventListener有三個參數:

element.addEventListener(event, function, useCapture)
第一個參數是需要綁定的事件,第二個參數是觸發(fā)事件后要執(zhí)行的函數。而第三個參數默認值是false,表示在事件冒泡的階段調用事件處理函數,如果參數為true,則表示在事件捕獲階段調用處理函數。請看例子。

事件代理

在實際的開發(fā)當中,利用事件流的特性,我們可以使用一種叫做事件代理的方法。

<ul id="color-list">
  <li>red</li>
  <li>yellow</li>
  <li>blue</li>
  <li>green</li>
  <li>black</li>
  <li>white</li>
</ul>

如果點擊頁面中的li元素,然后輸出li當中的顏色,我們通常會這樣寫:

復制代碼 代碼如下:

(function(){
    var color_list = document.getElementById('color-list');
    var colors = color_list.getElementsByTagName('li');
    for(var i=0;i<colors.length;i++){                         
     colors[i].addEventListener('click',showColor,false);
    };
    function showColor(e){
        var x = e.target;
        alert("The color is " + x.innerHTML);
    };
})();

利用事件流的特性,我們只綁定一個事件處理函數也可以完成:

復制代碼 代碼如下:

(function(){
    var color_list = document.getElementById('color-list');
    color_list.addEventListener('click',showColor,false);
    function showColor(e){
        var x = e.target;
        if(x.nodeName.toLowerCase() === 'li'){
            alert('The color is ' + x.innerHTML);
        }
    }
})();

使用事件代理的好處不僅在于將多個事件處理函數減為一個,而且對于不同的元素可以有不同的處理方法。假如上述列表元素當中添加了其他的元素(如:a、span等),我們不必再一次循環(huán)給每一個元素綁定事件,直接修改事件代理的事件處理函數即可。

冒泡還是捕獲?

對于事件代理來說,在事件捕獲或者事件冒泡階段處理并沒有明顯的優(yōu)劣之分,但是由于事件冒泡的事件流模型被所有主流的瀏覽器兼容,從兼容性角度來說還是建議大家使用事件冒泡模型。

IE瀏覽器兼容

IE瀏覽器對addEventListener兼容性并不算太好,只有IE9以上可以使用。

要兼容舊版本的IE瀏覽器,可以使用IE的attachEvent函數

object.setCapture();
object.attachEvent(event, function)
兩個參數與addEventListener相似,分別是事件和處理函數,默認是事件冒泡階段調用處理函數,要注意的是,寫事件名時候要加上"on"前綴("onload"、"onclick"等)。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

相關文章

  • 如何豐富alt屬性的顯示效果

    如何豐富alt屬性的顯示效果

    如何豐富alt屬性的顯示效果...
    2007-01-01
  • JS添加刪除DIV的簡單實例

    JS添加刪除DIV的簡單實例

    下面小編就為大家?guī)硪黄狫S添加刪除DIV的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • js 走馬燈簡單實例

    js 走馬燈簡單實例

    這篇文章主要介紹了js 走馬燈簡單實例,有需要的朋友可以參考一下
    2013-11-11
  • JavaScript OOP類與繼承

    JavaScript OOP類與繼承

    JavaScript OOP類與繼承實現代碼,需要的朋友可以參考下。
    2009-11-11
  • 詳解JavaScript修改注冊表的方法

    詳解JavaScript修改注冊表的方法

    這篇文章主要介紹了詳解JavaScript修改注冊表的方法,本實例主要通過WshShell 對象的相關方法實現,需要的朋友可以參考下
    2020-01-01
  • JavaScript實現動態(tài)表格效果

    JavaScript實現動態(tài)表格效果

    這篇文章主要為大家詳細介紹了JavaScript實現動態(tài)表格效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 通過JS來判斷頁面控件是否獲取焦點

    通過JS來判斷頁面控件是否獲取焦點

    本篇文章主要介紹了通過JS來判斷頁面控件是否獲取焦點的方法。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 淺談JS讀取DOM對象(標簽)的自定義屬性

    淺談JS讀取DOM對象(標簽)的自定義屬性

    下面小編就為大家?guī)硪黄獪\談JS讀取DOM對象(標簽)的自定義屬性。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 將input框中輸入內容顯示在相應的div中【三種方法可選】

    將input框中輸入內容顯示在相應的div中【三種方法可選】

    本篇文章主要介紹了在input框中輸入內容,會相應的顯示在下面的div中的不同做法:js方法;jQuery方法;AngularJs方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • 基于JavaScript實現猜數字游戲代碼實例

    基于JavaScript實現猜數字游戲代碼實例

    這篇文章主要介紹了基于JavaScript實現猜數字游戲代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論