event对象中 target和currentTarget 属性的区别

来自:https://www.cnblogs.com/yewenxiang/p/6171411.html

首先本质区别是:

  • event.target返回触发事件的元素

  • event.currentTarget返回绑定事件的元素

????举个例子:

  

 1     <ul id="ul">ul
 2         <li>li<a href="">a</a></li>
 3         <li>li<a href="">a</a></li>
 4         <li>li<a href="">a</a></li>
 5     </ul>
 6     <script>
 7         var ul = document.getElementById("ul");
 8         ul.onclick = function(event){
 9             var tar = event.target;
10             var tagName = tar.nodeName.toLowerCase();
11             console.log("你点击了:"+tagName);
12             event.preventDefault();
13         }
14     </script>

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

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

  

 1 <ul id="ul">ul
 2         <li>li<a href="">a</a></li>
 3         <li>li<a href="">a</a></li>
 4         <li>li<a href="">a</a></li>
 5     </ul>
 6     <script>
 7         var ul = document.getElementById("ul");
 8         ul.onclick = function(event){
 9             var tar = event.target;
10             var current = event.currentTarget;
11             var tagName = tar.nodeName.toLowerCase();
12             console.log(tar == this);
13             event.preventDefault();
14         }
15     </script>

实际使用中target的妙用:

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

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

 1   <input type="text" id="text">
 2     <input type="button" value="添加" id="button">
 3     <ul>
 4         <li>第1个<button class="btn" id="1">删除</button></li>
 5         <li>第2个<button class="btn" id="2">删除</button></li>
 6         <li>第3个<button class="btn" id="3">删除</button></li>
 7     </ul>
 8     <script>
 9             var button = document.getElementById("button");
10             var text = document.getElementById("text");
11             var ul = document.getElementsByTagName("ul")[0];
12             var btnClass = document.getElementsByClassName("btn");
13         button.onclick = function(){
14             var deleteButton = document.createElement("button");
15             var value = text.value;
16                 deleteButton.setAttribute("class","btn");
17             var deleteText = document.createTextNode("删除");
18                 deleteButton.appendChild(deleteText);
19             var li = document.createElement("li");
20             var liText = document.createTextNode(value);
21                 li.appendChild(liText);
22                 li.appendChild(deleteButton);
23                 ul.appendChild(li);
24             for(var i=0;i<btnClass.length;i++){
25                 btnClass[i].onclick=function(){
26                 this.parentNode.parentNode.removeChild(this.parentNode);
27             }
28         }
29         }
30
31             for(var i=0;i<btnClass.length;i++){
32                 btnClass[i].onclick=function(){
3334                     this.parentNode.parentNode.removeChild(this.parentNode);
35                 }
36             }
37     </script>

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

 1 <script>
 2             var button = document.getElementById("button");
 3             var text = document.getElementById("text");
 4             var ul = document.getElementsByTagName("ul")[0];
 5             var btnClass = document.getElementsByClassName("btn");
 6         button.onclick = function(){
 7             var deleteButton = document.createElement("button");
 8             var value = text.value;
 9                 deleteButton.setAttribute("class","btn");
10             var deleteText = document.createTextNode("删除");
11                 deleteButton.appendChild(deleteText);
12             var li = document.createElement("li");
13             var liText = document.createTextNode(value);
14                 li.appendChild(liText);
15                 li.appendChild(deleteButton);
16                 ul.appendChild(li);
17             }
18             ul.onclick = function(event){
19                 var tar = event.target;
20                 if(tar.nodeName.toLowerCase() == "button"){
21                     tar.parentNode.parentNode.removeChild(tar.parentNode);
22                 }
23             }
24     </script>

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

原文地址:https://www.cnblogs.com/sanerandm/p/8513579.html

时间: 2024-08-12 06:20:51

event对象中 target和currentTarget 属性的区别的相关文章

event对象中 target和currentTarget 属性的区别。

首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 ????举个例子: 1 <ul id="ul">ul 2 <li>li<a href="">a</a></li> 3 <li>li<a href="">a</a></li> 4 <li>li<a href

JavaScript事件属性event.target和currentTarget 属性的区别。

event.target 获取的是触发事件的标签元素 event.currentTarget 获取到的是发起事件的标签元素 一.事件属性:event.target target事件委托的定义:本来该自己干的事,但是自己不干,交给别人来干 例子1 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title></title> 7 <

event对象中offsetX,clientX,pageX,screenX的区别

1.offsetXoffset意为偏移量,是事件对象距左上角为参考原点的距离.以元素盒子模型的内容区域的左上角为参考点.不包括border.2.clientX事件对象相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条3.pageX事件对象相对于整个文档的坐标以像素为单位.4.screenX事件对象相对于设备屏幕的左上角的坐标,当改变屏幕的分辨率的时候,坐标会随之改变. 以上除了screenX/Y以设备像素为单位,其他都是以css像素为单位下面以一个实例来解释说明 <!

JavaScript 判断对象中是否有某属性

因为后端返回一个对象后,这个对象经常会出现缺少属性的情况 一个解决方法就是接受到数据后判断对象中是否有该属性,无的话加上属性和默认值 那么如何判断是否有该属性呢: test.hasOwnProperty('name') //true 自身属性 test.hasOwnProperty('age') //false 不存在 test.hasOwnProperty('toString') //false 原型链上属性 使用hasOwnProperty()就很容易知道了. 原文地址:https://ww

input中id和name属性的区别

input中id和name属性的区别 做网站很久了,但到现在还没有搞明白input中name和id的区别,最近学习jquery,又遇到这个问题,就在网上搜集资料.看到这篇,就整理出来,以备后用. 可 以说几乎每个做过Web开发的人都问过,到底元素的ID和Name有什么区别阿?为什么有了ID还要有Name呢?! 而同样我们也可以得到最classical的答案:ID就像是一个人的身份证号码,而Name就像是他的名字,ID显然是唯一的,而Name是可以重复 的. 上周我也遇到了ID和Name的问题,在

图解Js event对象offsetX, clientX, pageX, screenX, layerX, x区别

通过 3 张图和 1 张表格,轻松区别 JavaScript Event 对象中的offsetX, clientX, pageX, screenX, layerX, x等属性. 一.测试代码如下: <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <title>Javascript</title> <st

Event对象中的target属性和currentTarget属性的区别

先上结论: Event.target:触发事件的元素: Event.currentTarget:事件绑定的元素: 通过下面的例子来理解这两个属性的区别: 使用Event.target属性的例子:(我在<body>和<button>上都绑定了click事件) 1 <body onclick="mouseEvent1()"> 2 <button onclick="mouseEvent2()">点我</button&g

微信小程序中target与currentTarget

如有错误,请纠出,大家一起进步!!! target在事件流的目标阶段:currentTarget在事件流的捕获,目标及冒泡阶段.但事件流处于目标阶段,target与currentTarget指向一样, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象.在微信小程序中也可总结为:target指向发生事件的组件,currentTarget指向绑定事件的组件. 下面请看例子: text.wxml: <view class="view1&

Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新

一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vue.$set(target,key,value):可以动态的给数组.对象添加和修改数据,并更新视图中数据的显示. vue在构造函数new Vue()时,就通过Object.defineProperty中的getter和setter 这两个方法,完成了对数据的绑定.所以直接通过vm.arr[1] =