位置: 编程技术 - 正文

JavaScript事件代理和委托详解

编辑:rootadmin

推荐整理分享JavaScript事件代理和委托详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在javasript中,代理、委托经常出现。

那么它究竟在什么样的情况下使用?它的原理又是什么?

这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口。

JavaScript事件代理事件代理在JS世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。

这主要得益于浏览器的事件冒泡机制,下面我们具体举个例子来解释如何使用这个特性。

这个例子主要取自David Walsh的相关文章(How JavaScript Event Delegation Works)。

假设有一个 UL 的父节点,包含了很多个 Li 的子节点:

当我们的鼠标移到Li上的时候,需要获取此Li的相关信息并飘出悬浮窗以显示详细信息,或者当某个Li被点击的时候需要触发相应的处理事件。

我们通常的写法,是为每个Li都添加一些类似onMouseOver或者onClick之类的事件监听。

如果这个UL中的Li子元素会频繁地添加或者删除,我们就需要在每次添加Li的时候都调用这个addListenersLi方法来为每个Li节点添加事件处理函数。

这会造成添加或者删除过程的复杂度和出错的可能性。

解决问题方法是使用事件代理机制,当事件被抛到更上层的父节点的时候,我们通过检查事件的目标对象(target)来判断并获取事件源Li。

下面的代码可以完成想要的效果:

为父节点添加一个click事件,当子节点被点击的时候,click事件会从子节点开始向上冒泡。父节点捕获到事件之后,通过判断e.target.nodeName来判断是否为我们需要处理的节点。并且通过e.target拿到了被点击的Li节点。从而可以获取到相应的信息,并作处理。

事件冒泡及捕获浏览器的事件冒泡机制,对于事件的捕获和处理,不同的浏览器厂商有不同的处理机制,这里介绍W3C对DOM2.0定义的标准事件。

DOM2.0模型将事件处理流程分为三个阶段:

一、事件捕获阶段,

JavaScript事件代理和委托详解

二、事件目标阶段,

三、事件起泡阶段。

如下图:

事件捕获:当某个元素触发某个事件(如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件相应的监听函数是不会被触发的。

事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。

事件起泡:从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。

jQuery和Dojo中delegate函数下面看一下Dojo和jQuery中提供的事件代理接口的使用方法。

jQuery:

jQuery的delegate的方法需要三个参数,一个选择器,一个时间名称,和事件处理函数。

而Dojo的与jQuery相似,仅是两者的编程风格上的差别:

Dojo的delegate模块在dojox.NodeList中,提供的接口与jQuery一样,参数也相同。

通过委托, 能够体会到使用事件委托对于开发带来的几个好处:

1.管理的函数变少了。不需要为每个元素都添加监听函数。对于同一个父节点下面类似的子元素,可以通过委托给父元素的监听函数来处理事件。

2.可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。

3.JavaScript和DOM节点之间的关联变少了,这样也就减少了因循环引用而带来的内存泄漏发生的概率。

在JavaScript编程中使用代理上面介绍的是对DOM事件处理时,利用浏览器冒泡机制为DOM元素添加事件代理。其实在纯JS编程中,我们也可以使用这样的编程模式,来创建代理对象来操作目标对象.

上面的例子中,通过调用delegate()函数创建的代理函数d来操作对a的修改。

这种方式尽管是使用了apply(call也可以)来实现了调用对象的转移,但是从编程模式上实现了对某些对象的隐藏,可以保护这些对象不被随便访问和修改。

在很多框架中都引用了委托这个概念用来指定方法的运行作用域。

比较典型的如dojo.hitch(scope,method)和ExtJS的createDelegate(obj,args)。

标签: JavaScript事件代理和委托详解

本文链接地址:https://www.jiuchutong.com/biancheng/373417.html 转载请保留说明!

上一篇:JS实现的网页上的颜色拾色器(js怎么做网页)

下一篇:JS表单验证的代码(常用)(js表单验证代码Email)

  • 销售商品返还现金
  • 临时性雇佣人员是指
  • 不含税的销售额乘以税率等于什么
  • 专票要写开户行和账号
  • 金蝶财务系统录入发票
  • 公司团体体检的洽谈
  • 红发票和蓝发票
  • 进项税额转出是在借方还是贷方
  • 滞纳金海关
  • 可以采用三栏式的明细账的有
  • 营改增后建筑业怎么开票
  • 企业取得5%的房产增值税发票是否可以抵扣呢?
  • 盘亏的设备做营业外支出的会计分录怎么处理?
  • 定额发票已经取得怎么办
  • 税务行政复议范围不包括
  • 所得税预缴申报表利润
  • 建筑企业在四库一平台找不到
  • 快递费开专票怎么入账
  • 税务申报没报上怎么办
  • 企业会计准则规定我国企业的会计期间按年度划分
  • 研发费用的
  • 不开票的收入怎么办
  • 社保已申报未缴费可以减员吗
  • 总分公司合并缴纳个税
  • 基准收益率是
  • 其他暂收应付款项有哪些
  • 雨林木风u盘pe装系统教程
  • 什么是主营业务税金及附加
  • 出口退税运费的账务处理
  • html无刷新跳转
  • 酒店损益类科目包括哪些
  • 灯光璀璨的夜晚
  • 建行e信通怎么提现怎么操作
  • 2、传统的目标设定过程目的重在________
  • 进项税额认证后可以撤销吗
  • 列入固定资产的金额标准
  • 公司注销税款太多
  • python 操作数据库
  • 固定资产折旧计算表模板
  • 代开发票含税价怎么核算为不含税发票?
  • 车辆购置税相关法律规定
  • 营业成本指的什么
  • 事业单位小规模纳税人增值税账务处理
  • 招待客户的住宿费发票可以报销吗
  • 商场返现活动怎么入账
  • 委外加工物资管理制度
  • 社区居委会有哪些成员
  • 计提税金用什么附件
  • 公司基建维修承诺书
  • 电子商务交易类应用发展现状
  • 资本金利润率正常范围
  • 测绘费计入什么明细科目
  • 商贸公司会计成本核算方法
  • 企业会计准则第4号固定资产
  • 公司的残保金是分摊到员工身上的吗
  • 年中重新建账还要年初数吗?
  • 数据库性能优化面试题
  • 加入黑名单后对方发信息显示什么
  • windows许可证即将过期怎么办知乎
  • centos直接进入命令行
  • linux终端记录
  • OS X 10.12.6 beta 1如何更新 OS X 10.12.6 beta 1如何升级
  • pb程序是什么
  • 如何在xp系统中调整移动硬盘
  • windows1020h2版本怎么样
  • 删除window
  • win10如何更换
  • win7电脑全屏
  • linux应用程序在哪个目录
  • 安装ghost win7
  • 直接利用外资
  • jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
  • koa与node.js开发实战
  • jquery弹窗弹出一个页面
  • 解决jQuery ajax请求在IE6中莫名中断的问题
  • 税务稽查时间最长多久?
  • 怎么在开票系统导出开票明细
  • 建设工程造价咨询合同需要交印花税吗
  • 办税服务厅是税收工作的
  • 耕地占用税减免支持项目发展
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设