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 关于# 和 void的区别分析
Oct 26 Javascript
详细讲解JS节点知识
Jan 31 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
Oct 21 Javascript
js跑步算法的实现代码
Dec 04 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 Javascript
利用Node.js编写跨平台的spawn语句详解
Feb 12 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
Jan 16 Javascript
3种vue路由传参的基本模式
Feb 22 Javascript
微信小程序自定义对话框弹出和隐藏动画
Jul 19 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
深入理解Python 代码优化详解
2014/10/27 Python
Python字符串格式化
2015/06/15 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
如何用Python破解wifi密码过程详解
2019/07/12 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
python如何支持并发方法详解
2020/07/25 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
优秀实习生主要事迹
2014/05/29 职场文书
承诺书格式范文
2014/06/03 职场文书
空气的环保标语
2014/06/12 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
师德承诺书
2015/01/20 职场文书
第一军规观后感
2015/06/12 职场文书
2016中秋节广告语
2016/01/28 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
Java Dubbo框架知识点梳理
2021/06/26 Java/Android