js学习之事件的传播机制

事件的传播机制

/* 
 * 事件的传播机制
      + 捕获阶段:从最外层的元素一直往里层逐级查找,直到找到事件源为止,目的就是为冒泡阶段的传播提供路径 =>ev.path存储的就是捕获阶段收集的传播路径
      + 目标阶段:把当前事件源相关事件行为触发
      + 冒泡阶段:按照捕获阶段收集的传播路径。不仅仅当前事件源的相关事件行为会被触发,而且从内向外,其祖先所有元素的相关事件行为也都会被触发(如果做了事件绑定,那么绑定的方法也会执行)
*/

/* 
 * DOM0事件绑定中给元素事件行为绑定的方法,会在目标阶段和冒泡阶段触发
 * DOM2事件绑定,可以控制绑定的办法在捕获阶段触发(不过没啥用)
 
 * 阻止事件的冒泡传播
    + ev.stopPropation();
    + ev.cancelBubble = true


 * 事件委托:利用事件的冒泡传播机制,只需要给最外层的元素进行事件绑定方法,在方法中通过事件源的判断,从而实现不同元素的的事件行为做不同的操作

*/

let box = document.querySelector('.box'),
      outer = document.querySelector('.outer'),
      inter = document.querySelector('.inner');

  box.onclick = function(){
    console.log('box');
  }
  outer.onclick = function(){
    console.log('outer');
  }
  inter.onclick = function(ev){
    ev.stopPropagation(); // 点击 inner只会输出 inter了
    console.log('inter');
  }


  // 利用事件委托来实现
 document.body.onclick = function(ev) {
    // console.log(ev);
    if(ev.target.className === 'box'){
      console.log('box');
      return;
    }
    if(ev.target.className === 'outer'){
      console.log('outer');
      return;
    }
    if(ev.target.className === 'inner'){
      console.log('inner');
      return;
    }
  } 
<!-- 样式 -->
<style>
    .box {
      margin: 0 auto;
      padding-top: 60px;
      width: 400px;
      height: 300px;
      background: lightblue;
    }
    .outer {
      margin: 0 auto;
      padding-top: 50px;
      width: 200px;
      height: 200px;
      background: lightcoral;
    }
    .inner {
      margin: 0 auto;
      /* padding-top: 20px; */
      width: 100px;
      height: 100px;
      background: lightsalmon;
    }
  </style>

  <!-- 结构 -->
  <body>
  <div class="box">
    <div class="outer">
      <div class="inner"></div>
    </div>
  </div>
</body>

mouseover和mouseenter区别

  // 还是以上面的结构为例子
let box = document.querySelector('.box'),
      outer = document.querySelector('.outer');

 box.onmouseover = function(){
   console.log('box mouseover')
 }
 box.onmouseout = function(){
   console.log('box mouseout')
 }
// 从父元素滑入到子元素,属于离开父元素,滑入新的元素,会触发onmouseover/onmouseout
// onmouseover/onmouseout 是按照鼠标在谁上面来决定的


 box.onmouseenter = function(){
   console.log('box mouseenter')
 }
 box.onmouseleave = function(){
   console.log('box mouseleave')
 }
 // 从父元素滑入到子元素,任然属于在父元素内,并不会触发父元素的mouseleave
 // nonmouseleave/onmouseenter  是按照元素层级来决定的,且默认阻止了事件冒泡传播机制
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值