jQuery事件绑定on()、bind()与delegate() 方法详解


Posted in Javascript onJune 03, 2015

啃了一段日子的js相关了,学的过程中发现在jQuery中绑定事件时,有人用bind(),有人用on(),有人用delegate(),还有人用live(),看代码的时候觉得都实现功能了也就掀过去了,只是一直没完全弄懂之间的区别,于是今天查了下资料,自己做个总结。

之所以有这么多类型的绑定方法,是因为jQuery的版本更新的原因,如on()方法就是1.7以后出现的。

jQuery的事件绑定api页面上,提到live()方法已经过时,不建议使用。所以这里我们主要就看下以下三个方法:bind()、delegate()、on()

我们准备一个html页面,用于各种类型事件绑定的测试。

<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
</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>
$("#btn").click(function(){
  $("div").append("<p>这是一个新的p元素</p>");
});
</script>

</body>
</html>

一个简单的页面,放置了一个div,div里面若干个p元素和一个按钮,点击按钮可以追加p元素。我们下面将对页面上的p元素绑定click事件。

bind()

用法

$("div p").bind("click", function () {

    alert($(this).text());

})

这样就为所有div里的p元素都绑定了click事件,响应为弹出其内容。绑定很简单快捷,但是这里有两个问题:
第一个问题,这里用了隐式迭代的方法,如果匹配到的元素特别多的时候,比如如果我在div里放了50个p元素,就得执行绑定50次。对于大量元素来说,影响到了性能。
但是如果是id选择器,因为id唯一,用bind()方法就很快捷了。
第二个问题,对于尚未存在的元素,无法绑定。点击页面上的按钮,将动态添加一个p元素,点击这个p元素,会发现没有动作响应。
用delegate方法就可以解决这两个问题了。

另外提一下,bind()方法还有一种简写方式,上面的代码还可以换成:

$("div p").click(function () {

    alert($(this).text());

})

delegate()

用法

$("div").delegate("p", "click", function () {

    alert($(this).text());

});

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

这样就解决了用bind()方法的上面两个问题,不用再一个个地去为p元素绑定事件,也可以为动态添加进来的p元素绑定。甚至,如果你将事件绑定到document上,都不用等document准备好就可执行绑定。

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

on()

on()其实是将以前的绑定事件方法作了统一,查看jQuery无压缩的源码(我这里看的版本是1.11.3),可以发现无论bind()还是delegate()其实都是通过on()方法实现的,只是参数不同罢了。

 

 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 );

    }

上面的例子中,用on()可以作如下绑定:

$("div").on("click","p",function(){

    alert($(this).text());

})

官方文档建议:

As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document.

尽量使用on()来绑定事件。

移除事件

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

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

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

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

除了像上面这样移除指定的事件绑定之外,还可以不传入参数,移除所有事件绑定,这里就不一一列出了,jQuery的官方文档写得非常详细。

总结

1.选择器匹配到的元素比较多时,不要用bind()迭代绑定

2.用id选择器时,可以用bind()

3.需要给动态添加的元素绑定时,用delegate()或者on()

4.用delegate()和on()方法,dom树不要太深

5.尽量使用on()

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
早该知道的7个JavaScript技巧
Mar 27 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
在Javascript中处理字符串之big()方法的使用
Jun 08 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
Aug 07 Javascript
js实现的后台左侧管理菜单代码
Sep 11 Javascript
Highcharts入门之基本属性
Aug 02 Javascript
浅谈js常用内置方法和对象
Sep 24 Javascript
微信小程序文章详情页面实现代码
Sep 10 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 #Javascript
浅谈javascript中基本包装类型
Jun 03 #Javascript
js中函数声明与函数表达式
Jun 03 #Javascript
JavaScript基本语法讲解
Jun 03 #Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 #Javascript
ECMAScript中函数function类型
Jun 03 #Javascript
JavaScript运算符小结
Jun 03 #Javascript
You might like
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
Python图片的横坐标汉字实例
2019/12/04 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
班主任对学生的评语
2014/04/26 职场文书
环保建议书100字
2014/05/14 职场文书
怎样写离婚协议书
2014/09/10 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
安全承诺书格式范本
2015/04/28 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
Redis批量生成数据的实现
2022/06/05 Redis