JQuery中DOM事件冒泡实例分析


Posted in Javascript onJune 13, 2015

本文实例分析了JQuery中DOM事件冒泡。分享给大家供大家参考。具体分析如下:

什么是冒泡

在页面上可以有多个事件,也可以多个元素响应同一个事件。假设网页上有两个元素,其中一个元素嵌套在另一个元素里,并且都被绑定了click事件,同时body元素上也绑定了click事件。

<div id="content">
  外层div元素
  <span>内层span元素</span>
  外层div元素
</div>
<script type="text/javascript">
$(function(){
  // 为span元素绑定click事件
  $('span').bind("click",function(){
    var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
    $('#msg').html(txt);
  });
  // 为div元素绑定click事件
  $('#content').bind("click",function(){
   var txt = $('#msg').html() + "<p>外层div元素被点击.<p/>";
    $('#msg').html(txt);
  });
  // 为body元素绑定click事件
  $("body").bind("click",function(){
    var txt = $('#msg').html() + "<p>body元素被点击.<p/>";
    $('#msg').html(txt);
  });
})
</script>

当单击内部span元素,即触发span元素的click事件时,会输出3条记录。只单击内部span元素,就会触发外部div元素和body元素上绑定的click事件。这是由事件冒泡引起的。在单击span元素的同时,也单击了包含span元素的元素div和包含div元素的元素body,并且每一个元素都会按照特定的顺序响应click事件。

元素的click事件会按照以下顺序“冒泡”。

1. <span>
2. <div>
3. <body>

之所以称为冒泡,是因为事件会按照DOM的层次结构像水泡一样不断向上直至顶端。

事件冒泡引发的问题

事件冒泡可能会引起预料之外的效果。上例中,本来只想触发<span>元素的click事件,然而<div>元素和<body>元素的click事件也同时被触发了。因此,有必要对事件的作用范围进行限制。当单击<span>元素时,只触发<span>元素的click事件,而不触发<div>元素和<body>元素的click事件:当单击<div>元素时,只触发<div>元素的click事件,而不触发<body>元素的click事件。

事件对象

由于IE-DOM和标准DOM实现事件对象的方法各不相同,导致在不同浏览器中获取事件对象变得比较困难。针对这个问题,JQuery进行了必要的扩展和封装,从而使得在任何浏览器中都能很轻松地获取事件对象以及事件对象的一些属性。

在程序中使用事件对象非常简单,只需要为函数添加一个参数,jQuery代码如下:

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

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

停止事件冒泡

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

$(function(){
   // 为span元素绑定click事件
  $('span').bind("click",function(event){
    var txt = $('#msg').html() + "内层span元素被点击";
    $('#msg').html(txt);
    event.stopPropagation(); // 阻止事件冒泡
  });
})

当单击<span>元素时,只会触发<span>元素上的click事件,而不会触发<div>元素和<body>元素的click事件。可以用同样的方法解决<div>元素上的冒泡问题。

$('#content').bind("click",function(event){ 
 var txt = $('#msg').html() + "<p>外层div元素被点击.<p/>"; 
 $('#msg').html(txt); 
 event.stopPropagation(); // 阻止事件冒泡 
});

这样,当单击<span>元素或者<div>元素时,就只会输出相应的内容,而不会输出其他的内容。

阻止默认行为

网页中的元素有自己默认的行为,例如,单击超链接后会跳转、单击“提交”按钮后表单会提交,有时需要阻止元素的默认行为。

在JQuery中,提供了preventDefault()方法来阻止元素的默认行为。

举一个例子,在项目中,经常需要验证表单,在单击“提交”按钮时,验证表单内容,例如某元素是否是必填字段,某元素长度是否够6位等,当表单不符合提交条件时,要阻止表单的提交(默认行为)。

<form action="test.html">
用户名:<input type="text" id="username" />
<br/>
<input type="submit" value="提交" id="sub"/>
</form>
$(function(){
 $("#sub").bind("click",function(event){
   var username = $("#username").val(); //获取元素的值
   if(username==""){ //判断值是否为空
      $("#msg").html("<p>文本框的值不能为空.</p>"); //提示信息
      event.preventDefault(); //阻止默认行为 ( 表单提交 )
     }
 })
})

当用户名为空时,单击“提交”按钮,会出现提示,并且表单不能提交。只有在用户名里输入内容后,才能提交表单。可见,preventDefault()方法能阻止表单的提交行为。

如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返同false。这是对在事件对象上同时调用stopPrapagation()方法和preventDefault()方法的一种简写方式。

在表单的例子中,可以把 event.preventDefault(); 改写为: return false;

也可以把事件冒泡例子中的 event.stopPropaqation(); 改写为: return false;

事件捕获

事件捕获和事件冒泡是刚好相反的两个过程,事件捕获是从最顶端往下开始触发。还是冒泡事件的例子,其中元素的click事件会按照以下顺序捕获。

1. <body>
2. <div>
3. <span>

很显然,事件捕获是从最外层元素开始,然后再到最里层元素。因此绑定的click事件,首先会传递给<body>元素,然后传递给<div>元素,最后才传递给<span>元素。

遗憾的是,并非所有主流浏览器都支持事件捕获,并且这个缺陷无法通过JavaScript来修复。JQuery不交持事件捕获,如果读者需要使用事件捕获,请直接使用原生的JavaScript。

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
javascript for循环设法提高性能
Feb 24 Javascript
JS数学函数Exp使用说明
Aug 09 Javascript
一个简单的弹性返回顶部JS代码实现介绍
Jun 09 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
Angularjs 与 bower安装和使用详解
May 11 Javascript
vue v-on监听事件详解
May 17 Javascript
官方推荐react-navigation的具体使用详解
May 08 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
详解JS浏览器事件循环机制
Mar 27 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
微信公众号平台接口开发 获取微信服务器IP地址方法解析
Aug 14 Javascript
JQuery中DOM事件合成用法实例分析
Jun 13 #Javascript
JQuery中DOM事件绑定用法详解
Jun 13 #Javascript
JQuery中DOM加载与事件执行实例分析
Jun 13 #Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 #Javascript
JavaScript中的Math.E属性使用详解
Jun 12 #Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 #Javascript
JavaScript中的parse()方法使用简介
Jun 12 #Javascript
You might like
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
js 走马灯简单实例
2013/11/21 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
Python判断Abundant Number的方法
2015/06/15 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
python破解zip加密文件的方法
2018/05/31 Python
python实现简单飞行棋
2020/02/06 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
Python 创建守护进程的示例
2020/09/29 Python
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
保密承诺书范文
2014/03/27 职场文书
《云房子》教学反思
2014/04/20 职场文书
爱国口号
2014/06/19 职场文书
大专生自荐书范文
2014/06/22 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
webpack的移动端适配方案小结
2021/07/25 Javascript
Pandas搭配lambda组合使用详解
2022/01/22 Python