关于jQuery新的事件绑定机制on()的使用技巧


Posted in Javascript onApril 26, 2013

今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定。因为在此之前有bind(), live(), delegate()等方法来处理事件绑定,jQuery从性能优化以及方式统一方面考虑决定推出新的函数来统一事件绑定方法并且替换掉以前的方法。

on(events,[selector],[data],fn)

events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" 。

selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择器为null或省略,当它到达选定的元素,事件总是触发。

data:当一个事件被触发时要传递event.data给事件处理函数。

fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。

替换bind()

当第二个参数'selector'为null时,on()和bind()其实在用法上基本上没有任何区别了,所以我们可以认为on()只是比bind()多了一个可选的'selector'参数,所以on()可以非常方便的换掉bind()

替换live()

在1.4之前相信大家非常喜欢使用live(),因为它可以把事件绑定到当前以及以后添加的元素上面,当然在1.4之后delegate()也可以做类似的事情了。live()的原理很简单,它是通过document进行事件委派的,因此我们也可以使用on()通过将事件绑定到document来达到live()一样的效果。

live()写法

 $('#list li').live('click', '#list li', function() {
    //function code here.
});

on()写法
$(document).on('click', '#list li', function() {
    //function code here.
});

这里的关键就是第二个参数'selector'在起作用了。它是一个过滤器的作用,只有被选中元素的后代元素才会触发事件。

替换delegate()
delegate()是1.4引入的,目的是通过祖先元素来代理委派后代元素的事件绑定问题,某种程度上和live()优点相似。只不过live()是通过document元素委派,而delegate则可以是任意的祖先节点。使用on()实现代理的写法和delegate()基本一致。

delegate()的写法

$('#list').delegate('li', 'click', function() {
    //function code here.
});

on()写法
$('#list').on('click', 'li', function() {
    //function code here.
});

貌似第一个和第二个参数的顺序颠倒了一下,别的基本一样。

总结
jQuery推出on()的目的有2个,一是为了统一接口,二是为了提高性能,所以从现在开始用on()替换bind(), live(), delegate吧。尤其是不要再用live()了,因为它已经处于不推荐使用列表了,随时会被干掉。如果只绑定一次事件,那接着用one()吧,这个没有变化。

Javascript 相关文章推荐
js操作CheckBoxList实现全选/反选(在客服端完成)
Feb 02 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
你所未知的3种Node.js代码优化方式
Feb 25 Javascript
VUEJS实战之修复错误并且美化时间(2)
Jun 13 Javascript
AngularJS 表达式详解及实例代码
Sep 14 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
Jun 27 Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 #Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 #Javascript
JQuery为textarea添加maxlength属性并且兼容IE
Apr 25 #Javascript
同时使用n个window onload加载实例介绍
Apr 25 #Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 #Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
Apr 25 #Javascript
JQUERY对单选框(radio)操作的小例子
Apr 25 #Javascript
You might like
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
PHP 多进程 解决难题
2009/06/22 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
javascript闭包入门示例
2014/04/30 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
Python每天必学之bytes字节
2016/01/28 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
如何用SQL语句进行模糊查找
2015/09/25 面试题
安全标准化实施方案
2014/02/20 职场文书
学校师德承诺书
2014/05/23 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
工资收入证明
2014/10/07 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android