当前位置: 首页 > news >正文

事件委托的小应用

事件委托

事件委托
利用冒泡原理,把事件加到父级元素上,触发事件的执行效果

优点:

  • 节省内存开销

  • 对于追加的节点同样有效

举了例子,创建一堆无序列表,我们希望当鼠标滑过的时,改变当前 <li> 的背景颜色

<ul id="ulBox">
    <li>Event commission</li>
    <li>mountain</li>
    <li>leopard</li>
    <li>tiger</li>
    <li>Stalin</li>
    <li>Hitler</li>
    <li>Barton</li>
</ul>
    var ulBox = document.getElementById("ulBox");
    var li = document.getElementsByTagName("li");
    var l = li.length;
    for(i=0;i<l;i++){
        li[i].onmouseover=function(){
            this.style.background="red";
        }
        li[i].onmouseout=fucntion(){
            this.style.background="";
        }
    }

这样,我们已经为每个 <li> 都添加了事件,但是,这个事件循环了 i 次,比较消耗性能。

用事件代理也可以实现同样的效果

    var ulBox = document.getElementById("ulBox");
    ulBox.onmouseover = function(e){
        var hover = e||window.event;//获取事件对象,
        var nodeLi = hover.target||hover.srcElement;//获取事件对象的具体子元素
        nodeLi.style.background="red";
    }
    
    ulBox.onmouseout = function(e){
        var hover = e||window.event;//获取事件对象,
        var nodeLi = hover.target||hover.srcElement;//获取事件对象的具体子元素
        nodeLi.style.background="red";
    }

如果我们要追加几个 <li> ,使用一个<button>按钮来添加元素

<input type="button" value="添加" id="btn">
<ul id="ulBox">
    <li>Event commission</li>
    <li>mountain</li>
    <li>leopard</li>
    <li>tiger</li>
    <li>Stalin</li>
    <li>Hitler</li>
    <li>Barton</li>
</ul>

如果使用常规方法

    var ulBox = document.getElementById("ulBox");
    var li = document.getElementsByTagName("li");
    var btn = document.getElementById("btn");
    var l = li.length;
    for(i=0;i<l;i++){
        li[i].onmouseover=function(){
            this.style.background="red";
        }
        li[i].onmouseout=fucntion(){
            this.style.background="";
        }
        btn.onclick=function(){
            var oLi = document.createElement("li");
            oLi.innerHTML="Low";
            ulBox.appendChild(oLi);
        }
    }

新加入的 <li> 并不能响应滑过变色的事件,因为在添加完元素之前,循环已经执行完毕。

使用事件委托,即可以直接响应事件效果

        ulBox.onmouseover=function(e){
            var hover=e||window.event;
            var nodeLi=hover.target||hover.srcElement;
            nodeLi.style.background="red";
        }
        ulBox.onmouseout=function(e){
            var hover=e||window.event;
            var nodeLi=hover.target||hover.srcElement;
            nodeLi.style.background="";
        }
       
        btn.onclick=function(){
            var oLi = document.createElement("li");
            oLi.innerHTML="Low";
            ulBox.appendChild(oLi);
        }

相关文章:

  • WP_Query的使用方法
  • docker容器互联 分离部署PHP 和 nginx(端口映射方式)
  • mongoose post方法总结and疑点
  • 算法导论笔记——第十二~十四章 数据结构(二)树
  • 招Java工程师一名
  • React Native商城项目实战10 - 个人中心中间内容设置
  • shell中的并且、和、或者
  • 时间控件-pikaday.js
  • POJ 1328 Radar Installation贪心算法
  • 分享我的第一次Selenium自动化测试框架开发过程
  • Android 透明度对照表
  • git命令
  • 高级查询
  • Scott Guthrie访谈:定制仪表板与Azure Monitor
  • 打包新版本上传到AppStore时报错 ERROR ITMS-90034:
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 11111111
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • httpie使用详解
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Web设计流程优化:网页效果图设计新思路
  • 从0到1:PostCSS 插件开发最佳实践
  • 回流、重绘及其优化
  • 世界上最简单的无等待算法(getAndIncrement)
  • 跳前端坑前,先看看这个!!
  • 详解NodeJs流之一
  • gunicorn工作原理
  • Prometheus VS InfluxDB
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (规划)24届春招和25届暑假实习路线准备规划
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一) storm的集群安装与配置
  • (一)80c52学习之旅-起始篇
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net/c# memcached 获取所有缓存键(keys)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /bin/rm: 参数列表过长"的解决办法
  • @property python知乎_Python3基础之:property
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [].slice.call()将类数组转化为真正的数组
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2018-01-08] Python强化周的第一天
  • [Android] Upload package to device fails #2720
  • [Android学习笔记]ScrollView的使用