徹底弄懂JS的事件冒泡和事件捕獲

來源:互聯網
上載者:User

標籤:實現   pre   滑鼠   簡潔   cells   word   dex   bubble   blog   

 

先上結論:在事件執行流中有兩種執行方式。一種是事件冒泡(即事件的執行順序是從下往上執行的) ;  另一種是捕獲(即事件的執行順序是從上往下執行的);

            阻止事件冒泡:   return false;  Firefox/ie都支援      

            function(even){

                 var ev=even||window.even;

              

                   if(ev&&ev.stopPropagation){

                             ev.stopPropagation();

                             }else{

                              window.event.cancelBubble=true;

                        }

    

    } 

             

這是HTML結構

123 <div id="parent">  <div id="child" class="child"></div></div>

現在我們給它們綁定上事件

            document.getElementById("parent").addEventListener("click",function(e){                alert("parent事件被觸發,"+this.id);            })            document.getElementById("child").addEventListener("click",function(e){                alert("child事件被觸發,"+this.id)            })

結果:

child事件被觸發,childparent事件被觸發,parent

結論:先child,然後parent。事件的觸發順序自內向外,這就是事件冒泡。

現在改變第三個參數的值為true

       document.getElementById("parent").addEventListener("click",function(e){                alert("parent事件被觸發,"+e.target.id);            },true)            document.getElementById("child").addEventListener("click",function(e){                alert("child事件被觸發,"+e.target.id)            },true)

結果:

parent事件被觸發,parentchild事件被觸發,child

結論:先parent,然後child。事件觸發順序變更為自外向內,這就是事件捕獲。

貌似沒什麼卵用,上一個利用事件冒泡的案例,反正我是經常會用到。

    <ul>            <li>item1</li>            <li>item2</li>            <li>item3</li>            <li>item4</li>            <li>item5</li>            <li>item6</li>        </ul>

需求是這樣的:滑鼠放到li上對應的li背景變灰。

利用事件冒泡原理實現事件委託/事件代碼:

          事件代理解決兩個問題:

                              1:減少對後代元素的遍曆操作

                              2:後期動態產生的後代元素也可以使用綁定的事件

       $("ul").on("mouseover",function(e){//給目標元素的祖先元素繫結事件                $(e.target).css("background-color","#ddd").siblings().css("background-color","white");            })

也許有人會說,我們直接給所有li都綁上事件也可以啊,一點也不麻煩,只要……

       $("li").on("mouseover",function(){                $(this).css("background-color","#ddd").siblings().css("background-color","white");            })

是,這樣也行。而且從代碼簡潔程度上,兩者是相若彷彿的。但是,前者少了一個遍曆所有li節點的操作,所以在效能上肯定是更優的。

還有就是,如果我們在綁定事件完成後,頁面又動態載入了一些元素……

$("<li>item7</li>").appendTo("ul");

這時候,第二種方案,由於綁定事件的時候item7還不存在,所以為了效果,我們還要給它再綁定一次事件。而利用冒泡方案由於是給ul綁的事件……

高下立判!

 

徹底弄懂JS的事件冒泡和事件捕獲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.