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 相关文章推荐
JavaScript this 深入理解
Jul 30 Javascript
js变换显示图片的实例
Apr 16 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
Java File类的常用方法总结
Mar 18 Javascript
JavaScript中Window对象的属性及事件
Dec 25 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
Dec 19 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
基于D3.js实现时钟效果
Jul 17 Javascript
详解JS浏览器事件循环机制
Mar 27 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
vue中音频wavesurfer.js的使用方法
Feb 20 Vue.js
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 字符串 小常识
2009/06/05 PHP
php文档更新介绍
2011/07/22 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
jquery的ajax请求全面了解
2013/03/20 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
JsRender实用入门教程
2014/10/31 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
Node.js 回调函数实例详解
2017/07/06 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
用python实现一个简单的验证码
2020/12/09 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
傲盾软件面试题
2015/08/17 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
初中政治教学反思
2014/01/17 职场文书
购房协议书范本
2014/04/11 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书