上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件、事件冒泡和事件移除等内容。

  一、合成事件

  jQuery有两个合成事件——hover()方法和toggle()方法,同ready()方法一样,这些都是jQuery自定义的方法。

  hover()方法:hover()方法的语法结构为:

hover(enter, leave);

hover()方法用于模拟鼠标悬停事件。当鼠标移动到元素上时,会触发指定的第一个函数(enter);当鼠标移出这个元素时,会触发指定的第二个函数(leave)。

  上篇中有一个例子是这样写的:

 $(function(){
$("#container h4.head").bind("mouseover", function(){
$(this).next().show(); //获取并显示“内容”元素
}).bind("mouseout", function(){
$(this).next().hide();
});
})

可以将这个例子改写成以下的jQuery代码:

 $(function(){
$("#container h4.head").hover(function(){
$(this).next().show(); //获取并显示“内容”元素
}, function(){
$(this).next().hide();
});
})

上述两种写法的代码的运行效果是一致的。

  *这里要注意的一点是,jQuery的hover()方法准确来说是替代jQUery中的bind("mouseenter")bind("mouseleave"),而不是替代bind("mouseover")和bind("mouseout"),那么这两对绑定函数,其实是两对事件是什么区别呢?解析如下:

  mouseover与mouseenter

  不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件。
  只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件。

  mouseout与mouseleave
  不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。
  只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。

  简单的说,mouseover和mouseout会引起触发的区域更大,mouseenter和mouseleave只能针对绑定的元素来触发

  toggle()方法:toggle()方法的语法结构为:

