位置: 编程技术 - 正文

jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理(jquery源码是什么水平)

编辑:rootadmin

推荐整理分享jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理(jquery源码是什么水平),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:jquery源码是什么水平,jquery源码是什么水平,jquery animate源码,jquery.min.js源代码,jquery源码实现原理,jquery源码实现原理,jquery源码是什么水平,jquery源码实现原理,内容如对您有帮助,希望把文章链接给更多的朋友!

发现一个小点,先前没有注意的

  jQuery重载stopPropagation函数调用的本地事件对象的stopPropagation函数阻止冒泡。也就是说,阻止冒泡的是当前节点,而不是事件源。

  说到触发事件,我们第一反应是使用$(...).click()这种方式触发click事件。这种方式毫无疑问简洁明了,如果能使用这种方式推荐使用这种方式。但是如果是自定义事件呢?比如定义一个$(document).on("chuaClick","#middle",fn);这种情况怎么触发事件?这就要用到$("#middle").trigger("chuaClick")了。

a.触发事件低级API——jQuery.event.trigger

  trigger函数对所有类型事件的触发提供了支持。这些事件主要分为两类:普通浏览器事件(包含带有命名空间的事件如"click.chua")、自定义事件。因为要统一处理,所以函数内部实现没有调用.click()这种方式来对普通浏览器事件做捷径处理,而是统一流程。处理过程如下

  1.获取要触发的事件(传入的event可能是事件类型而不是事件对象)

  2.修正浏览器事件(主要有修正事件源)和组合正确的事件处理参数data

  后面这段组合事件处理参数列表data在后面处理时调用

  3.判断是否是特殊节点对象的的特殊事件,是的话特殊处理

  这里面需要特殊处理的事件比较少,这里列一下

  4.从事件源开始遍历父节点直到Window对象,将经过的节点保存(保存到eventPath)下来备用

  5.循环先前保存的节点,访问节点缓存,如果有对应的事件类型处理队列则取出其绑定的事件(入口函数)进行调用。      

  6. 最后处理浏览器默认事件,比如submit标签的提交表单处理。

  注意:普通事件加上命名空间仍然属于普通事件,普通调用方式依然其作用。比如$(document).on('click.chua',"#id",fn1).on("click","#id",fn2);当点击“#id”节点的时候fn1依然会被调用。触发指定命名空间事件的唯一方式是trigger:$("#id").trigger("click.chua"),此时只会调用fn1。

  从第4、5个步骤可以看到trigger的另外一个巨大作用——模拟冒泡处理。后面会分析到

b. 事件特殊处理jQuery.event.special(主要有事件替代、模拟冒泡)详解

  委托设计是基于事件可冒泡的。但是有些事件是不可冒泡的,有的事件在不同的浏览器上支持的冒泡情况不同。还有不同的浏览器支持的事件类型也不尽相同。这些处理主要都被放在jQuery.event.special中。jQuery.event.special对象中保存着为适配特定事件所需的变量和方法。

  具体有:

delegateType / bindType (用于事件类型的调整)setup (在某一种事件第一次绑定时调用)add (在事件绑定时调用)remove (在解除事件绑定时调用)teardown (在所有事件绑定都被解除时调用)trigger (在内部trigger事件的时候调用)noBubble_defaulthandle (在实际触发事件时调用)preDispatch (在实际触发事件前调用)postDispatch (在实际触发事件后调用)

  看一下模拟冒泡的函数simulate

  看到没有,真正模拟冒泡函数是jQuery.event.trigger函数

special第一组

  这里面涉及到冒泡处理的问题。

  focus/blur本来是不冒泡的,但是我们依然可以通过$(document).on('focus ','#left',fn)来绑定,是怎么做到的?我们来看jQuery的处理

  第一步,将focus绑定的事件转化为focusin来绑定,focusin在W3C的标准中是冒泡的,除开火狐之外的浏览器也确实支持冒泡(火狐浏览器focusin/focusout支持冒泡的兼容后面会详解)

type = ( selector &#; special.delegateType : special.bindType ) || type;

  然后,根据新得到的type类型(focusin)获取新的special

special = jQuery.event.special[ type ] || {};  

jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理(jquery源码是什么水平)

获取的special结果为

  再然后,就是绑定事件,绑定事件实际上就对focusin、focusout做了兼容处理,源码中第一个判断有special.setup.call(…)这段代码,根据上面setup函数可见第一次进入的时候实际上是通过setup函数中的document.addEventListener( orig, handler, true )绑定事件,注意:第一个参数是是orig,因为火狐不支持focusin/focusout所以jQuery使用focus/blur替代来监听事件;注意第三个参数是true,表示在事件捕获阶段触发事件。

  我们知道任何浏览器捕获都是从外层到精确的节点的,所有的focusin事件都会被捕获到,然后执行handler函数(里面是jQuery.event.simulate函数,源码略)。其他事件绑定则进入if分支将事件直接绑定到elem上

special第二组:mouseenter/mouseleave

  需要注意的是只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件。对应mouseleave这样的话,mouseenter子元素不会反复触发事件,否则在IE中经常有闪烁情况发生

  使用mouseover/out和事件时机检测创建mouseenter/leave事件有个关键的判断

  其中!jQuery.contains( target, related )表示related在target外面。我们使用图例来解释

  我们假设处理的是mouseenter事件,进入target。

  鼠标从related到target,很明显related在target外面,所以当鼠标移动到target的时候满足条件,调用处理。

  

  现在反过来,很明显related在target里面,那么鼠标之前就处于mouseenter状态(意味着之前就进行了mouseenter处理器处理),避免重复调用当然是不进行任何处理直接返回了。

  

  我们假设处理的是mouseleave事件,离开target。

  鼠标从target到related,很明显related在target里面,所以当鼠标移动到related的时候依然么有离开target,不做处理。

  

  鼠标从target到related,很明显related在target外面,所以当鼠标移动到related的时候已经离开了target的范围,做处理。

  

special第三组:submit和change

主要是ie下submit不能冒泡的处理

  jQuery.event.special.submit主要有一下几个特征

  setup  postDispatch  teardown

  根据添加事件的代码可知添加事件的时候如果符合条件则会调用setup来添加事件

if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false )

  jQuery在ie下模拟submit事件以click和keypress替代,只不过是添加了命名空间来区别和普通click和keypress事件。

  在事件调用过程中(dispatch)会调用postDispatch来处理

  teardown用在删除事件绑定中

  ie下change事件的处理和submit类似,事件使用beforeactivate替代来监听,处理函数变成了handle,在事件分发(dispatch)中执行代码

