jQuery事件处理(五)
对原生js不熟悉看jQuery会困难很多。后续需要更多的关注下原生js
jQuery封装之后的事件触发,其中一个分支(处理普通事件)是通过:elem.addEventListener( type, eventHandle, false );来完成的。
通过这一句,为元素绑定一个事件监听器,并绑定eventHandler事件处理程序。
该事件监听程序内部调用dispatch方法处理并执行用户真正绑定到该元素上的所有事件处理程序。
相当于在所有的事件处理程序外围又包括了一个方法。
接下来看下dispatch内部做了哪些事情:
// 这里的event参数其实是一个普通的原生event对象,是从elem.addEventListener( type, eventHandle, false );中传给eventHandle之后又传给dispatch的。
dispatch: function( event ) {
  // 对event进行重新封装,前面已经看过
		  event = jQuery.event.fix( event );
var i, j, ret, matched, handleObj,
    // 存放用户绑定到该元素上的所有事件处理函数
			    handlerQueue = [],
			    args = core_slice.call( arguments ),
    // 这里的this指的是当前元素,取出当前元素在cache中对应的events,并找到对应的事件类型的事件处理函数
			    handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
    // 到special对象中看看该事件类型是不是特殊事件
			    special = jQuery.event.special[ event.type ] || {};
  // 将原event对象替换为新的event对象
		  args[0] = event;
  // 将事件的代理目标指定为当前元素
		  event.delegateTarget = this;
  // 不知道preDispatch是个啥东东,后面看
		  if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
			    return;
		  }
// 调用event的handler方法,将返回的事件处理程序组成的数组赋值给handlerQueue
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
  // 从队列中依次取出每一个事件处理程序(并且该事件没有被阻止)
		  i = 0;
		  while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
			    event.currentTarget = matched.elem;
j = 0;
    // 需要了解handlers方法做了什么,现在不清楚handleObj是什么
			    while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
    // Triggered event must either 1) have no namespace, or
				    // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
      // 如果该事件没有命名空间或者该事件时命名空间的一个子集,后面的内容多需要看过handlers方法
				      if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
        event.handleObj = handleObj;
					        event.data = handleObj.data;
        ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
							          .apply( matched.elem, args );
        if ( ret !== undefined ) {
						          if ( (event.result = ret) === false ) {
							            event.preventDefault();
							            event.stopPropagation();
						          }
					        }
				      }
			    }
		  }
// Call the postDispatch hook for the mapped type
		if ( special.postDispatch ) {
			special.postDispatch.call( this, event );
		}
return event.result;
	},
(想要继续深入了解,需要画一张cache存储的events和handler的表,同时需要了解通过handler方法做了什么。才能清楚每一步的作用)
jQuery事件处理(五)的更多相关文章
- jQuery事件处理了解一下
		>>> JQuery 事件处理 一.事件绑定方式 1.事件绑定的快捷方式: 缺点:绑定的事件,无法取消 $("button:eq(0)").dblclick(fu ... 
- [DOM Event Learning] Section 3 jQuery事件处理基础 on(), off()和one()方法使用
		[DOM Event Learning] Section 3 jQuery事件处理基础 on(),off()和one()方法使用 jQuery提供了简单的方法来向选择器(对应页面上的元素)绑定事件 ... 
- jQuery事件处理(四)
		看了几天,决定整理一下jQuery事件处理的整体设计思路 1.通过add方法给选中的元素注册事件处理程序(通过缓存系统将事件储存到cache,而不是绑定到元素上) a.在存储之前,会为事件处理程序增加 ... 
- Unit02: jQuery事件处理 、 jQuery动画
		Unit02: jQuery事件处理 . jQuery动画 jQuery实现购物车案例 <!DOCTYPE html> <html> <head> <titl ... 
- 从零开始学 Web 之 jQuery(五)操作元素其他属性,为元素绑定事件
		大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ... 
- JQuery事件处理的注意事项
		1.jQuery 名称冲突 jQuery 使用 $ 符号作为 jQuery 的简介方式. 某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号. jQuery 使用 ... 
- 02-老马jQuery教程-jQuery事件处理
		1. 绑定简单事件 在DOM中DOM0级绑定事件的方式是直接给事件属性赋值,但是这样有个缺点就是每次指定的事件处理程序会把之前的覆盖掉. jQuery简单绑定事件的方式,可以让我绑定多个事件处理程序跟 ... 
- jQuery事件处理(七)
		1.自定义事件(用户手动trigger的一般都是自定义事件) trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tm ... 
- jQuery事件处理(六)
		1.通过一步步调试的的方法观察了一下存放到cache中的事件及其处理程序的数据格式: { events : { // 根据事件类型存放添加到该元素上的所有事件,下面以click为例 click : [ ... 
随机推荐
- OpenOffice将MS docx转换成pdf文件偶数页眉不显示问题解决办法
			OpenOffice版本:4.0(Windows.Linux下测试都出现问题) MS Office版本:2007 问题描述 使用OpenOffice将MS的docx文件转换为pdf文件时,docx文件 ... 
- thinkphp 配置加载
			状态配置 每个应用都可以在不同的情况下设置自己的状态(或者称之为应用场景),并且加载不同的配置文件. 举个例子,你需要在公司和家里分别设置不同的数据库测试环境.那么可以这样处理,在公司环境中,我们在入 ... 
- PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER
			1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER["REQUEST_URI"] 说明:访问此页面所需 ... 
- 周期性调度器scheduler_tick
			周期性调度器由中断实现,系统定时产生一个中断,然后启动周期性调度器,周期性调度器执行过程中要关闭中断, 周期性调度器执行完毕后再打开中断(handle_IRQ_event, IRQF_DISABLE ... 
- 【python】logging
			https://docs.python.org/3/howto/logging.html import logging # create logger logger = logging.getLogg ... 
- SSM框架面试题及答案整理
			一.Spring面试题 1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心:①. IOC/DI(控制反转/依赖注入 ... 
- IntelliJ IDEA删除代码的注释
			由于反编译出的Java每一行都有注释,因此查找批量替换 搜索框,正则表达式 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*) 或者 (/\* ... 
- repo_folder
			-- Create table create table REPO_FOLDER ( UUID ) not null, VALID ) not null, CREATE_TIME ) not null ... 
- 8 -- 深入使用Spring -- 3...1 Resource实现类InputStreamResource、ByteArrayResource
			8.3.1 Resource实现类------InputStreamResource:访问输入流资源的实现类.ByteArrayResource:访问字节数组资源的实现类. 5. 访问字节数组资源 ⊙ ... 
- Python之虚拟环境管理
			Python本身有很多个版本,第三方的Python包又有很多可用的版本,所以经常会遇到下面的问题: 运行不同的Python程序,需要使用不同版本的Python(2.x或3.x). 在同一中Python ... 
