利用on和off方法编写高效的js代码
先说下将这个话题的起因:最近发现公司的功能代码,很多在dom对象删除以后,其声明的绑定在window上的resize事件还一直存在,导致相同的功能代码执行了几次。对于我这种轻微代码洁癖的人来说,简直是个大坑。
所以,这里以jQuery的resize方法为例,讲解下我所理解的高效写法。
先看一下普通的在window下绑定resize事件:
$(window).resize(function(){
console.log("hehe");
});
$(window).resize(function(){
console.log("hehe2");
});
触发了几次resize后的执行结果如下:

两个事件处理程序不会互相覆盖是因为,jQuery的方法都是DOM2级的(这里就不细说了)。而问题就出在这里,如果再删除DOM对象后,其特有的、非绑定在本身的响应方法没有对应删除的话,会一直积累下来,像幽灵一般。而这里就是所谓的影响性能,让浏览器宝贵的CPU被无效的功能代码消耗掉,用户体验也在积累一定数量级该幽灵代码后,逐级降低,甚至卡死。
怎么解决呢?当然是kill掉!
如果用unbind方法,是可以进行清除操作,但是关键有时候会勿删,特别是多人协作的团队。所以,on和off方法就派上用场了!
将resize方法改造一下:
$(window).on("resize.fn1", function(){
console.log("hehe");
});
$(window).on("resize.fn2", function(){
console.log("hehe2");
});
重点是on方法的第一个参数:resize.fn1。实心点之前,是该window对象要绑定的resize方法;实心点之后是为该方法取的一个别名,用于标识该方法(注意不能有空格,这是我的一位同事遇到的)。
这个别名,是用于调用off方法时,删除指定对应的处理程序。
如我要删除输出“hehe”的处理程序,代码如下:
$(window).off("resize.fn1");
这样,就可以把不需要的功能代码精确销毁,而不会导致勿删。
另外提醒下,resize事件可以根据需要写n个,然后,你可以根据业务的功能划分,为相同生存期的代码标识相同的别名,以便可以统一销毁。
扩展一下思路:
一般我们写扩展性比较好的函数,比如生成一个遮罩,一般都会预留一个calbackl方法,如下:
function overlay(options){
var default = {
/*其他参数 */
callback:false
};
var settings = $.extend({}, default, options);
if(!!settings.callback){
settings.callback();
}
}
但是,我们可以把扩展性做得更好,比如当遮罩初始化生成时,在window上绑定一个resize事件,输出1
var data = {
/*其他参数*/
extFn : [{
obj:$(window),
name:"resize.overlay",
fn:function(){
console.log(1);
}
}]
};
overlay(data);
function overlay(options){
var default = {
/*其他参数*/
callback:false,
extFn:[]
};
var settings = $.extend({}, default, options);
if(settins.extFn.length > 0){
var extFn_obj, extFn_name, extFn_fn;
for(var i = 0, len = settings.extFn.length; i < len; i++){
extFn_obj = settings.extFn[i].obj;
extFn_name = settings.extFn[i].name;
extFn_fn = settings.extFn[i].fn;
extFn_obj.off(extFn_name);//销毁旧的事件绑定
extFn_obj.on(extFn_name, extFn_fn);//添加新的事件绑定
}
}
/*其他方法及callback*/
}
当然,在销毁生成遮罩时,也应对应的销毁自定义绑定的扩展方法,这里就不叨叨了~
via:cnblogs.com/walls/p/4253663.html
利用on和off方法编写高效的js代码的更多相关文章
- 编写高效的jQuery代码
http://www.css88.com/jqapi-1.9/ 编写高效的jQuery代码 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上 ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...
- 编写高质量JS代码的68个有效方法(八)
[20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(七)
[20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(六)
[20141213]编写高质量JS代码的68个有效方法(六) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(四)
[20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(三)
[20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- 编写高质量JS代码的68个有效方法(二)
[20141011]编写高质量JS代码的68个有效方法(二) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)
编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
随机推荐
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- Visual Studio Code 代理设置
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...
- BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的:
- AutoMapper随笔记
平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...
- 香蕉云APP,2016下半年开发日记
2016-6-17 数据库设计不应该过多依赖范式,适度的冗余可以加快搜索速度,在服务器的配置还可以的情况下,可以采用冗余来解决查找慢的问题.还一个是要选择好数据库引擎,例如 InnoDB 和 myi ...
- 在开启DRS的集群中修复VMware虚拟主机启动问题
通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...
- 代码的坏味道(21)——中间人(Middle Man)
坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...
- 代码的坏味道(18)——依恋情结(Feature Envy)
坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...
- asp.net mvc 验证码
效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...