jQuery事件绑定方法学习总结(推荐)


Posted in Javascript onNovember 21, 2016

对于jQuery中的事件绑定方法,主要有on()、bind()、delegate()、live()等这几个方法。之前都是之前拿过来用,也知道有这么几个方法,但是不清楚这几个事件绑定方法之间的区别。平时用的最多的是on方法,今天打算整理一下。

bind方法

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <title>bind事件绑定</title>
</head>
<body>
<div>
 <button id="btn">添加新的p元素</button>
 <p>第一个p元素</p>
 <p>第二个p元素</p>
 <p>第三个p元素</p>
 <p>第四个p元素</p>
 <p>第五个p元素</p>
</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
//点击添加一个新的元素
$("#btn").click(function(){
 $("div").append("<p>这是一个新的p元素</p>");
});
//给所有的p元素绑定点击事件
$("div p").click(function(){
 alert($(this).text());
});
</script>
</body>
</html>

这种绑定事件的方式缺点:

当页面上p元素特别多的时候,会导致页面上存在大量的事件处理程序,导致页面性能差;

对于动态生成的新元素,不具有点击事件。

对于这两个缺点,我们可以通过下面即将要介绍的delegate方法来解决。

delegate方法

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <title>jQuery事件绑定</title>
</head>
<body>
<div>
 <button id="btn">添加新的p元素</button>
 <p>第一个p元素</p>
 <p>第二个p元素</p>
 <p>第三个p元素</p>
 <p>第四个p元素</p>
 <p>第五个p元素</p>
</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$("#btn").click(function(){
 $("div").append("<p>这是一个新的p元素</p>");
});
$("div").delegate("p", "click", function () {
 alert($(this).text());
});
</script>
</body>
</html>

上面的例子中我们使用事件委托的原理,利用delegate来绑定事件。

不直接为p元素绑定事件,而是为其父元素(或祖先元素)绑定事件,当在div内任意元素上点击时,事件会一层层从event target(目标元素)向上冒泡,直至到达你为其绑定事件的元素,如此例中的div元素。冒泡的过程中,如果事件的currentTarget与选择器匹配时,就会执行代码。

这样就解决了用bind()方法的上面两个问题,不用再一个个地去为p元素绑定事件,有效减少了页面上事件处理程序数量,也可以为动态添加进来的p元素绑定事件。

这种方式也是有缺陷的:这样绑定是容易了,但是调用的时候也可能出现问题。如果事件目标在DOM树中很深的位置,这样一层层冒泡上来查找与选择器匹配的元素,又影响到性能了。

bind和delegate源码实现

bind: function( types, data, fn ) {
  return this.on( types, null, data, fn );
 },
 unbind: function( types, fn ) {
  return this.off( types, null, fn );
 },

 delegate: function( selector, types, data, fn ) {
  return this.on( types, selector, data, fn );
 },
 undelegate: function( selector, types, fn ) {
  // ( namespace ) or ( selector, types [, fn] )
  return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
 }

从源码中可以看出,无论bind()还是delegate()其实都是通过on()方法实现的,只是参数不同罢了。

on方法

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <title>jQuery事件绑定</title>
</head>
<body>
<div>
 <button id="btn">添加新的p元素</button>
 <p>第一个p元素</p>
 <p>第二个p元素</p>
 <p>第三个p元素</p>
 <p>第四个p元素</p>
 <p>第五个p元素</p>
</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
//给每一个p元素绑定点击事件
$("div").on("click","p",function(){
 alert($(this).text());
});
</script>
</body>
</html>

移除事件

对于bind()、delegate()和on()绑定方法,其移除事件的方法分别为:

$( "div p" ).unbind( "click", handler );
$( "div" ).undelegate( "p", "click", handler );
$( "div" ).off( "click", "p", handler );

小结

•选择器匹配到的元素比较多时,不要用bind()迭代绑定;
•用id选择器时,可以用bind();
•需要给动态添加的元素绑定时,用delegate()或者on();
•用delegate()和on()方法,dom树不要太深;
•尽量使用on()。

以上这篇jQuery事件绑定方法学习总结(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现自定义标签
May 08 Javascript
jquery中this的使用说明
Sep 06 Javascript
jQuery表格排序组件-tablesorter使用示例
May 26 Javascript
jQuery在线选座位插件seat-charts特效代码分享
Aug 27 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
Sep 06 Javascript
JS实现来回出现文字的状态栏特效代码
Oct 31 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
Mar 07 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
JS动态显示倒计时效果
Dec 12 Javascript
WEB前端性能优化的7大手段详解
Feb 04 Javascript
JavaScript中CreateTextFile函数
Aug 30 Javascript
js学习之----深入理解闭包
Nov 21 #Javascript
浅谈js原生拖放
Nov 21 #Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 #Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
Nov 21 #Javascript
JS中判断null的方法分析
Nov 21 #Javascript
javascript 利用arguments实现可变长参数
Nov 21 #Javascript
js 点击a标签 获取a的自定义属性方法
Nov 21 #Javascript
You might like
我的群发邮件程序
2006/10/09 PHP
PHP执行速率优化技巧小结
2008/03/15 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
使用Python绘制图表大全总结
2017/02/11 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Python实现数字的格式化输出
2020/08/01 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
大专生自我鉴定范文
2013/10/01 职场文书
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
中小学生学籍证明
2014/10/25 职场文书
小学教师求职信范文
2015/03/20 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
乔迁新居祝福语
2019/11/04 职场文书
python数字转对应中文的方法总结
2021/08/02 Python