西宁建设网站多少钱,做招聘信息的网站有哪些,青岛微网站开发,创作平台使用jQuery删除事件#xff08;或称解除事件绑定#xff09;有三个函数#xff1a;unbind、die和undelegate。这三个方法都依赖于未公开的jQuery.event.remove#xff08;后续使用remove简写#xff09;。此为删除事件的核心方法。remove 所作的事情与上一篇提到的.add 刚…使用jQuery删除事件或称解除事件绑定有三个函数unbind、die和undelegate。这三个方法都依赖于未公开的jQuery.event.remove后续使用remove简写。此为删除事件的核心方法。 remove 所作的事情与上一篇提到的.add 刚好相反。且与.add中的处理代码一一对应即 .add 中有多少种添加事件的方式remove就有对应的删除方式。 remove 定义了四个参数 elem, types, handler, pos 。从字面上看四个参数的意义很明了 elem 为HTMLElementtypes 为String类型事件名称如click或mouseover mouseout handler 为Function类型事件回调函数pos 为Number类型指定数组位置 但remove内部没这么简单如 1. handler 有时会传布尔类型false这时会把handler赋值为另一个函数此处的处理同.add if ( handler false ) {handler returnFalse;
}2. types 有时会为一个对象这时真正的handler是types.handlertypes是types.type // types is actually an event object here
if ( types types.type ) {handler types.handler;types types.type;
}我们知道变量命名要具有意义名副其实而避免误导。从这个意义上讲jQuery中存在大量这样的写法一个变量往往具有多种含义晦涩难读。如这里的types应该是String类型但实际内部对typeos为Object类型也做了处理。这是JS没有类型检查的原因导致。反过来讲这种语言会比较灵活jQuery才如此 紧凑 内聚。 闲言少叙看看.remove方法都做了哪些事。 当只传elem时会将elem上添加的所有事件都删除。如$(#id).unbind()当types为String且以点号.开头时将删除该命名空间下的事件。如$(#id).unbind(.name)。会把添加click.namemouseover.name等都删除对应的代码如下 // Unbind all events for the element
if ( !types || typeof types string types.charAt(0) . ) {types types || ;for ( type in events ) {jQuery.event.remove( elem, type types );}return;
}我们发现for in中是个递归调用。 如果这么调用 jQuery.event.remove(el, click, fn) 那么是不会走上面的递归的而是直接进入了while循环 while ( (type types[ i ]) ) {...} 这是标准的删除事件的流程。大概步骤如下 判断事件名称是否具有命名空间以点号区分如果没有命名空间则删除该事件名称下的所有事件。否则只删除命名空间的某事件。取得事件数组eventType events[ type ]如果没有传handler则表示删除该类型事件的所有hanlder否则只删除该事件类型的指定handler。对特殊事件如live的处理最后对elemData进行处理如果events为空对象则删除elemData的events和handle属性。如 // Remove the expando if its no longer used
if ( jQuery.isEmptyObject( events ) ) {var handle elemData.handle;if ( handle ) {handle.elem null;}delete elemData.events;delete elemData.handle;if ( jQuery.isEmptyObject( elemData ) ) {jQuery.removeData( elem, undefined, true );}
}jQuery事件管理数据结构图