toggle(fn1, fn2, fn3, ...);

  toggle()方法用于模拟鼠标连续单击事件。每次单击元素,依次触发指定的相应的函数,直到最后一个。随后的每次单击都重复对这几个函数的轮番调用。

  上篇有过下面的一个例子,在其中如果要连续单击“标题”链接,实现“内容”隐藏和显示的效果,那么按照之前的做法就需要在绑定“click”事件的时候判断当前的“内容”部分是隐藏还是显示,然后进行相反的操作,显然就麻烦的多。

 $(function(){
$("#container h4.head").bind("click", function(){
var $content = $(this).next();
    if($content.is(":visible"))
      $content.hide();
    else
      $content.show();
}
})

但是这种方式显然麻烦的多,不是最合适的。再看这个需求,刚好就很适合使用toggle()方法。使用toggle()方法改写上面的例子如下:

 $(function(){
$("#container h4.head").toggle(function(){
3 $(this).next().show();
4 }, function(){
5 $(this).next().hide()
6 })
})

2、事件冒泡:

在页面上可以有多个事件,也可以多个元素相应同一个事件,就像上面介绍的那两对事件一样。再比如,假设网页上有两个元素,一个元素A嵌套在另一个元素B中,并且都被绑定了click事件,同时body元素上也绑定了click事件。那么在单击子元素A的时候,会依次触发三个click事件;单击元素B的时候,会依次触发两个click事件。

  就上面的简单描述,已经可以看出问题所在了,那就是会出现意想不到的click事件,所以需要对事件作用范围进行限制。

  jQuery有三种办法可以解决事件冒泡导致的问题。

  1、事件对象:也就是之前介绍过的使用bind()方法,例如:

$("element").bind("click", function(event){  //event:事件对象
//code...
})

上面代码中,当单击element元素时,事件对象就被创建了。这个事件对象只有事件处理函数才能访问到。事件处理函数执行完毕后,事件对象就被销毁。

  2、停止事件冒泡:停止事件冒泡可以阻止事件中其他对象的事件处理函数被执行。在jQuery中提供了stopPropagation()方法来停止事件冒泡。

$("element").bind("click", function(event){  //event:事件对象
//code...
 //code...
event.stopPropagation(); //停止事件冒泡
})

阻止默认行为:与上面的stopPropagation()方法相似,jQuery也提供了preventDefault()方法来阻止元素的默认行为

  三、移除事件:

在绑定事件的过程中,不仅可以为同一个元素绑定多个事件,也可以为多个元素绑定同一个事件。

  所以,移除事件就涉及两种情况下的移出,一种是移除之前注册的所有事件,二是移除其中的一个事件。以一个按钮为例:假设网页中有一个id为btn的按钮,其上绑定了几个click事件。那么:

  首先添加一个移除事件的按钮:

<button id="delAll">移除所有事件</button>

然后可以为该按钮绑定若干的click事件,使用链式操作就可以很简单的为其绑定几个click事件。

  最后就是编写用于移除所有click事件的处理函数了。jQuery代码如下:

$("#delAll").click(function(){
$('#btn').unbind("click");
})

因为元素绑定的都是click事件,所以上面不写“click”参数也可以达到相同的效果。

  因此可以看出unbind()方法的语法结构:

unbind([type], [data]);

 其中,第一个参数是事件类型,第二个参数是将要移除的函数。显然移除元素上的所有事件是使用没有第二个参数的unbind()方法。

  如果没有第一个参数,则移除所有绑定的事件;否则只删除该类型的事件。

  如果传入了第二个参数,则只有这个特定的事件处理函数会被删除。这正是移除元素的某一个事件的方法。

外面的世界那么浮躁,我只想要一块键盘,安静下来,奏出精彩的代码篇章。

第79天:jQuery事件总结(二)的更多相关文章

  1. 彻底弄懂jQuery事件原理二

    上一篇说到,我们在最外层API的on,off,tiggler,triggerHandler调用的是event方法的add,remove和tirgger方法,本篇就来介绍event辅助类 \ 先放个图, ...

  2. 解密jQuery事件核心 - 委托设计(二)

    第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...

  3. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  4. HTML Select 标签选择后触发jQuery事件代码实例

    页面设计原由: 因为很多客户不知道如何来到我们公司,领导想让我在微信公众号上面做一个链接,客户可以直接通过微信公众号打开地图并导航到我们公司的办公地点. 实现起来并不难,但由于公司有很多办事处,所以需 ...

  5. 深入学习jQuery事件对象

    × 目录 [1]获取 [2]事件类型 [3]事件目标[4]当前元素[5]事件冒泡[6]默认行为[7]命名空间[8]返回值[9]键值 前面的话 在触发DOM上的某个事件时,会产生一个事件对象event, ...

  6. 深入学习jQuery事件绑定

    × 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...

  7. jQuery源代码学习之九—jQuery事件模块

    jQuery事件系统并没有将事件坚挺函数直接绑定在DOM元素上,而是基于事件缓存模块来管理监听函数的. 二.jQuery事件模块的代码结构 //定义了一些正则 // // //jQuery事件对象 j ...

  8. jQuery 事件用法详解

    jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...

  9. JQuery事件的链式写法

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

随机推荐

  1. 20155323 2016-2017-2 《Java程序设计》第4周学习总结

    20155323 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承的目的:继承是为了多态,能够采用父类引用指向子类对象,这样可以让代码更灵活.继承之后可以 ...

  2. installshield 判断mdmcpq.inf和usbser.sys 是否 存在

    1.产品上位机程序,需要驱动支持,在安装  exe程序的时候,连同NET框架4.0和 .inf驱动文件,一起安装, 安装驱动的时候,会发现, 如果系统 C:\Windows\Inf 缺少mdmcpq. ...

  3. day4 边缘检测Canny

    1.canny边缘检测 # coding=utf-8 import cv2 import numpy as np filename = 'woman.JPEG' #读入图像,以灰度格式 img = c ...

  4. 变态的iis10

    IIS10发布网站不能使用.NET4.0需要重新注册在之前版本的系统中使用如下命令可以直接重新注册: 但是windowsServer2016(iis 10) 使用该命令 提示 版本不支持 C:\WIN ...

  5. 解决老项目中 Timer运行一段时间后失效的问题

    那是因为Timer中的代码出现了异常未被捕获,所以线程被挂起 只需要加入  try catch即可 推荐使用 Quartz 2018-08-08 03:50:44 [ Timer-1:39366015 ...

  6. hdu2065"红色病毒"问题(指数母函数+快速幂取模)

    "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. 180726-InfluxDB基本概念小结

    InfluxDB基本概念小结 InfluxDB作为时序数据库,与传统的关系型数据库相比而言,还是有一些区别的,下面尽量以简单明了的方式介绍下相关的术语概念 I. 基本概念 mysql influxdb ...

  8. appium -- 页面出现弹窗,关闭后,无法识别页面元素(转)

    原文:https://www.cnblogs.com/leavescy/p/9733001.html; 1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发 ...

  9. JY播放器【QQ音乐破解下载】

    今天给大家带来一款神器----JY播放器.可以直接下载QQ音乐的歌曲. 目前已经支持平台(蜻蜓FM.喜马拉雅FM.网易云音乐.QQ音乐) 使用方法: 在网页打开QQ音乐网站找到你要听的歌曲或歌单.复制 ...

  10. HP VC模块Server Profile配置快速参考(With SUS)

    以管理员身份登录VCM 准备进行Server Profiles的配置 在左侧导航栏中找到并点击"Server Profiles",在右侧主窗口的左下角点击"Add&quo ...