美文网首页
event对象中 target和currentTarget 属性

event对象中 target和currentTarget 属性

作者: 夜未央_M | 来源:发表于2018-12-10 20:44 被阅读11次

首先本质区别是:

event.target返回触发事件的元素
event.currentTarget返回绑定事件的元素

例如:

<ul id="ul">
  ul
  <li>li<a href="">a</a></li>
  <li>li<a href="">a</a></li>
  <li>li<a href="">a</a></li>
</ul>
<script>
  var ul = document.getElementById("ul");
  ul.onclick = function(event) {
    var tar = event.target;
    var tagName = tar.nodeName.toLowerCase();
    console.log("你点击了:" + tagName);
    event.preventDefault();
  };
</script>

查看效果
https://images2015.cnblogs.com/blog/1043508/201612/1043508-20161213195409558-895348805.gif

当我点击哪个元素时,event.target返回的是点击的元素节点,我们可以用返回的节点使用一些DOM对象上的一些操作。这里event.preventDefault,是用来阻止点击a默认跳转,刷新页面导致结果不能输出来的一个作用。

event.currentTarget的作用是什么呢,我觉得他和this 的作用是差不多的,始终返回的是绑定事件的元素

<ul id="ul">
  ul
  <li>li<a href="">a</a></li>
  <li>li<a href="">a</a></li>
  <li>li<a href="">a</a></li>
</ul>
<script>
  var ul = document.getElementById("ul");
  ul.onclick = function(event) {
    var tar = event.target;
    var current = event.currentTarget;
    var tagName = tar.nodeName.toLowerCase();
    console.log(tar == this);
    event.preventDefault();
  };
</script>

查看效果
https://images2015.cnblogs.com/blog/1043508/201612/1043508-20161213200558714-2071145678.gif

实际使用中target的妙用:

target事件委托的定义:本来该自己干的事,但是自己不干,交给别人来干。比如上面的例子中,应该是ul li a 来监控自身的点击事件,但是li a自己不监控这个点击事件了,全部交给li父节点和a祖父节点ul来监控自己的点击事件。一般用到for循环遍历节点添加事件的时候都可以用事件委托来做,可以提高性能。

来个案例:一个添加删除的demo。

<input type="text" id="text" /> <input type="button" value="添加" id="button" />
<ul>
  <li>第1个<button class="btn" id="1">删除</button></li>
  <li>第2个<button class="btn" id="2">删除</button></li>
  <li>第3个<button class="btn" id="3">删除</button></li>
</ul>
<script>
  var button = document.getElementById("button");
  var text = document.getElementById("text");
  var ul = document.getElementsByTagName("ul")[0];
  var btnClass = document.getElementsByClassName("btn");
  button.onclick = function() {
    var deleteButton = document.createElement("button");
    var value = text.value;
    deleteButton.setAttribute("class", "btn");
    var deleteText = document.createTextNode("删除");
    deleteButton.appendChild(deleteText);
    var li = document.createElement("li");
    var liText = document.createTextNode(value);
    li.appendChild(liText);
    li.appendChild(deleteButton);
    ul.appendChild(li);
    for (var i = 0; i < btnClass.length; i++) {
      btnClass[i].onclick = function() {
        this.parentNode.parentNode.removeChild(this.parentNode);
      };
    }
  };

  for (var i = 0; i < btnClass.length; i++) {
    btnClass[i].onclick = function() {
      this.parentNode.parentNode.removeChild(this.parentNode);
    };
  }
</script>

查看效果
https://images2015.cnblogs.com/blog/1043508/201612/1043508-20161213202054151-349639415.gif

为什么在第24行也需要一个for循环,给每个删除按钮添加事件呢,因为外面的for循环,在文档刷新时给页面中存在的三个删除按钮添加了点击事件,而后来添加的删除按钮并没有绑定事件,导致页面中存在的三个li标签可以删除,而后来新添加的li不能删除这个问题。我们使用事件委托来做就不用这么麻烦了

<script>
  var button = document.getElementById("button");
  var text = document.getElementById("text");
  var ul = document.getElementsByTagName("ul")[0];
  var btnClass = document.getElementsByClassName("btn");
  button.onclick = function() {
    var deleteButton = document.createElement("button");
    var value = text.value;
    deleteButton.setAttribute("class", "btn");
    var deleteText = document.createTextNode("删除");
    deleteButton.appendChild(deleteText);
    var li = document.createElement("li");
    var liText = document.createTextNode(value);
    li.appendChild(liText);
    li.appendChild(deleteButton);
    ul.appendChild(li);
  };
  ul.onclick = function(event) {
    var tar = event.target;
    if (tar.nodeName.toLowerCase() == "button") {
      tar.parentNode.parentNode.removeChild(tar.parentNode);
    }
  };
</script>

给ul添加了点击事件,点击ul里面的子元素,event.target都会返回当前点击的元素节点,做一个判断,如果点击了button标签,删除这个li节点。由于添加的li都在ul节点里面,所以并不用再去添加li事件里面去写代码了,是不是很方便呢。

相关文章

网友评论

      本文标题:event对象中 target和currentTarget 属性

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