啃了一段日子的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()

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

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

  1. JQuery事件绑定,bind与on区别

    jquery事件绑定 bind:向匹配元素添加一个或多个事件处理器 $(selector).bind("click",data,function); live:向当前或未来的匹配元 ...

  2. html淡化效果,jQuery实现基本淡入淡出效果的方法详解

    本文实例讲述了jQuery实现基本淡入淡出效果的方法.分享给大家供大家参考,具体如下: jQuery fadeIn()方法:用于淡入已隐藏的元素 jQuery fadeOut()方法:用于淡出可见的元 ...

  3. Jquery ajax提交表单几种方法详解

    [导读] 在jquery中ajax提交表单有post与get方式,在使用get方式时我们可以直接使用ajax 序列化表单$( 表单ID) serialize();就行了,下面我来介绍两个提交表单数据的 ...

  4. html用排序列表的方式添加,jQuery html表格排序插件tablesorter使用方法详解

    tablesort是一款很好用的jQuery表格排序插件. 支持多种数据类型排序,会自动识别表格内容数据类型,使用也非常方便. 使用jQuery tablesort实现html表格方法: 1. 下载j ...

  5. html 表格自动排序,jQuery html表格排序插件tablesorter使用方法详解

    tablesort是一款很好用的jQuery表格排序插件. 支持多种数据类型排序,会自动识别表格内容数据类型,使用也非常方便. 使用jQuery tablesort实现html表格方法: 1. 下载j ...

  6. JQuery事件绑定解绑方法小结

    常用的方法 绑定:bind().delegate().on() 解绑:unbind().undelegate().off() 此外还有live() 不过JQuery1.9及其以上版本删除了此方法 推荐 ...

  7. jquery事件绑定和解除绑定bind、unbind、one

    全栈工程师开发手册 (作者:栾鹏) jquery系列教程4-事件操作全解 jquery事件绑定 使用函数bind(type [,data],fn)绑定事件,one函数也可以进行一次绑定,但是需要注意b ...

  8. JQuery的click、bind、delegate、off、unbind

    .click与.bind .click和.bind都是给每个元素绑定事件,对于只绑定一个click事件,.bind事件的简写就是.click那种方式. 这两种方式都会出现两个问题: 第一个问题,如果要 ...

  9. HTML中详述jQuery事件绑定方式

    jQuery事件绑定方式 1.bind()方法: bind(type,[data],fn):为每个匹配元素的特定事件绑定对应的事件处理函数,各参数含义如下: type表示事件类型,多个事件类型使用空格 ...

最新文章

  1. 周期方波的傅里叶级数系数
  2. java内存分配与管理
  3. Jquery的Split二次分割
  4. C# SerialPort 读写三菱FX系列PLC
  5. html怎么一段时间把网页背景更换_复盛螺杆压缩机故障怎么维修?
  6. 软件工程学习笔记《目录》
  7. 北京房租到底有多高? | 爬取北京海淀区一居室租房信息
  8. plsql创建表提示标识符过长_创建安全多签名钱包及高级设置
  9. 大兴新年大集 推10条文化旅游线
  10. 2597 团伙(并查集就是好用!)
  11. python中的numpy模块和pandas模块的区别_python的numpy模块- 01.pandas基本数据类型
  12. Git学习(四)标签管理
  13. 面试遇Spark,别怂!
  14. 静态测试和动态测试有何区别
  15. 姿态估计之CPN(Cascaded Pyramid Network)
  16. 无限制翻译PDF文件——低调使用
  17. 计算机主板是cpu吗,主板和cpu是一起的吗
  18. 小程序如何通过云开发获取手机号
  19. 如何用光盘自动安装win7操作系统
  20. 关于iPhone X下Home Indicator(白条)的隐藏和延迟响应

热门文章

  1. hdu 5045 费用流
  2. 【错误记录】Groovy 函数拦截调用 invokeMethod 导致栈溢出 ( java.lang.StackOverflowError )
  3. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
  4. 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )
  5. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
  6. 【Android 系统开发】 Android 系统启动流程简介
  7. Redis 你该懂的点
  8. 7-20(排序) 奥运排行榜(25 分)
  9. 【Java面试题】41 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?...
  10. mysql远程连接 Host * is not allowed to connect to this MySQL server