JavaScript中事件委托(事件代理)详解

news/2024/7/1 13:03:07

 

在JavaScript的事件中,存在事件委托(事件代理),那么什么是事件委托呢?

事件委托在生活中的例子:

有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。

事件委托在JavaScript中:

比如要给一个dom节点添加一个点击事件,但是现在事件不加在该dom节点本身,而是加在它的父节点身上,利用它父节点触发事件,给该dom节点实现事件效果。

实现原理:

事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件 举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,让里面的ul,li,a实现事件效果,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

利用事件委托的作用
  • 节省资源,提高效率 在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间 如果使用事件委托,则只会与dom节点进行一次交互,有效的减少了和dom交互次数,节省资源,提高效率

  • 对于新创建的dom节点,也可以拥有事件

使用场景:
  • 重复的给dom节点添加事件
  • 给dom树中尚未创建的元素(动态创建)添加事件
使用js添加事件委托

先给出一个例子1:

<ul id="ul">
    <li>周一去游玩</li>
    <li>周二去上班</li>
    <li>周三去休息</li>
    <li>周四去吃饭</li>
</ul>

//利用事件委托给每一个li标签添加点击事件
<script>
    var ul = document.querySelector("#ul");
    ul.onclick = function(){
        alert("快醒醒,每天都要上班的!")
    }
</script>

  

例子中利用父级ul做事件处理,当li被点击时,由于冒泡原理,事件就会冒泡到ul上,因为ul上有点击事件,所以事件就会触发

在例子1中,所有的事件代码都相同,那么如果不同呢? 例子2:

    <ul id="ul">
        <li>周一去游玩</li>
        <li class="work-day">周二去上班</li>
        <li>周三去休息</li>
        <li>周四去吃饭</li>
    </ul>
<script>
    var ul = document.querySelector("#ul");
    ul.onclick = function(e) {
        var e = event || window.event;
        var target = e.srcElement || e.target;
        if(target.className == "work-day"){
            alert("good boy");
        }else{
            alert("快醒醒,每天都要上班的!");
        }
    }
</script>

  

这个例子中就会针对于class属性等于"word-day"的li元素做出不同的事件,其他事件则为默认事件

jQuery的事件委托
    $(function () {
        $('#ul').on('click', 'li', function () {
            if ($(this).hasClass('work-day')) {
                alert("good boy");
            } else {
                alert("快醒醒,每天都要上班的!");
            }
        })
    });

  


总结:

合理使用事件委托可以帮助我们节省资源,提高效率;也可以给dom中尚未创建的节点添加事件(可以自己尝试一下)。

适合用事件委托的事件:

  • click
  • mousedown
  • mouseup
  • keydown
  • keyup
  • keypress

需要小心的是:mouseover和mouseout虽然也有事件冒泡,但是需要特别的注意,因为需要经常计算它们的位置,处理起来不太容易。

不适合用事件委托的事件:

  • mousemove(每次都要计算它的位置,非常不好把控)
  • focus,blur等(本身就没用冒泡的特性,自然就不能用事件委托了)

转载于:https://www.cnblogs.com/Mr-Tao/p/10544770.html


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

相关文章

PostgreSQL逻辑备份恢复--pg_dump导出及psql导入案例

数据库导入导出是最常用的功能之一。PostgreSQL的备份工具可以使用pg_dump及pg_dumpall。可以通过pg_dump --help获取其使用方法。这里不对其做过多介绍。主要介绍在使用pg_dump及恢复过程中遇到的一个问题。 1、问题使用pg_dump -c导出后&#xff0c;通过psql导入时报下面的错…

分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)

分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)阅读目录 简介系统特色系统介绍 - 首页系统介绍 - 列表页系统介绍 - 明细页(表单)系统介绍 - 菜单/按钮系统介绍 - 权限中心系统介绍 - 数据权限系统介绍 - 字段权限系统介绍 - 下拉框应用细节结语简介 li…

单点登录 SSO Session

单点登录在现在的系统架构中广泛存在&#xff0c;他将多个子系统的认证体系打通&#xff0c;实现了一个入口多处使用&#xff0c;而在架构单点登录时&#xff0c;也会遇到一些小问题&#xff0c;在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。我将以我所遇到的…

求二维数组的最大子数组和

实验思路&#xff1a; 通过键入二维数组的信息构建二维数组&#xff0c;求出数组所有二位子数组的和并求出最大值 实验代码&#xff1a; package er_wei_shu_zu;import java.util.Scanner;public class rwsz {static Scanner scanner new Scanner(System.in);public static vo…

eclispe 实用插件大全

在一个项目的完整的生命周期中&#xff0c;其维护费用&#xff0c;往往是其开发费用的数倍。因此项目的可维护性、可复用性是衡量一个项目好坏的关键。而注释则是可维护性中必不可少的一环。 注释模板导入步骤 安装方法&#xff1a;打开eclipse/myeclipse选择 window-->P…

Web 性能优化:21 种优化 CSS 和加快网站速度的方法

摘要&#xff1a; 优化CSS。 原文&#xff1a;Web 性能优化&#xff1a;21 种优化 CSS 和加快网站速度的方法作者&#xff1a;前端小智Fundebug经授权转载&#xff0c;版权归原作者所有。 这是 Web 性能优化的第 4 篇&#xff0c;上一篇在下面看点击查看&#xff1a; Web 性能优…

NutzBoot v2.3.1 发布,支持 nacos 配置中心和 ftp 客户端

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; NutzBoot v2.3.1.v20190318 发布。NutzBoot 是以 Nutz 为核心的微服务解决方案&#xff0c;用小的开发成本快速搭建生产级微服务。 新版本支持 nacos 作为配置服务&#xff0c;添加了 ftp 客户端…

python并发模块之concurrent.futures(一)

Python3.2开始&#xff0c;标准库为我们提供了concurrent.futures模块&#xff0c;它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类&#xff0c;实现了对threading和multiprocessing的进一步抽象&#xff0c;对编写线程池/进程池提供了直接的支持,他属于上层的封装&…