国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

一篇文章讓你徹底弄懂JS的事件冒泡和事件捕獲

2019-11-19 15:49:04
字體:
供稿:網(wǎng)友

在學(xué)校,聽老師講解事件冒泡和事件捕獲機(jī)制的時(shí)候跟聽天書一樣,只依稀記得IE使用的是事件冒泡,其他瀏覽器則是事件捕獲。當(dāng)時(shí)的我,把它當(dāng)成IE瀏覽器兼容問題,所以沒有深究(IE8以下版本的瀏覽器已基本退出市場)。工作至今,雖然多次遇到該類問題,但均未深究,始終一知半解,遇到了全TM靠猜(選A不行就選B唄)。今天閑來無事自己做了個(gè)demo,算是把這個(gè)問題徹底搞明白了。

先上結(jié)論:他們是描述事件觸發(fā)時(shí)序問題的術(shù)語。事件捕獲指的是從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ā)順序自內(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),這就是事件捕獲。

貌似沒什么卵用,上一個(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上對應(yīng)的li背景變灰。

利用事件冒泡實(shí)現(xiàn):

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

也許有人會(huì)說,我們直接給所有l(wèi)i都綁上事件也可以啊,一點(diǎn)也不麻煩,只要……

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

是,這樣也行。而且從代碼簡潔程度上,兩者是相若仿佛的。但是,前者少了一個(gè)遍歷所有l(wèi)i節(jié)點(diǎn)的操作,所以在性能上肯定是更優(yōu)的。
還有就是,如果我們在綁定事件完成后,頁面又動(dòng)態(tài)的加載了一些元素……

$("<li>item7</li>").appendTo("ul");
這時(shí)候,第二種方案,由于綁定事件的時(shí)候item7還不存在,所以為了效果,我們還要給它再綁定一次事件。而利用冒泡方案由于是給ul綁的事件……
高下立判!

以上就是小編為大家整理的js事件冒泡事件捕獲的詳細(xì)介紹的內(nèi)容啦。希望大家繼續(xù)支持武林網(wǎng)~

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西城区| 富宁县| 望都县| 隆子县| 鹿邑县| 施秉县| 甘孜县| 固始县| 娱乐| 百色市| 兴隆县| 秭归县| 闸北区| 名山县| 商洛市| 嫩江县| 梧州市| 遵义市| 凯里市| 靖西县| 武宣县| 凤台县| 宿迁市| 大丰市| 洱源县| 泸定县| 辽阳市| 隆化县| 青川县| 青冈县| 南宁市| 临安市| 防城港市| 颍上县| 平阴县| 萨迦县| 西安市| 江油市| 韩城市| 封丘县| 邳州市|