热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jQuery之on

在jQuery1.9版本中,已经去掉了live和delegate方法,从而将on方法的地位进一步提升。jQuery如此推崇on方法,必有其牛逼的地方。那么我们就有必要了解这个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>ontitle>
        <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>item1li>
            <li>item2li>
        ul>
        
        <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>ontitle>
        <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>item1li>
        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>ontitle>
        <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>item1li>
        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


推荐阅读
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
author-avatar
稀释的梦_251
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有