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 相关文章推荐
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
基于jQuery的动态表格插件
Mar 28 Javascript
js中的异常处理try...catch使用介绍
Sep 21 Javascript
自己实现ajax封装示例分享
Apr 01 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
浅析vue中的MVVM实现原理
Mar 04 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 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错误、异常处理类
2014/03/21 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
python统计日志ip访问数的方法
2015/07/06 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
用matplotlib画等高线图详解
2017/12/14 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
JSF的标签库有哪些
2012/04/27 面试题
党员自我评价分享
2013/12/13 职场文书
大一新生检讨书
2014/10/29 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
七年级数学教学反思
2016/02/17 职场文书
高三化学教学反思
2016/02/22 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
如何利用python创作字符画
2022/06/25 Python
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python