手机版

阅读jQuery XI添加事件核心方法

时间:2021-10-18 来源:互联网 编辑:宝哥软件园 浏览:

这篇看看其源码,这个增加定义如下(省略大部分)复制代码代码如下: add:函数(elem,Type,handler,data){ if(elem。nodetype===3 | | elem。nodetype===8){ return;} .} 定义了四个参数elem,类型、处理程序和数据分别为HTMLElement,1 .事件类型(如点击)、事件响应函数、数据。此外,类型可以以空格分开传多种事件(“mouseover mouseout”)。处理者有时会是一个对象(实现活着时)。数据最后会挂在扩充后的事件对象上,即作为事件的属性。而事件会在处理者作为第一个参数拿到,这样也就可以在处理者拿到数据了。下面详细说明复制代码代码如下: if(elem。nodetype===3 | | elem。nodetype===8){ return;} 文本和注释节点直接返回。复制代码代码如下: if(handler===false){ handler=returnFalse;} else if(!处理程序){ //修复错误#7229 .jdalton返回推荐的修复;} 参数处理者为错误的时,将处理者赋值为返回假,返回假为一个函数,如下复制代码代码如下:函数返回false(){返回false;} jQuery通过处理者为错误的来阻止元素默认行为,停止事件冒泡。这个需要结合jQuery.event.handle看。复制代码代码如下: var handleObjIn,handleObjif(处理程序。handler){ handleObjIn=handler;handler=handleObjIn.handler} //如果(!汉德勒。guid){ handler。guid=jquery。guid} 定义变量handleObjIn,handleObj。处理者从字面上看是事件响应(回调)函数,但这里出现handler.handler,让人倍感怪异。即什么时候会将处理者当一个射流研究…对象传入呢?多数时候传的还是功能类型的,看看源码中jQuery.event.add的调用可发现框架在实现活着的时候会传目标类型。如下复制代码代码如下:添加:函数(handleObj){ jquery。事件。添加(这个,liveConvert(handleObj。origintype,handleObj.selector),jQuery.extend({},handleObj,{handler: liveHandler,guid : handleObj。汉德勒。guid });}, 这时会把handleObjIn赋值为所传的射流研究…对象,真正的处理者却是handleObjIn.handler。这话有点绕,慢慢体会。复制代码代码如下: //如果(!汉德勒。guid){ handler。guid=jquery。guid} 所传参数处理者添加个属性guid,为一个数字,自增的从一开始。即使用框架添加事件,会为事件响应函数默认的添加了属性guid。这个全局唯一标识符再删除事件时会用到。复制代码代码如下: //Init元素的事件结构var elemData=jQuery ._数据(elem);先取elemData,这里使用了前面提到的jQuery ._数据。第一次为接口添加事件是elemData是个空对象({})。复制代码代码如下: //如果没有找到elemData,那么我们必须尝试绑定到//禁止的空值元素之一,如果(!elem数据){ return} elemData不存在则直接返回。复制代码代码如下: var事件=elemData.events,事件句柄=elemData。手柄;定义事件,事件句柄。同样第一次时这两个变量都是未定义。复制代码代码如下: if(!事件){ elemdata。events=events={ };} if(!事件句柄){ elemdata。handle=事件句柄=函数(e){//放弃jQuery.event.trigger()的第二个事件,并且//当一个事件在页面卸载了框架的返回类型后被调用时!=='undefined '(!e | | jquery。事件。触发了!==e.type)?jquery。事件。把手。apply(事件句柄。elem,arguments ) :未定义;};} 给elemData.events和elemData.handle赋值。复制代码代码如下: //添加初步的作为句柄函数的属性//这是为了防止工业管理学(Industrial Engineering)中非本机事件的内存泄漏eventHandle.elem=elem暂存初步的到事件句柄,删除事件注册时会将其置null,避免部分浏览器中内存泄露。

复制代码如下://处理由空格分隔的多个事件//jquery(.).bind('鼠标放在鼠标外面',fn);type=types . split(');将字符串转换为以空格作为分隔符的数组。这句话使得一次添加多个事件成为可能,多个事件的处理程序是相同的。以下是while循环复制代码: while((type=type[I])){ handleobj=handleobjin?jQuery.extend({},handleObjIn): { handler : handler,data : data };}循环数组,依次处理如下,get handleObj,process event namespace,用点()区分。).如果类型有一个点,它就有一个命名空间;否则,它不会。将类型和guid属性添加到handlerObj。这些在以后删除事件时使用。找帮手,特别的。在大多数情况下,addEventListener/attachEvent用于添加事件。从变量special可以看出,ready、beforeunload、live事件等特殊事件都是经过特殊处理的。Ready调用jQuery.bindReady,而jQuery.bindReady在内部调用addEventListener/attachEvent。Beforeunload是使用window.onbeforeunload Live实现的事件代理,它的处理也是比较特殊的。最后,handleObj被添加到数组句柄中。jQuery.event.add的最后一句话解决了IE中的内存泄漏问题。复制代码如下://废掉elem防止ieelem=null内存泄漏;我做了一个jQuery事件管理的数据结构图。如下

版权声明:阅读jQuery XI添加事件核心方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。