jQuery之on
在jQuery1.9版本中,已经去掉了live和delegate方法,从而将on方法的地位进一步提升。
jQuery如此推崇on方法,必有其牛逼的地方。那么我们就有必要了解这个on,并在代码中利用它,从而优化代码和提高性能。
| 一、on之基本使用方法 |
注:在jQuery1.7后,on方法就可以全面绑定任何事件了。
.on( events [,selector] [,data] ,handler)
event:为事件类型,可以有多个事件类型。
selector:可选,过滤绑定在on方法上的后代元素。注:如果有selector,on方法是采用事件代理,这样可以提升代码性能。
data:可选,当事件被触发时,它会传给event.data,从而可以加以利用
handler:当事件被触发时,执行的方法。
下面写个demo,看看on的使用:
//当p元素的click事件,被触发时,弹出p元素的文本信息
$('p').on('click',function(){
alert( $(this).text() );
});
//在上面的基础上,传值给p元素
$('p').on('click',{foo:"bar"},function(event){
alert( event.data.foo );
});
| 二、on之事件代理 |
标准浏览器中都有事件冒泡(bubble)或捕获(propagate)机制(除IE)。
如下图:

--当目标元素被触发时,它的流程是,先从它祖先元素一层一层,跋山涉水将事件传达给目标函数,如上图中P的父元素 à target的父元素P à target,此为事件捕获;
--当目标函数被触发后,又将事件一层一层传递到根节点,即老祖宗,此为事件冒泡。
所有浏览器都有事件冒泡机制。所以,我们可以利用这一特性,优化代码,减少事件绑定。
on方法也利用了这一特性。当‘selector’被提供时,就是事件委托,事件触发时,直接绑定在on方法上的元素是不会触发该事件,而它指定的后代元素‘selector’就会利用冒泡机制,到直接绑定在on方法上的元素,给予处理。
举个例子,我们在写导航栏时,经常用到ul+li这种方式,当点击每一个li时,页面相应切换,没有经验的做法嘛,就是将每个li绑定一个click嘛。
那么,问题来了。没过几天,突然我发现有几个li的模块其实可以整合到一起的,怎么办呢?删除原来为li添加的事件,再重新写过?
没过几天,假设有新需求来,我要加两个模块呢?
假如你用的是jQuery框架,完全可以在最开始用on方法嘛,利用事件委托其特性,一键搞定。
如下:
function doSomething(){
console.log(this);
}
$('ul').on('click','li',doSomething/*在这里,doSomething方法中this指向的是li*/);
注:on方法中当selector有值时,虽然采用的冒泡机制,但this指向的是目标元素对象。
如:
function doSomething(event,name){
//结果为true
console.log( event.target === this );
}
$('ul').on('click','li',doSomething);
| 三、on之false |
在on方法中,如果你想阻止事件冒泡又想阻止默认事件行为,你可以采用快捷方式,直接false。
如表单提交:
$('form').on('submit',false);
| 四、on之data |
.on( events [,selector] [,data] ,handler)
当data有值且不为null或者undefined,事件被触发时,它会被传给event.data。
但,请注意,当你传入data的值后,它是恒定不变的。什么意思?
看看下面的demo:
<!DOCTYPE html>
<head>
<title>on</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
ul{
overflow:hidden;
}
ul li{
float:left;
margin-left:10px;
list-style-type:none;
}
</style>
</head>
<body>
<ul>
<li>item1</li>
<li>item2</li>
</ul>
<!--需要自行引入jquery-->
<script src="jquery-1.12.0.js"></script>
<script>
var name = 'monkey';
/*5秒后将name的值变成'dorie'*/
setTimeout(function(){
name = 'dorie';
console.log('after setTimeout: ' + name);
},5000);
//打印event.data.msg
function doSomething(event){
console.log(event.data.msg);
};
//msg:name,即msg:'monkey'
$('ul').on('click','li',{msg:name},doSomething);
</script>
</body>
</html>
运行代码后的结果:

我们不但可以这样在绑定元素事件的时候赋予data值,我们还可以用.trigger()或者.triggerHandler()来传递值哦,只需要在触发方法(如下的doSomething)中再加入一个参数哈。
如下:
/*第一个参数当然是用来接收event的哈*/
function doSomething(event,name){
console.log(name);
}
$('ul').on('click','li',doSomething);
/*here trigger*/
$('li').trigger('click','monkey');
那如果我想利用trigger传入两个或者多个值呢?是不是再加入几个参数呢?
不太对,我们先看看下面的代码:
<!DOCTYPE html>
<head>
<title>on</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
ul{
overflow:hidden;
}
ul li{
float:left;
margin-left:10px;
list-style-type:none;
}
</style>
</head>
<body>
<ul>
<li>item1</li>
</ul>
<script src="jquery-1.12.0.js"></script>
<script>
/*传入两个参数name、age*/
function doSomething(event,name,age){
console.log(name);
console.log(age);
}
$('ul').on('click','li',doSomething);
$('li').trigger('click','monkey',100);
</script>
</body>
</html>
运行代码结果如下:

so,那怎么办呢?
有两个方法,可以达到你的目的。
方法一,参数不变,trigger传入值时,传入一个数组,数组中的值与参数一一对应就好了。
function doSomething(event,name,age){
console.log(name);
console.log(age);
}
$('ul').on('click','li',doSomething);
//trigger传入对应数组
$('li').trigger('click',['monkey',100]);
方法二,参数和trigger传入方式皆改变。都传入对象嘛,不就只需要一个参数了么。
function doSomething(event,obj){
console.log(obj.name);
console.log(obj.age);
}
$('ul').on('click','li',doSomething);
$('li').trigger('click',{name:'monkey',age:100});
| 五、其他 |
‘hover’在jQuery1.9中被移除了(注意是’hover’,而不是.hover()),所以on方法是无法调用hover的,
如下:

那如果我想利用on方法来实现hover的‘事件代理’呢?
怎么办呢?‘hover’都不存在了!!!
其实它一直都不在,只是’mouseenter’和’mouseleave’的快照(shorthand)而已。
所以,我们可以利用event.type来处理。
如下:
$('ul').on('mouseenter mouseleave','li',function(event){
if( event.type == 'mouseenter' ){
//相应处理
}
else if(event.type == 'mouseleave'){
//相应处理
}
});
另外,当我利用on为同一个事件,绑定了多个执行方法时,它会依次执行,如下:
<!DOCTYPE html>
<head>
<title>on</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
ul{
overflow:hidden;
}
ul li{
float:left;
margin-left:10px;
list-style-type:none;
}
</style>
</head>
<body>
<ul>
<li>item1</li>
</ul>
<script src="jquery-1.12.0.js"></script>
<script>
$('li').on('click',function(){
console.log('1');
});
$('li').on('click',function(event){
console.log('2');
});
$('li').on('click',function(){
console.log('3');
});
</script>
</body>
</html>
运行后的结果:

倘若,我只想执行1、2,但是不想执行第三个click,输出‘3’呢?
我们可以利用event.stopImmediatePropagation()
作用:阻止剩余的事件处理函数的执行,并阻止当前事件冒泡。
$('li').on('click',function(){
console.log('1');
});
$('li').on('click',function(event){
console.log('2');
event.stopImmediatePropagation();
});
$('li').on('click',function(){
console.log('3');
});
在上面大家也看见了,用on为同一个元素添加同一个事件时,事件是不会被覆盖掉的,所以,为了避免代码干扰,我们可以这样绑定事件:
$('li').off('click').on('click',doSomething);
我们利用.off()还可以取消掉指定函数名的事件哦,而不是同一事件一切清空,前提是我们使用的是函数名。
如下:

像上面那样,我们就可以清除方法名为one的click事件。
由于$(obj).click(dosomething)是$(obj).on(‘click’,dosomething)的快照(shorthand),所以.()off同样适用于它.click()。
好了,时间也不早了。晚安,everyone~
jQuery之on的更多相关文章
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- jQuery之ajax实现篇
jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...
- 利用snowfall.jquery.js实现爱心满屏飞
小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...
- jQuery的61种选择器
The Write Less , Do More ! jQuery选择器 1. #id : 根据给定的ID匹配一个元素 <p id="myId">这是第一个p标签< ...
- jquery.uploadify文件上传组件
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 浅谈 jQuery 核心架构设计
jQuery对于大家而言并不陌生,因此关于它是什么以及它的作用,在这里我就不多言了,而本篇文章的目的是想通过对源码简单的分析来讨论 jQuery 的核心架构设计,以及jQuery 是如何利用javas ...
随机推荐
- Ajax完整篇(转载)
Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...
- IDEA+Tomcat+JRebel热部署
在完成idea工程简单应用后,接下来实现热部署. 简单应用地址:http://wibiline.iteye.com/admin/blogs/2072454 一.安装JRebel插件 1. 在线安装 F ...
- Linux Shell中单引号、双引号、反引号的区别【转载】
linux shell可以识别4种不同类型的引字符号: 单引号字符' 双引号字符" 反斜杠字符\ 反引号字符` 1. 单引号 ( '' )# grep Susan phonebook Sus ...
- redis 的理解
1.Redis使用 C语言开发的.Redis 约定此版本号,为偶数的版本是稳定版(如:2.4版 2.6版),奇数版是非稳定版(如:2.5版 2.7版) 2.Redis 数据库中的所有的数据都存储在内存 ...
- keepalived 原主上线时vip漂移情况
1. 设置为MASTER,BACKUP 优先级相同 的情况: master端的keepalived起来就会获取到vip变成主. 2. 设置为BACKUP,BACKUP 一个优先级高一个优先级低 的情况 ...
- pip安装MySQL-python报错
pip install MySQL-pythonerror: command 'gcc' failed with exit status 1 yum install -y python-develpi ...
- C语言dll文件的说明以及生成、使用方法
最近在搞一些小项目,由于要涉及到跟其它语言进行交互,动态链接库变成了不二的选择.为此也查阅了很多资料,将动态链接库的相关知识在此做一个整理. 一.动态链接库概述 动态链接库(Dynamic Link ...
- Vuforia结合Skyshop: Image-Based Lighting Tools & Shaders插件实现真实的光照效果
Skyshop: Image-Based Lighting Tools & Shaders 插件地址:https://www.assetstore.unity3d.com/en/#!/cont ...
- 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray
除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...
- TcpClient 有好多坑
下面2篇文章里头的问题都碰到了,真是好坑哈, 在此留念. 使用 TcpClient 與 NetworkStream 類別開發時的注意事項 [C#] NetworkStream.Write()存在严重b ...