jQuery移除元素自动解绑事件实现思路及代码
发布时间:2020-12-14 23:16:28 所属栏目:资源 来源:网络整理
导读:世界本该如此! 所以,在现代浏览器,如果你将一个元素从DOM树种进行移除的时候,浏览器会自动帮你绑定的事件进行解绑以释放其占用的内存。也许你猜到了,较老版本的浏览器则不会主动去做这件事,所以,当你的应用在较老版本的浏览器运行的越久,其消耗内存
世界本该如此! 复制代码 代码如下: define(['jquery','underscore'],function () { var bindDirects = ['delegate','bind','on','hover','blur','change','click','dblclick','focus','keydown','keypress','keyup','mousedown','mouseenter','mouseleave','mousemove','mouSEOut','mouSEOver','mouseup','resize','scroll','select','submit']; var eMarker = '_addedEvent'; _.each(bindDirects,function (eventName) { var alias = $.fn[eventName]; $.fn[eventName] = function () { var $tar = _.isElement(this)?$(this):this; var hasEventAdded = $tar.attr(eMarker) || ''; var _en = eventName; if (hasEventAdded.length) { _en += ',' + hasEventAdded; } $tar.attr(eMarker,_en); return alias.apply(_.isElement(this)?$tar:this,[].slice.call(arguments)); }; }); // 为某一个元素移除绑定的事件 function removeEvents($tar) { var addedEventsName = $tar.attr(eMarker); if (addedEventsName) { addedEventsName.replace(/[^,]+/g,function (eventName) { // 全部移除 if (eventName === 'delegate') { $tar.undelegate(); } else { $tar.unbind(); } return eventName; }); } } var funcs = ['html','empty']; _.each(funcs,function (func) { var alias = $.fn[func]; $.fn[func] = function () { var $tar = _.isElement(this)?$(this):this; if($tar.length){ $tar.find('*[' + eMarker + ']').each(function (k,subEl) { try{ removeEvents($(subEl)); }catch(e){ console.error(e.message); } }); } var args = [].slice.call(arguments); return alias.apply($tar,args); }; }); // 扩展remove()方法 var alias = $.fn.remove; $.fn.remove = function () { var $tar = _.isElement(this)?$(this):this, arg = arguments; if($tar.length && !arg.length){ $tar.find('*[' + eMarker + ']').each(function (k,subEl) { try{ removeEvents($(subEl)); }catch(e){ console.error(e.message); } }); } if(arg.length){ var selector = arg[0]; if(_.isString(selector)){ $tar.find(selector).each(function(k,curEl){ var $cur = $(curEl); $cur.find('*[' + eMarker + ']').each(function (k,subEl) { try{ removeEvents($(subEl)); }catch(e){ console.error(e.message); } }); removeEvents($cur); $cur.remove(); }); } } var args = [].slice.call(arguments); return alias.apply($tar,args); }; }); 还是那句话,了解的越多,你能做的就越多! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |