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 XML数据显示为HTML一例
Dec 23 Javascript
javascript html 静态页面传参数
Apr 10 Javascript
一个简单的javascript类定义例子
Sep 12 Javascript
JavaScript实现仿网易通行证表单验证
May 25 Javascript
jquery简单实现幻灯片的方法
Aug 03 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
AngularJS表单详解及示例代码
Aug 17 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
Nov 01 Javascript
Jquery鼠标放上去显示全名的实现方法
Feb 06 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
vue常用高阶函数及综合实例
Feb 25 Vue.js
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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
python对数组进行反转的方法
2015/05/20 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
python移位运算的实现
2019/07/15 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
详解python中的lambda与sorted函数
2020/09/04 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
毕业自荐信
2013/12/16 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
主要领导对照检查材料
2014/08/26 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
python​格式化字符串
2022/04/20 Python