经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
事件冒泡与事件捕获
来源:cnblogs  作者:一粒尘土  时间:2018/10/11 9:20:43  对本文有异议

需要了解的知识点:

  1. 向指定元素添加事件的方法:addEventListener()方法

  2. Dom2级事件中事件流的三个阶段:事件捕获阶段、目标元素、事件冒泡阶段

  3. javascript中 “this与e.target”的区别

 

 addEventListener()方法

  语法:addEventListener(event , function ,useCapture);

  说明:event:事件名称,必填。

     function:事件触发时要执行的函数,必填。

     useCapture:blooen值,可选,事件是否在捕获或冒泡阶段执行。

          true:事件在捕获阶段执行

          false:事件在冒泡阶段执行

 

事件捕获

  1.什么是事件捕获:

    从根节点将事件传播到目标元素的过程

  2.demo1:

  html代码

  1. <div class="box">
  2. <p class="box1"></p>
  3. </div>

  css代码

  1. .box{
  2. width: 300px;
  3. height: 300px;
  4. background-color: #000;
  5. overflow: hidden;
  6. }
  7. .box1{
  8. width: 150px;
  9. height: 150px;
  10. background-color: #FF0000;
  11. margin: 75px auto;
  12. }

  js代码

 //获取被操作的元素

 var div_v = document.querySelector('.box');
 var p_v = document.querySelector('.box1');

  1. div_v.addEventListener('click' , function () {
  2. console.log("父级元素");
  3. } ,true);
  4. p_v.addEventListener('click' , function () {
  5. console.log("子集元素");
  6. } ,true);
  7. document.getElementsByTagName("body")[0].addEventListener('click' ,function () {
  8. console.log("根元素");
  9. } ,true);

事件冒泡

  1.什么是事件冒泡

    从目标元素向上级元素冒泡一直到根节点

  2.demo2

    Html/css部分与demo1相同

    js代码

 //获取被操作的元素

 var div_v = document.querySelector('.box');
 var p_v = document.querySelector('.box1');


  1. div_v.addEventListener('click' , function () {
  2. console.log("父级元素");
  3. });
  4. p_v.addEventListener('click' , function () {
  5. console.log("子集元素");
  6. });
  7. document.getElementsByTagName("body")[0].addEventListener('click' ,function () {
  8. console.log("根元素");
  9. });

 

 

“this与e.target”的区别(理解即可)

  在js中由于冒泡事件的影响,所以this的值是不确定的,而 e.target 则只会接受该事件的目标Dom元素,所以在使用的之前要根据需求而选择。

 

好了,结合上述的例子,写一个大同小异的例子,实现代码如下:

html代码

  1. <ul>
  2. <li>子元素1</li>
  3. <li>子元素2</li>
  4. <li>子元素3</li>
  5. </ul>

 

css代码

  1. ul{
  2. width: 100px;
  3. border: 1px solid #000;
  4. }
  5. li{
  6. width: 100px;
  7. height: 50px;
  8. line-height: 50px;
  9. text-align: center;
  10. font-size: 20px;
  11. list-style: none;
  12. cursor: pointer;
  13. }

 

js代码

  1. var ul_v = document.querySelector('ul');
  2. ul_v.addEventListener('mouseover' ,function (e) {
  3. //e.target.parentNode.children 获取父元素下的所有子元素
  4. //使用e.target 不适用this 的原因:受到冒泡的影响,this会改变,而e.target只接受事件的目标DOM元素
  5. for (var i = 0;i<e.target.parentNode.children.length;i++) {
  6. e.target.parentNode.children[i].style.backgroundColor = "#fff";
  7. }
  8. e.target.style.backgroundColor = "red";
  9. });

 

 

以上是本人对事件冒泡与事件捕获的潜在理解,里边有不足的地方还望大家提出,大家一起交流讨论!

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号