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 相关文章推荐
JSON 学习之完全手册 图文
May 29 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
基于javascript实现的搜索时自动提示功能
Dec 26 Javascript
使用Javascript写的2048小游戏
Nov 25 Javascript
js模式化窗口问题![window.dialogArguments]
Oct 30 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
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计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
python处理document文档保留原样式
2019/09/23 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python库安装速度过慢解决方案
2020/07/14 Python
Python Http请求json解析库用法解析
2020/11/28 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
奖学金自我鉴定范文
2013/10/03 职场文书
查环查孕证明
2014/01/10 职场文书
军训自我鉴定200字
2014/02/13 职场文书
先进集体事迹材料
2014/02/17 职场文书
英语教学随笔感言
2014/02/20 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
二审代理词范文
2015/05/25 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers