利用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 ...
随机推荐
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇
什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
- Ajax 概念 分析 举例
Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- FullCalendar日历插件说明文档
FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...
- IIS8 使用FastCGI配置PHP环境支持 过程详解
平时帮朋友们配置过一些PHP环境的服务器,但是一直使用的都是Apache HTTP+PHP,今天呢,我吧IIS+PHP配置方式给大家发一下下~呵呵. 在这里,我使用的是FastCGI模块映射的方式配置 ...
- crontab介绍
1.Cron的启动与关闭 由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务: /sbin/service crond start //启动服务/sbin/se ...
- Storm介绍(一)
作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 内容简介 本文是Storm系列之一,介绍了Storm的起源,Storm ...
- 用 eric6 与 PyQt5 实现python的极速GUI编程(系列04)---- PyQt5自带教程:地址簿(address book)
[引子] 在PyQt5自带教程中,地址簿(address book)程序没有完全实现界面与业务逻辑分离. 本文我打算用eric6+PyQt5对其进行改写,以实现界面与逻辑完全分离. [概览] 1.界面 ...