jQuery 通过事件委派一次绑定多种事件,以减少事件冗余


Posted in Javascript onJune 30, 2010

于是乎,在日常的开发中大量使用连缀写法,而事件方法连缀就是一个特例。若给一个Dom对象使用了绑定了多个事件,便于阅读和书写,习惯了使用连缀写法,但这样的书写方式会造成时间的冗余。
1.事件冗余:多个事件方法中多次调用相同的代码
下面的代码是一个事件方法连缀的写法:

jQuery(function($) { 
$('<div id="livetip"></div>').hide().appendTo('body'); 
var tipTitle = ''; 
$('#mytable').bind('mouseover', function(event) { 
var $link = $(event.target).closest('a'); 
if ($link.length) { 
var link = $link[0]; 
tipTitle = link.title; 
link.title = ''; 
$('#livetip').css({ 
top: event.pageY + 12, 
left: event.pageX + 12 
}) 
.html('<div>' + tipTitle + '</div><div>' + link.href + '</div>') 
.show(); 
}; 
}).bind('mouseout', function(event) { 
var $link = $(event.target).closest('a'); 
if ($link.length) { 
$link.attr('title', tipTitle); 
$('#livetip').hide(); 
}; 
}).bind('mousemove', function(event) { 
var $link = $(event.target).closest('a'); 
if ( $link.length) { 
$('#livetip').css({ 
top: event.pageY + 12, 
left: event.pageX + 12 
}); 
}; 
}); 
});

其中第5|6行、第18|19行、第24|25行多次地使用了同样的一段代码去判断事件对象是否存在。这不管是从代码效率还是代码文件大小的方面来说都是不合理的方法。
2.事件委派:一次性绑定多个事件,根据事件类别委派相应的操作
为了更好地优化上面的代码,可以通过事件委派来修改代码,修改后的代码如下:
jQuery(function($) { 
var $liveTip = $('<div id="livetip"></div>').hide().appendTo('body'); 
var tipTitle = ''; 
$('#mytable').bind('mouseover mouseout mousemove', function(event) { 
var $link = $(event.target).closest('a'); 
if (!$link.length) { return; } 
var link = $link[0]; 
if (event.type == 'mouseover' || event.type == 'mousemove') { 
$liveTip.css({ 
top: event.pageY + 12, 
left: event.pageX + 12 
}); 
}; 
if (event.type == 'mouseover') { 
tipTitle = link.title; 
link.title = ''; 
$liveTip.html('<div>' + tipTitle + '</div><div>' + link.href + '</div>') 
.show(); 
}; 
if (event.type == 'mouseout') { 
$liveTip.hide(); 
if (tipTitle) { 
link.title = tipTitle; 
}; 
}; 
}); 
});

该段代码中一次性地将多个事件绑定到一个待处理的DOM对象之上,在代码的内部通过判断事件的类别来委派不同的处理代码。这样可以避免代码的重复定义,以达到避免时间冗余的效果。
以上两种代码的执行后的效果是完全一样的,相信大家一眼就可以看中哪一种代码的执行效率更加的快速吧!
演示地址 http://demo.3water.com/js/event_delegation/index.html
打包下载 https://3water.com/jiaoben/28044.html
Javascript 相关文章推荐
Code:loadScript( )加载js的功能函数
Feb 02 Javascript
JavaScript 私有成员分析
Jan 13 Javascript
javascript 特殊字符串
Feb 25 Javascript
JavaScript的eval JSON object问题
Nov 15 Javascript
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
在AngularJS中使用AJAX的方法
Jun 17 Javascript
老生常谈 关于JavaScript的类的继承
Jun 24 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
Apr 20 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
vue实现给div绑定keyup的enter事件
Jul 31 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 #Javascript
基于jquery的图片懒加载js
Jun 30 #Javascript
CSS和Javascript简单复习资料
Jun 29 #Javascript
javascript与CSS复习(三)
Jun 29 #Javascript
javascript与CSS复习(二)
Jun 29 #Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 #Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
Jun 29 #Javascript
You might like
php安装swoole扩展的方法
2015/03/19 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
python实现图片处理和特征提取详解
2017/11/13 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
RealTek面试题
2016/06/28 面试题
社团文化节邀请函
2014/01/10 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
赡养老人协议书
2014/04/21 职场文书
体育课外活动总结
2014/07/08 职场文书
优秀英文求职信范文
2015/03/19 职场文书
给病人的慰问信
2015/03/23 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技