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 相关文章推荐
小议javascript 设计模式 推荐
Oct 28 Javascript
jQuery Study Notes学习笔记 (二)
Aug 04 Javascript
jQuery之按钮组件的深入解析
Jun 19 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
Feb 28 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
AngularJS优雅的自定义指令
Jul 01 Javascript
详细谈谈javascript的对象
Jul 31 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
js事件冒泡与事件捕获详解
Feb 20 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
Aug 19 Javascript
微信小程序登录数据解密及状态维持实例详解
May 06 Javascript
微信小程序实现购物车小功能
Dec 30 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数组相关函数汇总
2015/03/24 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
Python中的迭代器漫谈
2015/02/03 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
python3爬取各类天气信息
2018/02/24 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
python3.7调试的实例方法
2020/07/21 Python
python线程里哪种模块比较适合
2020/08/02 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
金融专业个人求职信范文
2013/11/28 职场文书
开业典礼主持词
2014/03/21 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
运动会入场词
2015/07/18 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
Elasticsearch 配置详解
2022/04/19 Java/Android