位置: 编程技术 - 正文

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

  • 企业生产经营管理包括哪些
  • 增值税的附加税比例
  • 计提印花税会计分录
  • 代建费用在哪里列支
  • 政府补贴需要缴纳企业所得税吗
  • 对公账户的钱都是国有资产吗
  • 所有应收账款是否均已记录
  • 财产租赁合同印花税率多少
  • 公司为员工买零食
  • 个税扣除项生效日期
  • 航天金税的服务费如何抵扣
  • 土增税土地成本分摊方法
  • 理财的利息收入计入什么科目
  • 税局代开专票如何做账务处理?
  • 营改增之前
  • 电商刷单的成本如何处理?
  • 员工自己承担的商业保险费是多少
  • 受托加工费的成本都有什么
  • 汇算清缴补开票交税怎么写摘要?
  • 税控盘逾期未抄报,交罚款需要带什么
  • 项目工程分包账务
  • 股权转让时未分配利润的税务处理
  • 微信收付款认证
  • 土地作价入股是否视为土地转让
  • 信用卡核销是什么意思
  • 为什么利息收入是负数
  • 怎么进行现金流量分析
  • 增值税进项税额抵扣期限最新
  • 公司有残疾人员怎么办
  • window10最新激活码
  • 智能化的发展现状与趋势
  • windows7的笔记本有哪些
  • 研发销售型软件有哪些
  • 企业之间的往来款现金流
  • 不动产在建工程领用原材料的分录
  • PHP:apache_lookup_uri()的用法_Apache函数
  • php后端技术栈
  • 公网访问内网主机
  • thinkphp框架流程原理
  • 最好用的无人品牌子
  • framework core
  • 个体户怎么报增值税
  • 老板出差餐费费用怎么处理
  • php 更新
  • http上传错误
  • 出口货物离岸价差异原因说明表在电子税务局的位置
  • 企业非正常损失如何处理
  • 车辆维修费会计分录
  • 利息收入管理办法
  • 小规模定额征收和查账征收哪个更好一些
  • 每月工资不一样怎么算误工费呢
  • 境外汇款免税
  • 去年少计提费用
  • 对于相关人员培训存在的问题
  • 保险返点返20怎么算
  • 外聘人员差旅费用无票调增
  • 进项税转出怎样做账务处理
  • 支付中标服务费借款情况说明怎么写
  • 会计需知应收账款吗
  • 专家评审费需要上税吗
  • 产品销售成本计算表
  • sqlserver索引语句
  • mysql5.7最新版
  • window组件在哪里
  • windows10预览版怎么样
  • 笔记本win8.1怎么重装系统
  • xp系统如何取消开机自动启动程序
  • s24evmon.exe - s24evmon是什么进程 有什么用
  • javascript中有几种数据类型
  • 搭建gitbook
  • 深入了解的高级表达
  • vue实现淘宝布局
  • js闭包的使用
  • android解压app
  • 交通运输业的税率9%和13%
  • 材料费增值税发票几个点
  • 大征期 是什么
  • 正外部性与负外部性的定义
  • 合伙企业的税收较高
  • 新疆税务服务网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设