主要源码如下

  OK,到此,事件系统也告一个段落了,谢谢大家多多支持。

Jquery ajax加载等待执行结束再继续执行下面代码操作 Jquery等待ajax执行完毕再继续执行下面代码的效果,具体代码如下,其实就是将jqueryajax函数的async参数设置为false即可,该参数默认为true:$(document).ready(f

jQuery插件实现无缝滚动特效 首先来看下html骨架,如下:divclass="box"ulli/lili/lili/li/ul/div结构简单明了,没什么说的。讲下实现原理:divbox是最外层盒子,给它指定的宽高,记

基于jquery实现简单的手风琴特效 手风琴效果是项目中使用频率较高的一种效果,本文实例J就为大家讲述了jquery实现简单的手风琴特效代码。分享给大家供大家参考。具体如下:运行效

标签: jquery源码是什么水平

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

上一篇:jQuery实现带分组数据的Table表头排序实例分析(jquery分页组件)

下一篇:Jquery ajax加载等待执行结束再继续执行下面代码操作

  • 商品流通企业税种有哪些
  • 企业申报个税软件怎么下载
  • 公关支出是什么意思
  • 交了9个点的工程增值税不可以抵扣吗
  • 光盘税收分类编码是多少
  • 其他应收款利息收入会计分录怎么写
  • 员工全额承担社保账务怎么做?
  • 代扣代缴增值税纳税义务发生时间
  • 我公司给对方公司付款
  • 已扣缴税额
  • 预付款什么时候确认收入
  • 外贸企业人民币结算
  • 开业赠送礼品会计属于什么费用
  • 当月作废的采购发票已认证账务如何处理?
  • 进口缴纳关税
  • 公司购买固定资产需要交印花税吗
  • 置换补贴款
  • 什么企业不可以开通信保订单服务
  • 员工借款收不回来账务处理
  • 其他应付款注销时怎么冲平
  • 物流公司进项票多了,可以帮人开票吗
  • 生产调试消耗原材料如何做账?
  • 期末留抵税额可以冲减欠税吗
  • 水土保持补偿费收费依据
  • 小规模纳税人的条件
  • 收回已核销的坏账并入账是什么意思
  • 固定资产属于金融负债吗
  • 子公司开票给母公司,冲减利润,怎么避免税务风险
  • .exe是指什么文件
  • 购买免税农产品可以抵扣进项税
  • 企业所得税申报表模板
  • vue中使用nodejs
  • css滚动条自动滚动
  • 深度学习参数初始化(二)Kaiming初始化 含代码
  • 资产计税基础填资产原值吗
  • 货物出库入库怎么记账
  • 删除sql server2019
  • mysql5.7压缩包安装配置教程
  • python如何运用
  • 将织梦dedecms转换到wordpress
  • 票据粘贴顺序是什么
  • 固定资产投资额在财务报表中怎么体现
  • SQL Server通过重建方式还原master数据库
  • mysql语句性能优化
  • mysql proxy问题的解决方法
  • 企业缴纳员工社保会计分录
  • 公司注销时发现有预付款
  • 借支单是会计算做还是出纳做
  • 水电费收据可以入公司帐吗
  • 收到厂家返利账务处理
  • 进项税和销项税月末怎么结转
  • 对方公司收钱不开发票怎么办
  • 会计证异地可以考吗
  • 私营企业归谁管
  • 企业应该设置几个安全管理人员
  • sqlserver not in 语句使程充崩溃
  • fedora改密码
  • 微软桌面 ios
  • cmos开机密码的清除的二种方法
  • centos7 中文支持
  • 系统装在从盘
  • windows7笔记本无线网络连接
  • 安装win8正在安装应用要多久
  • WIN10系统安装教程
  • 批处理常用命令总结
  • jQuery javascript获得网页的高度与宽度的实现代码
  • node.js使用的v8引擎是由哪个公司开发的
  • 基于nodejs的项目
  • dos命令查看磁盘分区
  • js的继承方式
  • 浅谈会计诚信与职业道德论文
  • 关于全局变量和局部变量说法不正确的是
  • jquery使用教程
  • unity mesh编程
  • 开发者共享是什么意思
  • javascript的for循环
  • 进项税额的抵扣凭证
  • 黄金增值税管理难点
  • 征地税税率是多少
  • 财政部国家税务总局2021年40号
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设