js事件委托的总结

news/2024/7/19 16:34:25 标签: js, 事件委托

事件委托:也叫事件代理,简单点说就是,把事件绑定到父级上,监听子元素的冒泡事件。至于什么是事件冒泡有疑问的请点击js中的事件,其中有对事件冒泡的详细解释

在使用事件委托的时候我们要知道的知识点有什么呢?

1、在利用事件委托的时候,我们还必须要知道一个概念:事件对象下的事件源

事件源:在事件中,当前操作的那个元素就是事件源。比如我们点击a标签发生onclick事件时,事件源就是a标签,当点击li发生onclick事件时,那么事件源就是li

怎么获取事件源呢?

在IE下:window.event.srcElement;

标准下:event.target

兼容性处理:var target = ev.target||ev.srcElement

2、找到当前元素的标签名:nodeName(是大写的要利用到toLowerCase()方法将其转化为小写)

写了这么多那么利用事件委托有什么好处呐?

1、可以提高性能

2、新添加的元素也会有之前的事件

至于体现在哪里,下面就用例子来带你来感受一下呗

HTML代码

<ul id="ul1">
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
</ul>

我们想要的效果就是当鼠标移入li时让对应的li背景颜色变为红色,移出变为原来的颜色

如果利用一般的写法是这样的

<script>
var oUl = document.querySelector('#ul1');
var aLi = oUl.querySelectorAll('li');
for(var i=0; i<aLi.length; i++){
    aLi[i].onmouseover = function(){
        this.style.background = 'red';
    }
    aLi[i].onmouseout = function(){
        this.style.background = '';
    }
}
</script>

再看看利用事件委托怎么做

<script>
var oUl = document.querySelector('#ul1');
oUl.onmouseover = function(ev){
    var ev = ev||event;//兼容性处理
    var target = ev.target||ev.srcElement;
    if(target.nodeName.toLowerCase()=='li'){
        target.style.background ='red';
    }
}
oUl.onmouseout = function(ev){
    var ev = ev||event;
    var target = ev.target||ev.srcElement;
    if(target.nodeName.toLowerCase()=='li'){
        target.style.background ='';
    }
}
</script>

上面的方法我们需要为每一个Li都绑定一个点击事件,而下面的方法我们只需要为父级绑定一个点击事件,li个数少的时候还好说,如果li有很多,可想而知,事件委托可以大大的提高性能

例子2、

HTML代码  

<ul id="ul1">
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
    <li>1111111111</li>
</ul>
<button id="btn">按钮</button>
我们希望点击按钮的时候,在ul里面再添加li,并且,鼠标每次移入时,li的背景颜色改变,移出时背景颜色变回来,我们知道如果用平常的方法,我们每添加一个li都要为它再添加一个移入移出事件,有多麻烦,你自己试试就知道了,但是如果我么用事件委托就不需要再为其每次都添加了,看下面代码(第一种想必大家都知道怎么做就不再写了,下面只写利用事件委托怎么写)
<script>
var oUl = document.querySelector('#ul1');
var oBtn = document.querySelector('#btn');
oUl.onmouseover = function(ev){
    var ev = ev||event;
    var target = ev.target||ev.srcElement;
    if(target.nodeName.toLowerCase()=='li'){
        target.style.background ='red';
    }
}
oUl.onmouseout = function(ev){
    var ev = ev||event;
    var target = ev.target||ev.srcElement;
    if(target.nodeName.toLowerCase()=='li'){
        target.style.background ='';
    }
}
oBtn.onclick = function(){
    var ali = document.createElement('li');
    ali.innerHTML = '1111111111111';
    oUl.appendChild(ali);//不管我们在ul里面添加多少个li我么都不需要再次为其添加绑定事件
}
</script>
看完上面的是不是觉得事件委托真的很好用呢?所以赶紧用起来吧!

http://www.niftyadmin.cn/n/952221.html

相关文章

业务流程图6个图例_制作人人喜欢的流程图,三步教会你绘制大厂流程图

继帮大家解决了如何绘制流程图的难题后&#xff0c;本篇作者将帮助大家学习&#xff1a;如何绘制出研发喜欢看、运营看得懂的流程图。学习了上一篇“流程图的大厂画法”后&#xff0c;虽然能画出来了。但经常发现画的没问题&#xff0c;研发部却不看我们的流程图&#xff0c;运…

人应该怎样的活着?!

人到底应该怎么的活着&#xff0c;为自己&#xff0c;为他人&#xff0c;为利益&#xff0c;为爱情&#xff0c;为友情........有时真的感觉很迷茫&#xff0c;不知如何是好。毕业也快半年了&#xff0c;自己也真正意义走上了社会。在这个物欲横流的社会大潮中&#xff0c;有的…

python数据结构编程_python3实用编程技巧——数据结构

1. 如何拆分包含多种分隔符的字符串例&#xff1a; >>> sab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz********************str.split 缺点&#xff1a; 每次只能处理一种分隔符&#xff0c; 推荐&#xff1a;只有一个分隔符进行分割的时候使用***********************exte…

原生js实现弹性菜单功能

弹性菜单&#xff0c;主要运用到的是弹性运动。只要知道了弹性运动是怎样实现的&#xff0c;弹性菜单就很好实现了&#xff0c;下面我首先总结一下&#xff0c;我是怎样一步一步实现弹性运动的&#xff0c;然后再写弹性菜单的代码。 弹性运动用到的知识&#xff1a;js基础、dom…

数字的格式化(简单几个,不过觉得很有用)

12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 &#xffe5;12,345.00 12345.ToString("e"); //生成 1.234500e004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16进…

原生js实现拖动图片左右弹性切换(模仿iPhone弹性拖拽的功能)

因为弹性运动我在弹性菜单实例中已经列过详细的步骤了&#xff0c;所以此处不再赘述&#xff0c;有不懂的或有兴趣的请点击原生js实现弹性菜单 这个例子里面我们主要解决的问题有 1、弹性运动的实现&#xff08;不再详细讲解&#xff09; 2、怎样判断鼠标是向左拖动还是向右拖动…

报文加解密原理_通讯安全 - TLS基本原理

㈠ TLS 的成长史TLS 全称为Transport Layer Security&#xff0c;意指传输层安全&#xff0c;是解决网络安全的重量级武器。传输层安全最早由网景公司所开发&#xff0c;那时的名字还不叫TLS&#xff0c;而是SSL Secure Sockets Layer&#xff0c;即安全套接字层。 TCP/IP 的四…

转:ASP.Net下两种全局变量的设置和读取方法

本文介绍两种ASP.Net项目中全局变量使用的方式。web.config文件 和 Gloab文件。以下分别说明&#xff1a;方法一&#xff1a;web.config文件——设置&#xff1a;在web.config文件里添加关键字key是通过<appSettings>标记来实现的&#xff0c;但是appSettings标记通常放在…