博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS中的事件委托
阅读量:5156 次
发布时间:2019-06-13

本文共 3112 字,大约阅读时间需要 10 分钟。

什么是事件委托:
 
    通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托的呢就是让别人来做,这个时间本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
 
原理:
    利用冒泡的原理,把事件加到父级上,触发执行效果。
 
优点:
   1. 提高性能。
例如:需要触发每个li来改变他们的背景颜色。
  • aaaa
  • aaaa
  • aaaa
window.onload = function(){    //获取到ul    var oUl = document.getElementById('ul');    //获取到所有的li    var aLi = oUl.getElementsByTagName('li');    //遍历li    for(var i = 0;i < aLi.length;i ++){        //给所移入的li添加事件        aLi[i].onmouseover = function(){            this.style.background = 'red';        }        //添加移出事件        aLi[i].onmouseout = function(){            this.style.background = '';        }    }}
这样就可以做到li上面添加鼠标事件。
 
但是如果说我们可能有很多个li用for循环的话就比较
影响性能
 
下面我们可以用事件委托的方式来实现这样的效果。(html不变)
/*利用事件委托实现*/window.onload = function(){    //获取到ul    var oUl = document.getElementById('ul');    //获取到所有的li    var aLi = oUl.getElementsByTagName('li');/*    这里要用到事件源:event对象,事件源,不管在那个事件中,只要你操作的那个元素就是事件源。    兼容:        IE:window.event.srcElement        标准下:event.target        nodeName:找到元素的标签名*/oUl.onmouseover = function(e){    var e = e || window.event;//兼容    var target = e.target || e.srcElement;    //alert(target.innerHtml);//undefined    //将大写改为小写 事件源中英文都是大写        if(target.nodeName.toLowerCase() == 'li'){            target.style.background = 'red';    }}oUl.onmouseout = function(e){    var e = e || window.event;//兼容    var target = e.target || e.srcElement;    //alert(target.innerHtml);//undefined    //将大写改为小写 事件源中英文都是大写    if(target.nodeName.toLowerCase() == 'li'){        target.style.background = '';        }    }}
优点:
    
2.新添加的元素还会有之前的事件。
还拿这个例子来看,但是我们要做动态的添加li。点击button动态添加li
例如:
/*不使用事件委托点击button动态添加li,新添加的li没有鼠标移入事件。*/window.onload = function () {    var oUl = document.getElementById("ul");    var aLi = oUl.getElementsByTagName("li");    var oBtn = document.getElementById("btn");    var iNow = 4;    for (var i = 0; i < aLi.length; i++) {        aLi[i].onmouseover = function () {            this.style.background = "red";    }        aLi[i].onmouseout = function () {            this.style.background = "";    }}oBtn.onclick = function () {    iNow++;    var oLi = document.createElement("li");    oLi.innerHTML = 1111 * iNow;    oUl.appendChild(oLi);    }}
这样做新添加的li没有鼠标移入事件。
 
因为点击添加的时候for循环已经执行完毕
 
那么我们就要用事件委托的方式来做 
window.onload = function () {    var oUl = document.getElementById("ul");    var aLi = oUl.getElementsByTagName("li");    var oBtn = document.getElementById("btn");    var iNow = 4;oUl.onmouseover = function (ev) {    var ev = ev || window.event;    var target = ev.target || ev.srcElement;    //alert(target.innerHTML);    if (target.nodeName.toLowerCase() == "li") {        target.style.background = "red";    }}oUl.onmouseout = function (ev) {    var ev = ev || window.event;    var target = ev.target || ev.srcElement;    //alert(target.innerHTML);    if (target.nodeName.toLowerCase() == "li") {        target.style.background = "";    }}oBtn.onclick = function () {    iNow++;    var oLi = document.createElement("li");    oLi.innerHTML = 1111 * iNow;    oUl.appendChild(oLi);    }}

 

转载于:https://www.cnblogs.com/1512344358qq/p/10388500.html

你可能感兴趣的文章
Java SE之正则表达式一:概述
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
js深度克隆对象、数组
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
团队工作第二天
查看>>
System类
查看>>
tableView
查看>>