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 常用功能总结
Mar 18 Javascript
JQuery的AJAX实现文件下载的小例子
May 15 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
AngularJS 依赖注入详解和简单实例
Jul 28 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
详解Angular2响应式表单
Jun 14 Javascript
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
Aug 04 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
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
php SQL防注入代码集合
2008/04/25 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python 调用win32pai 操作cmd的方法
2017/05/28 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
python issubclass 和 isinstance函数
2019/07/25 Python
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
环境建设实施方案
2014/03/14 职场文书
中标通知书
2015/04/17 职场文书
个人合作协议范本
2015/08/06 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL