位置: 编程技术 - 正文

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

  • 预缴增值税是否要预缴企业所得税
  • 应交税费转出未交增值税借贷方表示什么
  • 进仓费税率
  • 汇算清缴时有哪些需要调整的项目
  • 新增资产额怎么计算
  • 交文化事业建设费的行业
  • 牛奶 税率
  • 企业所得税季报弥补以前年度亏损怎么填
  • 用自产货物用抵债交换是否视同销售
  • 享受企业所得税三免三减半优惠的起始时间
  • 清算期间,公司是否可以经营
  • 高新技术企业账务处理注意事项
  • 再保险业务赔款如何进行税前扣除
  • 提入转账支票会计分录
  • 电梯提供安装的增值税税率最新的
  • 员工出差火车票可以抵扣进项吗
  • 签了合同后又要收额外费用
  • 材料加工计入什么科目
  • 公司支付宝账户怎么登录
  • 无形资产内部研究开发支出的确认和计量
  • 冲减以前年度多计的管理费用分录
  • 小规模公司怎么注册
  • 电子发票可以打多少行
  • 稳岗补贴需要缴税吗
  • 携税宝可以不买吗
  • 税控盘有什么作用
  • 高杠杆资金是什么意思
  • 企业财务内部控制的主要内容有哪些
  • 材料发票清单
  • 房地产企业建设的幼儿园如何缴纳城镇土地使用税
  • 药店 医保收入占比
  • RSync文件备份同步 Linux服务器rsync同步配置图文教程
  • 把试驾车当新车卖,构成欺诈
  • PHP开发之归档格式
  • linux系统中如何查看日志
  • win10任务栏搜索如何关闭
  • 消费税和增值税的征税范围有何不同
  • 简述项目融资风险的内容
  • php自定义函数的语法格式
  • php数据库语句
  • 开发商卖房子要交多少营业税
  • 股东出资未注明投资款可以通过验资报告处理么
  • 小规模纳税人实收资本印花税怎么算
  • 图片格式转换pdf
  • php ajax 实现
  • 报销业务招待费是什么凭证
  • 印花税减免优惠政策2019
  • mysql恢复备份文件
  • 小规模当月开普票作废流程
  • 专票多长时间
  • 个人所得税的纳税期限
  • 股东多缴投资款处理
  • 个人转让不动产交印花税吗
  • 开银行承兑汇票需要多少保证金
  • 在租赁的土地上建房做固定资产吗
  • 公司注销后会计档案可以销毁吗
  • 短期借款核算的会计分录
  • 股东可用什么方式出资
  • 现金流量表和利润表的勾稽关系
  • 营改增人力资源服务
  • 设备信息windows6.1
  • win10 tab alt
  • virtualbox虚拟机菜单找不到了
  • centosgui
  • javascript基础教程教材答案
  • 使用jquery插件的好处
  • 电脑qq清理
  • dos批处理实例
  • Node.js中的全局变量有哪些
  • jquery示例
  • 最流行的民宿装修设计
  • jquery滚动到底部加载数据
  • 国家税务局四川增值税发票查询平台
  • 山东地方税务局官网
  • 慰问金能直接转账吗
  • 出口退税备案单证目录
  • 宏观经济十大因素有哪些
  • 无锡国税电子发票怎么开
  • 开展培训举办培训
  • 船舶吨税案例分析
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设