jQuery绑定事件的四种方式介绍


Posted in Javascript onOctober 31, 2016

jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码。下面我们来看下jQuery中绑定事件的方式都有哪些。

jQuery中提供了四种事件监听方式,分别是bind、live、delegate、on,对应的解除监听的函数分别是unbind、die、undelegate、off。在开始看他们之前

一:bind(type,[data],function(eventObject))

bind是使用频率较高的一种,作用就是在选择到的元素上绑定特定事件类型的监听函数,参数的含义如下:

type:事件类型,如click、change、mouseover等;

data:传入监听函数的参数,通过event.data取到。可选;

function:监听函数,可传入event对象,这里的event是jQuery封装的event对象,与原生的event对象有区别,使用时需要注意

bind的源码:

bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
}
$('#myol li').bind('click',getHtml);

bind的特点就是会把监听器绑定到目标元素上,有一个绑一个,在页面上的元素不会动态添加的时候使用它没什么问题。但如果列表中动态增加一个“列表元素5”,点击它是没有反应的,必须再bind一次才行。要想不这么麻烦,我们可以使用live。

jQuery还有一种事件绑定的简写方式如a.click(function(){});、a.change(function(){});等,它们的作用与bind一样,仅仅是简写而已。

二:live(type, [data], fn)

live的参数和bind一样,它又有什么蹊跷呢,我们还是先瞄一眼源码:

live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}

可以看到live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。这个context是什么东西呢?其实就是元素的限定范围,看了下面的代码就清楚了:

$('#myol li').context; //document
$('#myol li','#myol').context; //document
$('#myol li',$('#myol')[0]); //ol

通常情况下,我们都不会像第三种方式那样使用选择器,所以也就认为这个context通常就是document了,即live方法把监听器绑定到了 document上了。不把监听器直接绑定在元素上,你是不是想起事件委托机制来了呢?若没有,可以点击这里回忆一下。live正是利用了事件委托机制来 完成事件的监听处理,把节点的处理委托给了document。在监听函数中,我们可以用event.currentTarget来获取到当前捕捉到事件的 节点。下面的例子来揭晓:

$('#myol li').live('click',getHtml);

三:live存在那样的缺点,所以我们就思考,既然老爷子负担那么重,可不可以别把监听器绑定在document上呢,绑定在就近的父级元素上不就好了。顺应正常逻辑,delegate诞生了。

参数多了一个selector,用来指定触发事件的目标元素,监听器将被绑定在调用此方法的元素上。看看源码:

delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
}

又是调用了on,并且把selector传给了on。看来这个on真的是举足轻重的东西。照样先不管它。看看示例先:

$('#myol').delegate('li','click',getHtml);

看了这么多,你是不是迫不及待想看看这个on的真实面目了呢,这就来:

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

参数与delegate差不多但还是有细微的差别,首先type与selector换位置了,其次selector变为了可选项。交换位置的原因不好查证,应该是为了让视觉上更舒服一些吧。

我们先不传selector来看一个例子:

$('#myol li').on('click',getHtml);

可以看到event.currentTarget是li自己,与bind的效果一样。至于传selector进去,就是跟delegate一样的意义了,除了参数顺序不同,其他完全一样。

终于看到on的真实作用了,那么,这么多的事件绑定方式,我们该如何进行选择呢?

其实这个问题是完全不必纠结的,因为你已经知道他们之间的区别了不是么?根据实际情况斟酌使用就行。不过官方有一个推荐就是尽量使用on,因为其他 方法都是内部调用on来完成的,直接使用on可以提高效率,而且你完全可以用on来代替其他三种写法。至于如何代替我想就不必这么直白的写出来了,真正理 解它们的区别之后自然而然也就不是难事了。

以上所述是小编给大家介绍的jQuery绑定事件的四种方式介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
可简单避免的三个JS发布错误的详细介绍
Aug 02 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
js实现弹窗插件功能实例代码分享
Dec 12 Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 Javascript
jQuery实现tag便签去重效果的方法
Jan 20 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
jQuery动态加载css文件实现方法
Jun 15 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
vue中引入mxGraph的步骤详解
May 17 Javascript
微信小程序实现拍照和相册选取图片
May 09 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 #Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 #Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 #Javascript
js学习笔记之事件处理模型
Oct 31 #Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 #Javascript
新手学习前端之js模仿淘宝主页网站
Oct 31 #Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 #Javascript
You might like
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
php中的时间显示
2007/01/18 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
pandas.cut具体使用总结
2019/06/24 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Python之修改图片像素值的方法
2019/07/03 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
简单了解如何封装自己的Python包
2020/07/08 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
python 实现批量图片识别并翻译
2020/11/02 Python
应届生.NET方向面试题
2015/05/23 面试题
历史专业个人求职信分享
2013/12/20 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL