首页 > 代码库 > javascript事件之:jQuery.event.remove事件详解
javascript事件之:jQuery.event.remove事件详解
之前已经介绍过jQuery.event.add,现在我们来看看jQuery.event.remove
先上代码
/* elem: 处理的元素 types: 移除的事件 handler: 移除的方法 selector: 委托的元素 mappedTypes:*/remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, //得到绑定在elem上的data缓存 elemData = http://www.mamicode.com/data_priv.hasData( elem ) && data_priv.get( elem ); // 没有elemData或者elemData.events,退出函数 if ( !elemData || !(events = elemData.events) ) { return; } // 处理用空格分割开的多事件操作 types = ( types || "" ).match( core_rnotwhite ) || [""]; t = types.length; while ( t-- ) { //typenamespace = /^([^.]*)(?:\.(.+)|)$/; tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // 移除该元素下所有事件 if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; //如果存在命名空间,得到一个带命名空间的正则 tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); origCount = j = handlers.length; while ( j-- ) { //得到handlers下的一个handleObj handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { // 移除handlers下对应的事件对象 handlers.splice( j, 1 ); // 处理delegateCount if ( handleObj.selector ) { handlers.delegateCount--; } // 如果specia下有remove,调用 if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } // 移除evens下类型 delete events[ type ]; } } // Remove the expando if it‘s no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; data_priv.remove( elem, "events" ); }},
javascript事件之:jQuery.event.remove事件详解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。