- 浏览: 1171949 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
由于各个浏览器中原生事件对象的 差异性
,多数 JS库/框架
都或多或少的对原生事件对象进行了修复及扩充。
比如,停止事件冒泡IE用 cancelBubble
,标准浏览器则用 stopPropagation
。
获取事件源对象,IE用 srcElement
,标准浏览器则用 target
诸如此类。
jQuery 对原生事件对象的修复和扩充主要使用 jQuery.Event
类和 jQuery.event.fix
方法。
jQuery.Event = function( src ) { // Allow instantiation without the 'new' keyword if ( !this.preventDefault ) { return new jQuery.Event( src ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Event type } else { this.type = src; } // timeStamp is buggy for some events on Firefox(#3843) // So we won't rely on the native value this.timeStamp = jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse };
jQuery.Event 类主要做了一下工作
1,扩充了 originalEvent 属性,该属性暂存了原生事件对象。
2,修复了 timeStamp
,该属性IE6/7/8不支持,其它支持的各个浏览器中返回值也不同。
3, 阻止DOM元素默认行为统一采用 preventDefault
4, 停止事件冒泡统一采用 stopPropagation
5, 实现或扩充了 DOM3事件
的几个方法:stopImmediatePropagation、isDefaultPrevented、isPropagationStopped、isImmediatePropagationStopped
此外,jQuery.Event的 写类方式
也较独特。它 使用隐藏的new创建对象
。
jQuery.event.fix方法 如下
fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // store a copy of the original event object // and "clone" to set read-only properties var originalEvent = event; event = jQuery.Event( originalEvent ); for ( var i = this.props.length, prop; i; ) { prop = this.props[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary if ( !event.target ) { // Fixes #1925 where srcElement might not be defined either event.target = event.srcElement || document; } // check if target is a textnode (safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Add relatedTarget, if necessary 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 && doc.clientLeft || body && body.clientLeft || 0); event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); } // Add which for key events if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { event.which = event.charCode != null ? event.charCode : event.keyCode; } // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 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 !== undefined ) { event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); } return event; },
它主要做了以下工作
1,event = jQuery.Event( originalEvent ); 该句创建了一个jQuery.Event类的实例对象,该对象修复及扩充上面刚刚提到了。
2, 一个循环将原生事件对象的所有属性拷贝给 1 中的event对象。
for ( var i = this.props.length, prop; i; ) { prop = this.props[ --i ]; event[ prop ] = originalEvent[ prop ]; }
3, 统一事件源对象为 target
。
4, 统一事件相关对象为 relativeTarget
。
5, 扩充了pageX
, pageY
,这两个属性首次在Firefox中引入的。不支持该属性的浏览器使用clientX/Y计算得到。
6, 扩充了 which
,使用它获取键盘按键值(keyCode)。这个属性也是在Firefox引入的。
7, 修复了metaKey。
8, 扩充了which,使用它获取鼠标按键值
细心的人可能注意到了,jQuery获取键盘按键值和鼠标按键值都是采用which。它没有向其它属于一样去兼容W3C已有标准 (button
)。这一点我在 读jq之七
及 各浏览器中鼠标按键值的差异
做了详细分析。
好了,整个jQuery事件对象就是如此..
以上源码摘自 jQuery1.4.4
。
发表评论
-
如何定制你自己的jQuery
2015-01-12 08:38 2885jQuery随着版本的不断升级代码量也随之增加,从1.0. ... -
读jQuery之二十一(队列queue)
2013-11-21 14:13 2478queue模块在jQuery中分在Effects中,搜索整个 ... -
读jQuery之二十(Deferred对象)
2013-09-24 07:23 1209Deferred对象是由$.Deferred构造的,$.D ... -
读jQuery之十九(多用途回调函数列表对象)
2013-08-08 07:39 3168$.Callbacks是在版本1.7中 ... -
jQuery1.8的几个小变化
2013-05-18 07:57 1257一,.width() 和 .height()方法 1 ... -
读jQuery之十七(attribute/property/class)
2012-04-23 07:44 1662jQuery的属性模块提供了如下方法 attr/rem ... -
读jQuery之十六(事件代理)
2012-04-21 11:45 1851事件代理的实现原理很简单:利用浏览器中事件的冒泡(eve ... -
读jQuery之十五
2012-04-21 08:27 1271在之前的event-jq-0.2.js基础上继续提取jQuer ... -
读jQuery之十三(触发事件核心方法)
2012-04-20 07:40 1725触发事件,或称模拟用户动作。比如点击,我们可以用代码去模拟用户 ... -
读jQuery之十四
2012-04-20 22:12 1322最近看完了添加事件和删除事件的核心方法,忍不住想把jQu ... -
读jQuery之十八(元素位置)
2012-04-24 07:09 1743本篇所读源码版本为1.7.2 jQuer ... -
读jQuery之十二(删除事件核心方法)
2012-04-19 13:57 1554使用jQuery删除事件(或称解除事件绑定)有三个函数:unb ... -
读jQuery之十一(添加事件核心方法)
2012-04-19 07:07 2064上一篇提到jQuery中添加 ... -
读jQuery之十(事件模块概述)
2012-04-18 14:39 1834jQuery的事件模块是较 ... -
读jQuery之九(一些瑕疵)
2012-04-18 14:34 1320jQuery1.6.1 发布有一段时间了,发现一些冗余代 ... -
读jQuery之十八(元素位置)
2012-04-18 14:27 20本篇所读源码版本为1.7.2 jQuery中提供 ... -
读jq之七(判断点击了鼠标哪个键)
2010-12-03 18:31 2491jQuery丢弃了标准的 button 属性采用which ... -
jq中html()方法使用不当带来的陷阱
2010-05-29 10:54 5301.html方法当不传参数时用来获取元素的html内容,查看源码 ... -
jQuery1.4.2的一些瑕疵
2010-05-05 09:31 2276jQuery1.4.2 发布有一段时间了,发现一些多余的代 ... -
读jq之六(数据暂存)
2010-03-19 16:52 2612jq的$.data,$.removeData方法设计的很巧妙, ...
相关推荐
总的来说,“jq、js原生五星评价特效”项目涉及到JavaScript和jQuery的基础知识,包括事件处理、DOM操作、CSS样式控制以及本地存储。通过这个项目,开发者可以深化对这些技术的理解,并提升实际开发能力。在实践中,...
同时,理解JavaScript的基本语法和面向对象的概念也至关重要,因为jQuery是对JavaScript的封装,深入理解基础将有助于更好地理解和运用jQuery。 在这个过程中,你可能还会接触到CSS样式设计、HTML结构布局以及响应...
在JavaScript的世界里,jQuery库(通常简称为JQ)是一个非常流行的选择,它极大地简化了DOM操作、事件处理以及AJAX交互。其中,“JQ鼠标滚轮事件”是jQuery提供的一种方便的方式来监听和处理用户的鼠标滚轮动作。这...
在这个“原生jq获取天气”的项目中,我们聚焦于如何使用jQuery来实现一个功能,即获取并显示实时的天气信息。这个功能每日24点自动刷新,为用户提供最新的气象数据。我们将详细讨论如何实现这个功能,以及相关的技术...
本文将介绍如何使用原生JavaScript实现类似jQuery中的animate()方法的动画效果。在前端开发中,jQuery提供了一套非常方便的API来实现动画效果,但随着Web标准的发展和性能优化需求的提高,原生JavaScript的方法逐渐...
用于使用jq,jq的使用比js更加方便,大大缩短了的代码开发的进程,但原生js是需要掌握的,jq基于原生js研发出来的
**JQ 事件绑定** 在前端开发中,jQuery(简称JQ)库是广泛使用的工具,它极大地简化了JavaScript操作,特别是在DOM元素的选择、操作和事件处理方面。本篇文章将深入探讨JQ中的事件绑定机制。 事件绑定是网页交互的...
在IT行业中,jQuery(通常简称为jq)是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互。本话题主要聚焦于使用jQuery实现拖拽功能,并且扩展到支持双击事件。这在网页设计中非常常见,...
**JQ 鼠标事件详解** 在前端开发中,jQuery(简称JQ)库以其简洁易用的API,使得JavaScript编程变得更加简单。鼠标事件是用户与网页交互时常见的触发事件,jQuery对这些事件提供了丰富的支持。本篇将详细介绍jQuery...
通过阅读《读jq之三(优雅的迭代)》这篇博文,我们可以学习到jQuery中的迭代方法,了解它们如何提升我们的编程体验。 首先,我们关注jQuery的`.each()`方法。这是一个用于遍历数组或对象的迭代函数,它提供了简洁...
原生js实现jquery $.extend方法 通过遍历对象属性来实现
`jq`的版本1.6是一个稳定版本,带来了许多增强和修复的bug,提供了更可靠的服务。 要安装这两个RPM包,通常可以在Linux终端中使用`yum`或`dnf`(取决于你的Linux发行版)命令进行: ```bash sudo yum install ...
JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转JQ事件进度条自动跳转...
JQuery是一个流行的JavaScript库,它简化了DOM操作、事件处理和AJAX交互。虽然JQuery本身并不直接支持PDF显示,但我们可以结合其他插件,如`pdfobject.js`,来实现这一功能。以下是一个基本的步骤: 1. 引入JQuery...
在JavaScript的世界里,jQuery(简称JQ)是一个广泛使用的库,极大地简化了DOM操作、事件处理、动画制作等任务。本文将深入探讨JQ中的"点击事件"(Click Event)用法,除了最常见的`.click()`方法,还有其他一些关联...
jq6500语音芯片是一款广泛应用在电子设备中的声音处理组件,主要负责音频数据的存储、解码和播放。这款芯片以其高效的性能、广泛的兼容性和易于编程的特点,在单片机控制的系统中得到了广泛的应用。 首先,我们来看...
**JavaScript原生与jQuery实现选项卡切换** 在Web开发中,选项卡(Tab)是一种常见的交互元素,用于展示有限的空间内多组相关但不同时显示的内容。本篇将详细讲解如何使用JavaScript原生代码和jQuery库来实现这种...
在JavaScript的世界里,jQuery(简称JQ)是一个广泛使用的库,极大地简化了DOM操作、事件处理、动画制作等任务。本文将深入探讨“JQ表单对象属性过滤选择器”的概念,以及如何在实际开发中有效地利用它们。 一、...
本篇将详细介绍如何使用jQuery和原生JavaScript实现鼠标滚轮事件的监听。 一、jQuery监听鼠标滚轮事件 jQuery库提供了一种简洁的方式来处理DOM元素上的事件,包括滚轮事件。要监听滚轮事件,可以使用`$(element)....
《JQ8400-FN/JQ8400-FL语音芯片/模块的应用解析与编程指南》 在嵌入式系统设计中,语音处理技术扮演着重要的角色,为设备提供直观的人机交互方式。JQ8400系列语音芯片就是其中的一款典型代表,适用于多种应用场景,...