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 相关文章推荐
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 Javascript
javascript实现checkBox的全选,反选与赋值
Mar 12 Javascript
基于jQuery实现返回顶部实例代码
Jan 01 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
vue之nextTick全面解析
May 17 Javascript
详解JavaScript按概率随机生成事件
Aug 02 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
最基础的Python的socket编程入门教程
2015/04/23 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Django框架模板介绍
2019/01/15 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
家具促销活动方案
2014/02/16 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
主题教育活动总结
2014/05/05 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
八项规定整改方案
2014/10/01 职场文书
小学运动会报道稿
2014/10/04 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python