jquery event 封装的源源分析
- 对于javascript事件扩展,所有的lib都差不多。和jquery和prototype,yui和Ext,其要解决的首要问题是兼容性,所有lib都会对event进行包裹,统一其属性解决其兼容性。对于事件的操作无非是addEvent,fireEvent,removeEvent这三个事件方法。一般lib都会对浏览器的提供的函数做一些扩展,解决兼容性内存泄漏等问题。第三个问题就是如何得到domReady的状态。
- 6.1 event的包裹
- 浏览器的事件兼容性是一个令人头疼的问题。IE的event在是在全局的window下,而mozilla的event是事件源参数传入到回调函数中。还有很多的事件处理方式也一样。
- Jquery提供了一个 event的包裹,这个相对于其它的lib提供的有点简单,但是足够使用。
- //对事件进行包裹。
- fix : function(event) {
- if (event[expando] == true) return event;//表明事件已经包裹过
- //保存原始event,同时clone一个。
- var originalEvent = event; ①
- event = { originalEvent : originalEvent};
- for (var i = this.props.length, prop;i;) {
- prop = this.props[--i];
- event[prop] = originalEvent[prop];
- }
- event[expando] = true;
- //加上preventDefault and stopPropagation,在clone不会运行
- event.preventDefault = function() { ②
- // 在原始事件上运行
- if (originalEvent.preventDefault)
- originalEvent.preventDefault();
- originalEvent.returnValue = false;
- };
- event.stopPropagation = function() {
- // 在原始事件上运行
- if (originalEvent.stopPropagation)
- originalEvent.stopPropagation();
- originalEvent.cancelBubble = true;
- };
- // 修正 timeStamp
- event.timeStamp = event.timeStamp || now();
- // 修正target
- if (!event.target) ③
- event.target = event.srcElement || document;
- if (event.target.nodeType == 3)//文本节点是父节点。
- event.target = event.target.parentNode;
- // relatedTarget
- if (!event.relatedTarget && event.fromElement) ④
- event.relatedTarget = event.fromElement == event.target
- ? event.toElement : event.fromElement;
- // Calculate pageX/Y if missing and clientX/Y available
- if (event.pageX == null && event.clientX != null) { ⑥
- var doc = document.documentElement, body = document.body;
- event.pageX = event.clientX
- + (doc && doc.scrollLeft || body && body.scrollLeft || 0)
- - (doc.clientLeft || 0);
- event.pageY = event.clientY
- + (doc && doc.scrollTop || body && body.scrollTop || 0)
- - (doc.clientTop || 0);
- }
- // Add which for key events
- if (!event.which && ((event.charCode || event.charCode === 0) ⑦
- ? event.charCode : event.keyCode))
- event.which = event.charCode || event.keyCode;
- // Add metaKey to non-Mac browsers
- if (!event.metaKey && event.ctrlKey) ⑧
- event.metaKey = event.ctrlKey;
- // Add which for click: 1 == left; 2 == middle; 3 == right
- // Note: button is not normalized, so don't use it
- if (!event.which && event.button) ⑨
- event.which = (event.button & 1 ? 1 : (event.button & 2
- ? 3 : (event.button & 4 ? 2 : 0)));
- return event;
- },
- 上面的代码①处保留原始事件的引用,同时clone原始事件。在这个clone的事件上进行包裹。②处在原始事件上运行preventDefault 和 stopPropagation两个方法达到是否阻止默认的事件动作发生和是否停止冒泡事件事件向上传递。
- ③处是修正target个,IE中采用srcElement,同时对于文本节点事件,应该把target传到其父节点。
- ④处relatedTarget只是对于mouseout、mouseover有用。在IE中分成了to和from两个Target变量,在mozilla中没有分开。为了保证兼容,采用relatedTarget统一起来。
- ⑥处是进行event的坐标位置。这个是相对于page。如果页面可以scroll,则要在其client上加上scroll。在IE中还应该减去默认的2px的body的边框。
- ⑦处是把键盘事件的按键统一到event.which的属性上。Ext中的实现ev.charCode || ev.keyCode || 0; ⑨则是把鼠标事件的按键统一把event.which上。charCode、ev.keyCode一个是字符的按键,一个不是字符的按键。⑨处采用&的方式来进行兼容性的处理。 Ext 通过下面三行解决兼容问题。
- var btnMap = Ext.isIE ? {1:0,4:1,2:2} : (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2}); this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1);
- ①②③④⑤⑥⑦⑧⑨⑩
jquery event 封装的源源分析相关推荐
- 【原创】jQuery1.8.2源码解析之jQuery.event
本片随笔主要是分析了下jQuery的事件模型,即如何统一事件对象,以及处理过程. 这里简要说明一下几点: jQuery通过统一的方法(第62行),eventHandle函数进行事件的分发,利用jQue ...
- 基于jQuery 2.0的源代码分析
有段时间没有使用jQuery了,对他的认识还停留在1.2 - 1.4左右. 前几天看,哇,原来jQuery 2.0 beta都发布了-- 以后不敢说自己会jQuery了. 决定趁着年末不忙,干脆分析一 ...
- jQuery Event对象的属性和方法
介绍之前先介绍jQuery的一个方法 jQuery.event.fix(event || window.event); 此方法个浏览器的event对象转换为 jQuery.event; 如果您的事件是 ...
- HTML5 元素拖拽实现 及 jquery.event.drag插件
如上图片: <!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" co ...
- Event 系列: jquery event 源码
/* * author:prk * date:2008-08-17 * comment:analyse of jquery event * */ jQuery.event = { // add 事件到 ...
- FLV封装格式的分析
FLV封装格式的分析,各种详细的参数比较多没有详细解释,这是总体的格式分布.详细的参数说明可以参照文档. 以flv格式内封装的音频流是aac.视频流是h264分析: flv文件tag部分截图:可以看到 ...
- Javascript笔记:(实践篇)从jQuery插件技术说起-分析extend方法的源码(发现extend方法里有bug)(下篇)...
1.1 分析$.extend源码 在分析源码之前,我还要加一段s测试代码,代码如下: <script type="text/javascript"> $(doc ...
- jQuery Event 模块 源码浅解
众所周知,jQuery 通过jQuery.event.add & jQuery.event.remove 方法对DOM元素(文本和注释节点除外)进行事件的绑定和解绑.这两个方法都提供了四个参数 ...
- Vue-vben-admin Vue3+TS Axios的封装源码分析
Vue-vben-admin Vue3+TS Axios的封装源码分析 前言 一.近期再用Vue3+TS 重构之前Vue2的项目,因此想着借鉴一下业界较为优秀的代码,在Git上面找了好久,经过同事推荐 ...
最新文章
- 字符串中 去掉字符串前后空格以、'\t'(tab) C函数实现,附sscanf正则方式
- [Linq]Linq To Xml (待整理)
- 图像识别中卷积神经网络“卷积”的作用
- 批量消除图片的杂色背景
- invalid new-expression of abstract class type 'CurveFittingEdge'
- SpringCloud服务安全连接
- mysql数据库遍历表,其一字段获取上一条数据
- web developer tips (45):如何改变动态数据文件夹的位置
- 报错解决——make: *** No targets specified and no makefile found. Stop
- android电源管理
- Java订单交易_Java实现获取105发卡平台的订单信息
- NP、OSPF链路状态数据库
- iPhone 12 要来了,手机是时候换到 11 了
- 第三季-第14课-有名管道通讯编程
- 如何找出php木马,linux下查找php木马
- qq音乐android升级版,QQ音乐Android 4.8更新 温暖私享正版无损好音乐
- The server quit without updating PID file
- 机器视觉OpenCV-sobel、robert、gauss算子边缘检测
- 微信投票平台防止刷票的方法和原理随笔
- pixfllow光流传感器数据获取及悬停程序编写