// 移除事件处理对象 // (移除特殊事件处理过程中避免潜在的无限递归,下一章会专门详解这种情况) if ( origCount && !handlers.length ) { //例如 var js_obj = document.createElement("div"); js_obj.onclick = function(){ …} //上面的js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性onclick,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)所以形成了一个,循环引用. if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; }
4. 如果节点上没有任何绑定的事件,则清空事件处理入口handle
if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; //removeData还检事件对象是否为空,所以使用它替代delete jQuery._removeData( elem, "events" ); }
拓展: 浏览器事件删除jQuery.removeEvent
jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054,避免自定义事件在IE6-8中的内存泄露 // detachEvent需要传递第一个参数,不能是undefined的 if ( typeof elem[ name ] === core_strundefined ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } };
以上内容是小编给大家介绍的jQuery 1.9.1源码分析系列(十)事件系统之绑定事件,希望大家喜欢。
您可能感兴趣的文章: