jQuery 事件用法详解
jQuery 事件用法详解
目录
简介
实现原理
事件操作
事件操作进阶
简介
jquery
之所以成为最受欢迎的前端库,很大一部分是得益于它的事件具有良好的语义,优秀的兼容性,并且便于管理和扩展。
在这里我会介绍 jquery
事件的一些比较基础的用法。
实现原理
jquery
事件脱胎于浏览器的 addEventListener (W3)
和 attachEvent (IE)
方法 , 提供了跨浏览器的一致性API。具体的实现原理可以参考Aaron的系列文章
jquery源码分析-事件。
事件操作
绑定事件
jquery
中实现事件绑定有多种方式,其中 $(selector).event(func)
方式中 event
支持一系列的浏览器事件,文档加载事件,表单事件,键盘事件和鼠标事件,但并非全部。
// 常用的写法
$('body').click(function(){ })
$('body').on('click',function(){ })
$('body').one('click',function(){ }) // 只会执行一次,然后销毁事件
// 其他写法(不推荐)
$('body').bind('click',function(){ })
$('body').delegate('p','click',function(){ })
on.('click')
和 .click()
的区别
on
属于 绑定事件处理器
(event-handler-attachment
) , 而 .click()
属于 jquery
包装好的鼠标事件。
on
可以绑定dom和bom的既有事件,也可以绑定自定义的事件。所以推荐始终只使用$(selector).on(event,func)
的方式,弹性的绑定更多的事件:
$(document).hashchange(function(){ }) => 报错,jquery没有提供此事件处理器
$(document).on('hashchange',function(){ }) => 绑定事件成功
也可以同时绑定多个事件处理同一事务:
$('input').on('focus input',function(){ }) => 在文本框聚焦和输入的时候,都做同样的事情
解除事件
在不需要再继续监听事件执行的时候,就需要解除事件了,根据绑定事件方式的不同,解除事件也有好几种方式,推荐始终使用 $(selector).off(event)
的方式解除事件绑定,因为 on/off
正好构成了一个开关。
$('body').off('click')
=> 可以解除 $.click(func),$.on('click',func)
和 $.bind('click',func) 绑定的事件,
不能解除delegate方式绑定的事件
$('body').unbind('click') => 同上
$('body').undelegate('p','click') => 只能解除 delegate方式绑定的事件
触发事件
在 jquery
中,有许多方法根据其参数个数的不同,既可以是赋值,也可以做为取值操作。
事件也不例外,许多时候可以利用这个特性,代替手动去触发一些事件,以下示例中的两种方式,都可以实现自动触发事件。
// (当表单字段未通过验证时) 自动选中文本值
$('input').select()
$('input').trigger('select')
// 触发已有的点击事件
$(selector).click()
$(selector).trigger('click')
// 通过触发事件,通知select2插件重新渲染
$('select').change()
$('select').trigger('change')
事件委托
事件委托通过事件从目标元素冒泡到根元素的原理实现,它有2个好处,一是大幅降低事件绑定的内存占用,二是可以对后来加入的元素生效。
// 写法
$(selector).on(event, selector2, func)
// 不推荐的方法
$(selector).delagate(selector2, event, func)
事件委托原理及性能分析详见 解密jQuery事件核心 - 委托设计(二)
事件操作进阶
上面列举了一些简单的事件绑定,解绑和委托的使用,下面会说到一些更加个性化的用法。
阻止默认事件
event.preventDefault()
这个方法用于阻止浏览器的默认行为,通常用于表单提交或是页面滚动。
$('form').on('submit',function(event){
// 阻止了默认的表单提交事件,下面可以做一些爱做的事情了
event.preventDefault();
})
$(document).on('touchmove',function(event){
// 阻止了浏览器的默认滚动,也可以做些爱做的事情了
event.preventDefault();
})
阻止事件传播
阻止事件传播即阻止事件继续向上冒泡。
// 点击div时,会依次alert 2 ,1
$('body').on('click',function(){alert(1)})
$('div').on('click',function(){alert(2)})
// 下面的代码只会alert一个 2,因为事件停止冒泡了,不会被body监听到
$('body').on('click',function(){alert(1)})
$('div').on('click',function(event){
event.stopPropagation();
alert(2)
})
阻止事件向后执行
除了阻止默认的事件,停止向上冒泡之外,有时还需要禁止后续的事件执行,可以使用 event.stopImmediatePropagation()
方法。该方法会自动调用 event.stopPropagation()
方法。
// 不使用 event.stopImmediatePropagation() 将会alert 2,3,4,1
// 加上之后只会alert 2
$('body').on('click',function(){alert(1)})
$('div').on('click',function(event){
event.stopImmediatePropagation();
alert(2)
})
$('div').on('click',function(){
alert(3)
})
$('div').on('click',function(){
alert(4)
})
命名空间
想要更精准的控制事件,很多时候还需要利用 jquery
的命名空间机制。
$('div').on('click.click1',function(){console.log(1)})
$('input').on('click.click1',function(){console.log(11)})
$('div').on('click.click2',function(){console.log(2)})
$('input').on('click.click2',function(){console.log(21)})
// 只触发click2事件
$('div,input').trigger('.click2')
// 解除click1事件,click2任然会执行
$('div,input').off('.click1')
自定义事件
把多个事件组合起来,或者在特定条件下触发事件,普通的事件绑定是无法满足需要的,可以通过自定义事件来形成 pub-sub
组合。
比如监听 短信验证码发送倒计时:
// 伪代码
setInterVal(function(){
time--;
if(time < 1){
$('.js-timeless-button').trigger('time-end', params0, params1);
}
},1000)
// 自定义事件回调函数默认第一个参数为event对象,以后的参数依次是传入的参数
$('.js-timeless-button').on('time-end',function(event, params0, params1){
});
或者是 页面滚动到了底部
// 伪代码
$(window).on('scroll',function(){
if((($(window).scrollTop() + $(window).height())) >= $(document).height()){
$(document).trigger('infinite', params0, params1);
}
})
$(document).on('infinite',function(event, params0, params1){
});
解除自定义事件和解除其他事件的方式相同。可以通过 off
或者 unbind
进行。
事件队列
在 jquery
中,事件是按照其绑定顺序依次执行的。如果想要调整执行顺序,或是禁止之前绑定的方法发生,可以通过重写事件队列的方式。
查看某个dom上已绑定事件的方法是
$._data(elem,'events')
(jquery
版本>1.7)。
elem
是 dom对象
而非 jquery对象
。
function alertBottle(){
$("body").on('click',function() { alert("1") });
$("body").on('click',function() { alert("2") });
$("body").on('click',function() { alert("3") });
}
// 点击body会依次alert 1, 2, 3
alertBottle();
// 倒序执行
alertBottle();
var Events = $._data($("body").get(0),'events');
Events.click.sort(function(a,b){return b.guid-a.guid })
// 禁止执行之前的一切, 只执行我
alertBottle();
var Events = $._data($("body").get(0),'events');
Events.click = null;
$("body").on('click',function() { alert("4") });
// 最先执行我 alert 4, 1, 2, 3
alertBottle();
$("body").on('click',function() { alert("4") });
var Events = $._data($("body").get(0),'events');
var last = Events.click.pop();
Events.click.unshift(last);
兼容jquery低版本的写法是:
$.fn.getEvents = function() {
if (typeof(jQuery._data) == 'function') {
return jQuery._data(this.get(0), 'events') || {};
} else if (typeof(this.data) == 'function') { // jQuery version < 1.7.?
return this.data('events') || {};
}
return {};
};
// 使用
$("body").getEvents();
jQuery 事件用法详解的更多相关文章
- Jquery学习总结(2)——jQuery Ajax用法详解
[详解]jquery ajax在web应用开发中常用,主要包括有ajax,get,post,load,getscript等这几种常用无刷新操作方法,下面来给大家介绍一下.我们首先先从最简单的方法看起. ...
- jquery事件委托详解
jQuery事件委托处理流程 上一章分析jQuery.event.add的时候已经分析了事件绑定,再把绑定的部分源码抽出来 if ( !(eventHandle = elemData.handle) ...
- jQuery学习之jQuery Ajax用法详解
jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...
- jQuery学习之jQuery Ajax用法详解(转)
[导读] jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍.我们先从最简单的 ...
- jQuery学习之jQuery Ajax用法详解(转)
jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...
- (高级篇)jQuery学习之jQuery Ajax用法详解
jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...
- javascript中window.event事件用法详解
转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生 ...
- mysql的event(事件)用法详解
SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...
- jquery之hide()用法详解
注: 以下函数用法和hide()类似 [参数类型完全一样] toggle() hide() show() slideToggle() slideUp() slideDown() fadeToggl ...
随机推荐
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- 浪潮之巅IT那点事之三——神奇的规律
“道可道,非常道”是老子在<道德经>中的开篇第一句话,这句话的意思是:万事万物其真理是可以探索并道说得出来的,但这些真理并非是永恒的,天道轮转,没有永恒不变的真理(来自百度百科).在IT行 ...
- sqlite3的使用(iOS嵌入式关系数据库)
1>添加sqlite3动态库:libsqlite3.dylib,CoreGraphics.framework,UIKit.framework,Foundation.framework 2> ...
- Mongodb使用基本之——安装
版本是:Mongodb 3.2.1 本来是想用python做个爬虫然后爬取一些数据放到数据库上的,想着想着以为NoSQL会很流行,就用了Mongodb,结果,一折腾真是不容易. 遇到的第一个问题:官网 ...
- JS截取字符串常用方法
reference:http://www.jb51.net/article/42482.htm 使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字 ...
- AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器
AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...
- 自定义的 ListBoxItem 自适应ListBox的宽度
主要是要设置HorizontalContentAlignment的值,而不是HorizontalAlignment <ListBox x:Name="xxx"> < ...
- GDI+中发生一般性错误的解决办法(转帖)
今天在开发.net引用程序中,需要System.Drawing.Image.Save 创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现“GDI+中发生一般性错误”的异常.于是开始“ ...
- 每天一个linux命令(20):linux chmod命令
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- 读代码之private construtor
private 构造函数 private修饰构造函数在Singleton设计模式中经常使用.但是今天在读到EntityUtils时,发现这是一个final类.final很好理解:EntityUtils ...