6.Event分析
prk/彭仁夔 08-08-26
对于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权威指南源代码》是一本深入解析jQuery库的参考书籍,其源代码提供了丰富的实例和示例,帮助读者更好地理解和应用jQuery。jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及...
首先,jQuery的核心源代码是JavaScript的一个模块,它封装了一系列的函数和方法,旨在提高开发效率和代码可读性。其中的关键功能包括: 1. **选择器(Selectors)**:jQuery提供了类似于CSS的选择器语法,如`$("#id...
jQuery提供了事件绑定和解绑的功能,例如`jQuery.event.add`用于添加事件监听器,而`jQuery(window).unload()`用于在IE浏览器中清除事件监听器,避免内存泄漏问题。 2. **Ajax请求**: - **基本功能**:jQuery...
3. 事件处理:使用.on()方法绑定事件,以及$.event.preventDefault()和$.event.stopPropagation()控制事件行为。 4. 动画:使用fadeIn()、slideUp()等方法创建平滑的过渡效果,以及animate()函数自定义动画。 5. ...
jQuery封装了Ajax交互,如`.ajax()`, `.get()`, `.post()`。以`.get()`为例,`$.get("url", data, function(response){...})`可异步获取URL上的数据,回调函数处理响应。 5. **插件机制**: jQuery的插件机制是其...
在本文中,我们将详细探讨jQuery的核心概念、常用方法以及源代码分析。 jQuery的核心功能主要围绕四个关键领域展开: 1. **DOM操作**:jQuery提供了一套简洁的API来选择、创建和操作DOM元素。如`$()`用于选取元素...
《jQuery第二版源码解析》 jQuery,作为一款广受欢迎的JavaScript库,为开发者提供了简单易用的API,使得DOM操作、事件处理、动画效果以及AJAX...因此,深入理解并分析jQuery源码,是每一个Web开发者进阶的必经之路。
首先,jQuery的核心理念是"Write Less, Do More",它通过封装JavaScript的DOM操作、事件处理、动画效果等功能,极大地简化了网页交互的编写。笔记中会详细讲解如何使用jQuery选择器选取元素,这是jQuery的基础,包括...
源代码可能包含自定义插件的实现,展示了如何封装复用代码。 7. **API使用(API Usage)**:除了上述功能,jQuery还提供了许多其他API,如`$.each()`, `$.extend()`, `$.map()`, `$.grep()`等,这些在处理数组、...
Ajax是jQuery中的关键特性,它封装了异步数据交互。`$.ajax()`函数提供了一种灵活的方式进行Ajax请求,支持GET和POST等多种HTTP方法,还可以处理JSON、XML等多种数据格式。配合`.done()`, `.fail()`, `.always()`,...
3. **事件处理**:jQuery的事件处理非常灵活,如`click()`、`mouseover()`、`mouseout()`等,源码中会展示如何绑定和解绑事件,以及使用`event.preventDefault()`和`event.stopPropagation()`控制事件行为。...
3. **事件处理**:jQuery简化了事件绑定和解绑的过程,例如`$(selector).click(function() {...})`用于绑定点击事件,`$(selector).on('event', function() {...})`则是通用的事件绑定方法,可以处理动态添加的元素...
6. **插件使用**:`jquery.tip.js`可能是一个预封装的jQuery插件,用于方便地实现提示效果。使用时,需要先引入jQuery库,然后引入插件,最后调用相应的插件方法,如`$('selector').tip(options)`。 7. **示例代码*...
文件中包含了完整的源代码,便于开发者阅读、调试和理解jQuery的工作原理。在开发过程中,直接引用这个文件可以得到更好的调试支持。 3. **jquery-3.4.1.min.js**:这个是jQuery的压缩版本,经过了混淆和压缩处理,...
jQuery的`$.ajax()`方法封装了异步数据请求,支持XMLHttpRequest和JSONP。`$.get()`和`$.post()`是其简化的版本,分别用于GET和POST请求。此外,`$.load()`可以方便地加载远程HTML片段。 ### 七、插件开发 jQuery...
首先,jQuery的核心理念是“Write Less, Do More”,它通过封装了一系列简洁的API,使得开发者能够用更少的代码实现更多的功能。在当当网源码中,我们可以看到jQuery如何被用来优化网页的性能和用户体验。 1. **...
8. **插件开发(Plugin Development)**:对于更复杂的图片切换需求,可以基于jQuery开发自定义插件,封装通用功能,提高代码复用性。 了解以上知识点后,你可以根据提供的"JS图片左右切换效果源代码"进行学习和...
其次,jQuery的事件处理(Event Handling)简化了JavaScript中对用户交互的响应。使用`.on()`方法,我们可以绑定多种类型的事件,如`click`、`mouseover`、`mouseout`等。例如,`$("#myButton").on("click", ...
jQuery的核心理念是“Write Less, Do More”,这正体现在描述中:“jQuery通过一行简单的标记就能被添加到网页中,它是对JavaScript的一个扩展和封装,能用更少的代码实现更多的功能”。它简化了许多常见的DOM操作,...
许多开源的jQuery分页插件已经封装好了上述功能,如`bootstrap-pagination`、`jquery.twbsPagination`等。使用它们可以极大地节省开发时间,提高效率。 以`jquery.twbsPagination`为例,其主要使用方法包括: 1. ...