位置: 编程技术 - 正文

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加载等待执行结束再继续执行下面代码操作

  • 什么情况借钱
  • 个体工商户个税怎么申报
  • 增值税延期滞纳金是多少
  • 化粪池合同书
  • 简易计税费
  • 未开具发票负数的原因
  • 个体工商户的个人所得税如何申报
  • 代开运输发票是否预征企业所得税?
  • 工业企业提供劳务收入会计分录
  • 摊销直线法会计分录怎么写?
  • 冲销估价入账
  • 进项税抵扣销项税
  • 增值税普票跨月怎么冲红
  • 融资租赁的固定资产由承租方进行核算,体现了( )原则
  • 车间停产期间设施有哪些
  • 个人与个人之间转账有限额吗
  • 工薪个人所得税扣除
  • 金税三期个人所得税扣缴系统手机版
  • 实务操作中的税会差异有哪些?
  • 固定资产无形资产折旧时间起始
  • 两个公司领工资会不会合并纳税
  • 现代服务促销服务费的经营范围
  • 展会门票入什么科目
  • 现金结算的股权支付等待期
  • 代驾费用入什么二级科目
  • 有哪些凭证
  • 非现金资产包括
  • 发票未到的费用怎么处理
  • 最新企业会计准则
  • 第三方支付销售
  • deepin安装win
  • macos big sur怎么运行ios软件
  • 购入研发设备
  • 酒店没有营业执照开业员工有责任吗
  • win10蓝牙无法连接可以尝试以下操作
  • php入门基础教程
  • PHP:pcntl_getpriority()的用法_PCNTL函数
  • wordpress文章编辑使用教程
  • t typescript
  • 图像修复技术
  • 企业预付账款怎么做账
  • 企业所得税是先预缴吗
  • 罚款属于其他业务收入吗
  • mysql基本sql语句大全(基础用语篇)
  • 资产减值损失账户核算内容
  • mysql数据库uuid
  • 启动mysql的语句
  • mongodb bi
  • mssql使用教程
  • 减免增值税记账
  • mysql数据库服务器配置
  • 利息收入的会计分录
  • 汇兑损益计入营业外收入吗
  • 其他应收款应该缴纳什么税
  • 发票优惠金额怎么开
  • 劳动仲裁要出面吗
  • 互联网金融理财产品的优势
  • 火车票退票改签手续费
  • 公司挂靠有资质的企业公司会计处理?
  • 非贸付汇计税基础
  • 公司返聘退休人员的员工比例有没有规定
  • 递延纳税筹划策略研究
  • 刚成立的公司没有五险一金
  • 其他应付重分类到其他应收
  • 支票为什么不能取钱
  • u盘装机大师手机下载电脑版
  • 电脑win7win8win10操作系
  • unix操作系统有何特点?
  • ubuntu 9.04 X3100 显卡开启3D特效
  • cocos2djs
  • 一个简单的小实验
  • perl执行linux命令
  • 深入理解计算机系统
  • js日历插件日期选择器
  • bootstrap 标签
  • Android通过HttpURLConnection获取JSON并进行UI更新
  • canvas+javascript
  • 黑龙江地方税务总局官网
  • 四川税务app下载安装
  • 丰田2.0和2.5混动发动机
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设