【JS】事件委托

作者: 德育处主任 | 来源:发表于2019-01-25 07:24 被阅读2次
微信订阅号:Rabbit_svip

事件委托,主要思想是:

给父级元素定义一个事件(比如 onclick 点击事件)。

父级元素触发这个事件后,就会命令手下的指定元素去完成某些事情。

主要用到的关键字:srcElementtarget

献上代码

/* 这里是CSS代码 */

.item, .other {
  width: 100px;
  height: 100px;
  margin: 20px;
  display: inline-block;
  font-size: 20px;
  font-weight: 600;
  text-align: center;
  line-height: 100px;
  color: #fff;}

.item {
  background-color: darkcyan;
}

.other {
  background-color: brown;
}
<!-- 这里是HTML代码 -->

<div id="box">
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="other">other</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="other">other</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="other">other</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="other">other</div>
  <div class="item">item</div>
</div>
/* 这里是JS代码 */
box.onclick = function(e) {
  var ev = e || event; // 兼容性写法

  /*
   * 兼容性写法
   * 老版火狐不兼容 srcElement
   * 老版IE不兼容 target
  */
  var iTarget = ev.srcElement || ev.target;
  if(iTarget.className == 'item') {
    iTarget.style.borderRadius = "50%";
  }
}
微信订阅号:Rabbit_svip

上面的例子

  1. 首先在HTML中定义一个容器div,id是box。

  2. 给box添加一个 onclick 事件。

  3. 当box 触发 onclick 后,就命令其下 className(类名)为 item 的元素,把 item 的圆角改成 50%。

如果类名不是 item,则不会发生任何事情 。

用事件委托的好处,就是省却写循环。而且攻击范围大,根本不用去想手下有多少个类名为 item 的元素。

如果需要大量修改其下的子元素(比如动画),用事件委托是一个非常不错的选择。




事件委托和事件绑定的区别

  • 事件绑定:只要给元素绑定一次,该事件就终身跟随该元素。不管元素怎么变。

  • 事件委托:只把事件交给指定的元素执行。只要元素不满足指定要求,则不执行事件。

事件绑定例子
/* CSS代码 */
#box {
  width: 200px;
  height: 200px;
  border: 1px solid cadetblue;
  margin: 20px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
}

.item {
  width: 100px;
  height: 100px;
  background-color: rgb(100, 149, 237);
}
<!-- HTML代码 -->
<div id="box">
  <div class="item" id="item"></div>
</div>
/* JS代码 */
item.onclick = function() {

  if(getComputedStyle(this, false)['backgroundColor'] == 'rgb(100, 149, 237)') {
    this.style.backgroundColor = 'rgb(147, 112, 219)';
  } else {
    this.style.backgroundColor = 'rgb(100, 149, 237)';
  }

  this.id = 'test';
}
微信订阅号:Rabbit_svip

可以看到,点击之前,id是item,点击之后,id是test。
但即使id改变了,那个事件依然绑定在该元素上。

上面用到 getComputedStyle 可以参考【JS】获取元素宽度



事件委托例子
/* CSS代码 */

#box {
  width: 200px;
  height: 200px;
  border: 1px solid cadetblue;
  margin: 20px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
}

.item {
  width: 100px;
  height: 100px;
  background-color: rgb(100, 149, 237);
}
<!-- HTML代码 -->

<div id="box">
  <div class="item" id="item"></div>
</div>
/* JS代码 */

box.onclick = function(e) {
  var ev = e || event;
  var iTarget = ev.srcElement || ev.target;
  if(iTarget.id == 'item') {
    if(getComputedStyle(iTarget, false)['backgroundColor'] == 'rgb(100, 149, 237)') {
      iTarget.style.backgroundColor = 'rgb(147, 112, 219)';
    } else {
      iTarget.style.backgroundColor = 'rgb(100, 149, 237)';
    }

    iTarget.id = 'test';
  }
}
微信订阅号:Rabbit_svip

因为事件是委托在id为 item 的元素上。当元素的 id 改变了,该事件就找不到指定元素了。

相关文章

  • web前端面试题@六(事件委托)

    *说到事件委托,我们首先先要知道什么是事件委托—— · 那么什么是事件委托呢??? JS里的事件委托就是当事件...

  • JS写事件代理

    js中的事件委托或是事件代理详解

  • 事件委托

    事件委托 事件委托其实就是利用JS事件冒泡机制把原本需要绑定在子元素的响应事件(click、keydown……)委...

  • js事件委托

    通过构建父元素和子元素,来控制事件。 先通过html构建父元素div,并嵌套一个子元素div,写入不同的方法,设置...

  • js事件委托

    事件委托:1、缘由在做一个项目,点击按钮出现蒙版,但是触发蒙版关闭蒙版,但是给蒙版添加点击事件的话,蒙版上的按钮也...

  • js事件委托

    我们收取快递有两种方法:一是在特定的地点等快递的到来,二是委托人代收。现实当中,我们大都采用委托的方案。而委托人接...

  • JS事件委托

    一、事件委托有三种方法 点击 btn.onclick = function(){...} btn.addEvent...

  • js事件委托

    前言 事件委托,也叫事件代理,是js事件中的一种常用技巧。事件委托的原理就是利用冒泡事件的机制,为一些节点的祖先节...

  • js事件委托

    定义:通俗的讲,事件就是onclick,onmouseover,onmouseout等就是事件,委托呢,就是让别人...

  • JS事件委托

    事件委托从字面意思上理解就是把事件委托给别人做。这样有什么好处呢?设想一下,一个ul里有很多li,现在要给每一个l...

网友评论

    本文标题:【JS】事件委托

    本文链接:https://www.haomeiwen.com/subject/qkwpjqtx.html