jQuery移除元素自动解绑事件实现思路及代码


Posted in Javascript onMay 31, 2014

世界本该如此!

所以,在现代浏览器,如果你将一个元素从DOM树种进行移除的时候,浏览器会自动帮你绑定的事件进行解绑以释放其占用的内存。也许你猜到了,较老版本的浏览器则不会主动去做这件事,所以,当你的应用在较老版本的浏览器运行的越久,其消耗内存越多,应用就会变得越来越卡。因此,需要我们自己对要删除的元素进行事件解绑。

实现思路

用jQuery将元素移除的基本方法常用的有三个,一个是remove()方法,一个是html()方法,一个是empty()方法。我们可以对此三个方法进行进一步的封装,我们会在事件绑定的时候给绑定事件的元素添加一个属性标识,从要删除的元素中去寻找有此标识的元素,然后进行事件的完全解绑。一切都是那么的巧妙!需要注意的一点是,remove()方法在执行的时候会对其自身进行事件解绑,并且该方法可以接受一个选择器参数,以删除其子元素。

实现代码

有了实现思路,编码可以很快搞定。如下:

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); 
}; 
});

还是那句话,了解的越多,你能做的就越多!
Javascript 相关文章推荐
新浪中用来显示flash的函数
Apr 02 Javascript
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
JavaScript动态调整TextArea高度的代码
Dec 28 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
鼠标移到图片上变大显示而不是放大镜效果
Jun 15 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
jQuery实现全选按钮
Jan 01 jQuery
JavaScript阻止事件冒泡的方法
Dec 06 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 #Javascript
js中的for如何实现foreach中的遍历
May 31 #Javascript
javascript 小数取整简单实现方式
May 30 #Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 #Javascript
jquery获取tagName再进行判断
May 29 #Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 #Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 #Javascript
You might like
十天学会php之第一天
2006/10/09 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
使用python分析git log日志示例
2014/02/27 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
工程技术员岗位职责
2014/03/02 职场文书
卫生系统先进事迹
2014/05/13 职场文书
单位作风建设自查报告
2014/10/23 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
Python数据结构之队列详解
2022/03/21 Python