- 浏览: 1173395 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
上一篇提到jQuery中添加事件提供给客户端程序员的接口方法有很多bind/click等,但其实现的核心方法是jQuery.event.add。这篇看看其源码,这个add定义如下(省略大部分)
add: function( elem, types, handler, data ) { if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } ... }
定义了四个参数elem、types、handler和data分别为HTMLElement、事件类型(如click)、事件响应函数、数据。此 外,types 可以以空格分开传多种事件("mouseover mouseout")。handler 有时会是一个对象(实现live时)。data 最后会挂在扩充后的event对象 上,即作为event的属性。而event会在handler作为第一个参数拿到,这样也就可以在handler拿到data了。下面详细说明
if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; }
文本和注释节点直接返回。
if ( handler === false ) { handler = returnFalse; } else if ( !handler ) { // Fixes bug #7229. Fix recommended by jdalton return; }
参数handler为false时,将handler赋值为returnFalse,returnFalse为一个函数,如下
function returnFalse() { return false; }
jQuery通过handler为false来阻止元素默认行为,停止事件冒泡。这个需要结合jQuery.event.handle看。
var handleObjIn, handleObj; if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; } // Make sure that the function being executed has a unique ID if ( !handler.guid ) { handler.guid = jQuery.guid++; }
定义变量handleObjIn,handleObj。
handler从字面上看是事件响应(回调)函数,但这里出现handler.handler,让人倍感怪异。即什么时候会将handler当一个JS对象传入呢?
多数时候传的还是Function类型的,看看源码中jQuery.event.add的调用可发现jQuery在实现live的时候会传Object类型。如下
add: function( handleObj ) { jQuery.event.add( this, liveConvert( handleObj.origType, handleObj.selector ), jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); },
这时会把handleObjIn赋值为所传的JS对象,真正的handler 却是handleObjIn.handler。这话有点绕,慢慢体会。
// Make sure that the function being executed has a unique ID if ( !handler.guid ) { handler.guid = jQuery.guid++; }
所传参数handler添加个属性guid,为一个数字,自增的从1开始。即使用jQuery添加事件,会为事件响应函数默认的添加了属性guid。这个guid再删除事件时会用到。
// Init the element's event structure var elemData = jQuery._data( elem );
先取elemData,这里使用了前面提到的jQuery._data 。第一次为HTMLElement添加事件是elemData是个空对象({})。
// If no elemData is found then we must be trying to bind to one of the // banned noData elements if ( !elemData ) { return; }
elemData不存在则直接返回。
var events = elemData.events, eventHandle = elemData.handle;
定义events,eventHandle。同样第一次时这两个变量都是undefined。
if ( !events ) { elemData.events = events = {}; } if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }; }
给elemData.events和elemData.handle赋值。
// Add elem as a property of the handle function // This is to prevent a memory leak with non-native events in IE. eventHandle.elem = elem;
暂存elem到eventHandle,删除事件注册时会将其置null,避免部分浏览器中内存泄露。
// Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = types.split(" ");
将字符串以空格为切割符转成数组。这句使其可以一次添加多个事件,多个事件的handler是相同的。后面是一个while循环
while ( (type = types[ i++ ]) ) { handleObj = handleObjIn ? jQuery.extend({}, handleObjIn) : { handler: handler, data: data }; ... }
循环数组,里面依次处理如下
1, 取得handleObj
2, 处理事件命名空间,以点号(.)来区别。如果type有点号,则具有命名空间,否则没有
3, 给handlerObj添加type,guid属性。这些后续删除事件时用到
4, 取到handlers,special。多数情况下使用addEventListener/attachEvent来添加事件。从变量special可看出对于特殊的事件如ready,beforeunload及live事件是特殊处理的。 ready 调用的是jQuery.bindReady,而jQuery.bindReady内部调用的仍然是 addEventListener/attachEvent。beforeunload则是使用window.onbeforeunload来添加。live是实现事件代理的,他的处理也是特殊的。
5, 最后吧handleObj添加到数组handles中。
jQuery.event.add 的最后一句,解决IE中内存泄露。
// Nullify elem to prevent memory leaks in IE elem = null;
jQuery事件管理的数据结构,我做了个图。如下
发表评论
-
如何定制你自己的jQuery
2015-01-12 08:38 2892jQuery随着版本的不断升级代码量也随之增加,从1.0. ... -
读jQuery之二十一(队列queue)
2013-11-21 14:13 2484queue模块在jQuery中分在Effects中,搜索整个 ... -
读jQuery之二十(Deferred对象)
2013-09-24 07:23 1214Deferred对象是由$.Deferred构造的,$.D ... -
读jQuery之十九(多用途回调函数列表对象)
2013-08-08 07:39 3172$.Callbacks是在版本1.7中 ... -
jQuery1.8的几个小变化
2013-05-18 07:57 1263一,.width() 和 .height()方法 1 ... -
读jQuery之十七(attribute/property/class)
2012-04-23 07:44 1667jQuery的属性模块提供了如下方法 attr/rem ... -
读jQuery之十六(事件代理)
2012-04-21 11:45 1859事件代理的实现原理很简单:利用浏览器中事件的冒泡(eve ... -
读jQuery之十五
2012-04-21 08:27 1276在之前的event-jq-0.2.js基础上继续提取jQuer ... -
读jQuery之十三(触发事件核心方法)
2012-04-20 07:40 1730触发事件,或称模拟用户动作。比如点击,我们可以用代码去模拟用户 ... -
读jQuery之十四
2012-04-20 22:12 1328最近看完了添加事件和删除事件的核心方法,忍不住想把jQu ... -
读jQuery之十八(元素位置)
2012-04-24 07:09 1749本篇所读源码版本为1.7.2 jQuer ... -
读jQuery之十二(删除事件核心方法)
2012-04-19 13:57 1559使用jQuery删除事件(或称解除事件绑定)有三个函数:unb ... -
读jQuery之十(事件模块概述)
2012-04-18 14:39 1839jQuery的事件模块是较 ... -
读jQuery之九(一些瑕疵)
2012-04-18 14:34 1325jQuery1.6.1 发布有一段时间了,发现一些冗余代 ... -
读jQuery之十八(元素位置)
2012-04-18 14:27 20本篇所读源码版本为1.7.2 jQuery中提供 ... -
读jq之八(原生事件对象的修复及扩充)
2010-12-04 09:13 2424由于各个浏览器中原生事件对象的 差异性 ,多数 JS库/框 ... -
读jq之七(判断点击了鼠标哪个键)
2010-12-03 18:31 2494jQuery丢弃了标准的 button 属性采用which ... -
jq中html()方法使用不当带来的陷阱
2010-05-29 10:54 5307.html方法当不传参数时用来获取元素的html内容,查看源码 ... -
jQuery1.4.2的一些瑕疵
2010-05-05 09:31 2283jQuery1.4.2 发布有一段时间了,发现一些多余的代 ... -
读jq之六(数据暂存)
2010-03-19 16:52 2615jq的$.data,$.removeData方法设计的很巧妙, ...
相关推荐
在探讨jQuery实现事件添加的核心方法时,我们首先要明确几个概念:elem、types、handler和data,这些是jQuery.event.add方法的主要参数。Elem指的是要添加事件监听的HTML元素,通常是HTMLElement类型。Types则是指定...
jQuery提供了丰富的DOM操作方法,如"$().html()"用于获取或设置元素的HTML内容,"$().append()"和"$().prepend()"分别用于在元素末尾和开头添加内容,"$().remove()"则用于删除元素。此外,"$().clone()"可以复制...
在这个"jQuery表格添加行数据代码"中,我们主要关注的是如何利用jQuery来动态地向表格中添加、编辑和删除行数据。这个压缩包包含了一些关键文件,如CSS样式文件、HTML页面、JavaScript脚本以及说明文件。 首先,`...
jQuery的核心部分之一是其选择器引擎Sizzle,它实现了高性能的CSS选择器解析。Sizzle使用正则表达式和递归下降解析技术,能够高效地匹配DOM元素。 9. **兼容性处理** 为了兼容不同的浏览器,jQuery做了大量的...
本文将深入探讨jQuery中事件处理的核心概念、方法以及常见的应用场景。 首先,jQuery提供了一种更加优雅的方式来处理DOM加载完成的事件。在JavaScript中,我们通常使用`window.onload`来确保所有资源(包括图片)...
在jQuery的事件模块中,`jQuery.event.add`是添加事件的核心方法。所有的`bind`、`one`、`live`等方法实际上都依赖于`jQuery.event.add`来完成事件的添加工作。这意味着,虽然表层API众多,但其底层的实现是统一和...
**jQuery核心讲解** jQuery是一个广泛使用的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画制作和Ajax交互。这个“jQuery核心讲解帮忙文档”是专为初学者设计的,旨在帮助他们快速掌握jQuery的基本概念...
使用`.on()`方法,我们可以绑定多种类型的事件,如`$("#button").on("click", function() {...})`会为按钮元素添加点击事件监听器。此外,`.off()`可以用来移除已绑定的事件,`.trigger()`可以触发特定的事件。 ...
3. **强大的事件处理**:jQuery封装了JavaScript的事件处理,允许开发者用`.on()`、`.click()`等方法绑定事件,使事件处理更加便捷。 4. **丰富的动画效果**:jQuery的`.animate()`方法可以创建自定义动画,而`....
jQuery提供了统一的事件绑定方法$.on(),可以方便地为元素添加事件监听。例如,$.click()用于绑定点击事件,$.change()则用于处理表单元素的改变事件。同时,$.event.preventDefault()和$.event.stopPropagation()...
jQuery的核心特性可以概括为:选择器、DOM操作、事件处理、动画和Ajax,这五大功能让jQuery成为了一个全能型的前端工具。 **二、jQuery的优势** 1. **选择器**:jQuery借鉴了CSS的选择器,使得选取HTML元素变得...
jQuery库是由著名的JavaScript开发者John Resig于2006年创建的一个开源库,它极大地简化了JavaScript语言在网页上的操作,使得DOM(Document Object Model)处理、事件处理、动画制作和Ajax交互变得更加容易。...
jQuery的AJAX功能使得异步数据交互变得简单,`.ajax()`是最核心的方法。例如,发送一个GET请求: ```javascript $.ajax({ url: "api/data", type: "GET", success: function(response) { console.log(response);...
**jQuery库与原生JavaScript常用方法** jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互。这个博客主要探讨了jQuery库与原生JavaScript之间的对比,以及它们各自的一些常用...
在这个名为"jQuery添加标签快捷方式代码.zip"的压缩包中,包含了一个用于实现标签功能的代码示例,特别适合快速构建具有美观效果的标签系统。 首先,我们来了解一下jQuery中的核心概念。jQuery通过链式调用、选择器...