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 相关文章推荐
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
Aug 15 Javascript
javascript去掉代码里面的注释
Jul 24 Javascript
CSS图片响应式 垂直水平居中
Aug 14 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
bootstrap精简教程_动力节点Java学院整理
Jul 14 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
vue.config.js常用配置详解
Nov 14 Javascript
Vue实现简易计算器
Feb 25 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
模仿OSO的论坛(五)
2006/10/09 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python 类之间的参数传递方式
2019/12/20 Python
区分python中的进程与线程
2020/08/13 Python
python利用opencv实现颜色检测
2021/02/23 Python
组织关系转移介绍信
2014/01/16 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
5s标语大全
2014/06/23 职场文书
经济类毕业生求职信
2014/06/26 职场文书
手机销售员岗位职责
2015/04/11 职场文书
围城读书笔记
2015/06/26 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
《风筝》教学反思
2016/02/23 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL