一篇文章讓你徹底弄懂JS的事件冒泡和事件捕獲
在學(xué)校,聽(tīng)老師講解事件冒泡和事件捕獲機(jī)制的時(shí)候跟聽(tīng)天書(shū)一樣,只依稀記得IE使用的是事件冒泡,其他瀏覽器則是事件捕獲。當(dāng)時(shí)的我,把它當(dāng)成IE瀏覽器兼容問(wèn)題,所以沒(méi)有深究(IE8以下版本的瀏覽器已基本退出市場(chǎng))。工作至今,雖然多次遇到該類(lèi)問(wèn)題,但均未深究,始終一知半解,遇到了全TM靠猜(選A不行就選B唄)。今天閑來(lái)無(wú)事自己做了個(gè)demo,算是把這個(gè)問(wèn)題徹底搞明白了。
先上結(jié)論:他們是描述事件觸發(fā)時(shí)序問(wèn)題的術(shù)語(yǔ)。事件捕獲指的是從document到觸發(fā)事件的那個(gè)節(jié)點(diǎn),即自上而下的去觸發(fā)事件。相反的,事件冒泡是自下而上的去觸發(fā)事件。綁定事件方法的第三個(gè)參數(shù),就是控制事件觸發(fā)順序是否為事件捕獲。true,事件捕獲;false,事件冒泡。默認(rèn)false,即事件冒泡。Jquery的e.stopPropagation會(huì)阻止冒泡,意思就是到我為止,我的爹和祖宗的事件就不要觸發(fā)了。
這是HTML結(jié)構(gòu)
<div id="parent"> <div id="child" class="child"></div> </div>
現(xiàn)在我們給它們綁定上事件
document.getElementById("parent").addEventListener("click",function(e){ alert("parent事件被觸發(fā),"+this.id); }) document.getElementById("child").addEventListener("click",function(e){ alert("child事件被觸發(fā),"+this.id) })
結(jié)果:
child事件被觸發(fā),child
parent事件被觸發(fā),parent
結(jié)論:先child,然后parent。事件的觸發(fā)順序自?xún)?nèi)向外,這就是事件冒泡。
現(xiàn)在改變第三個(gè)參數(shù)的值為true
document.getElementById("parent").addEventListener("click",function(e){ alert("parent事件被觸發(fā),"+e.target.id); },true) document.getElementById("child").addEventListener("click",function(e){ alert("child事件被觸發(fā),"+e.target.id) },true)
結(jié)果:
parent事件被觸發(fā),parent
child事件被觸發(fā),child
結(jié)論:先parent,然后child。事件觸發(fā)順序變更為自外向內(nèi),這就是事件捕獲。
貌似沒(méi)什么卵用,上一個(gè)利用事件冒泡的案例,反正我是經(jīng)常會(huì)用到。
<ul> <li>item1</li> <li>item2</li> <li>item3</li> <li>item4</li> <li>item5</li> <li>item6</li> </ul>
需求是這樣的:鼠標(biāo)放到li上對(duì)應(yīng)的li背景變灰。
利用事件冒泡實(shí)現(xiàn):
$("ul").on("mouseover",function(e){ $(e.target).css("background-color","#ddd").siblings().css("background-color","white"); })
也許有人會(huì)說(shuō),我們直接給所有l(wèi)i都綁上事件也可以啊,一點(diǎn)也不麻煩,只要……
$("li").on("mouseover",function(){ $(this).css("background-color","#ddd").siblings().css("background-color","white"); })
是,這樣也行。而且從代碼簡(jiǎn)潔程度上,兩者是相若仿佛的。但是,前者少了一個(gè)遍歷所有l(wèi)i節(jié)點(diǎn)的操作,所以在性能上肯定是更優(yōu)的。
還有就是,如果我們?cè)诮壎ㄊ录瓿珊?,?yè)面又動(dòng)態(tài)的加載了一些元素……
$("<li>item7</li>").appendTo("ul");
這時(shí)候,第二種方案,由于綁定事件的時(shí)候item7還不存在,所以為了效果,我們還要給它再綁定一次事件。而利用冒泡方案由于是給ul綁的事件……
高下立判!
以上就是小編為大家整理的js事件冒泡事件捕獲的詳細(xì)介紹的內(nèi)容啦。希望大家繼續(xù)支持腳本之家~
相關(guān)文章
javascript學(xué)習(xí)筆記(八)正則表達(dá)式
這篇文章本來(lái)很早就要寫(xiě)的,主要介紹一下javascript正則表達(dá)式,拖了挺久的,現(xiàn)在整理下,供大家學(xué)習(xí)交流哈!2014-10-10全面了解JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換
下面小編就為大家?guī)?lái)一篇全面了解JavaScript的數(shù)據(jù)類(lèi)型轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家看,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07javascript學(xué)習(xí)筆記(十) js對(duì)象 繼承
javascript學(xué)習(xí)筆記之js對(duì)象 繼承介紹,需要的朋友可以參考下2012-06-06