浅谈jQuery 中的事件冒泡和阻止默认行为


Posted in Javascript onMay 28, 2016

1、事件冒泡

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	 	<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
		<script type="text/javascript">
			$(function() {
				//为 <span> 元素绑定 click 事件
				$("span").click(function() {
					$("#msg").html($("#msg").html() + "<p>内层span元素被单击</p>");
				});
				//为 Id 为 content 的 <div> 元素绑定 click 事件
				$("#content").click(function() {
					$("#msg").html($("#msg").html() + "<p>外层div元素被单击</p>");
				});
				//为 <body> 元素绑定 click 事件
				$("body").click(function() {
					$("#msg").html($("#msg").html() + "<p>body元素被单击</p>");
				});
			});
		</script> 	
		
		<!-- CSS -->
		<style type="text/css">
			#content {
				background: #b17af5;
			}		
		</style>
 	</head>
 
 	<!-- HTML -->
 	<body>
 		<div id="content">
 			外层div元素<br />
 			<span style="background: silver;">内层span元素</span><br />
 			外层div元素
 		</div><br />
 		<div id="msg"></div>
 	</body>
</html>

当点击内部 <span> 元素时,会触发自身及外层 <div> 和 <body> 的点击事件,这就是事件冒泡引起的。事件会随着 DOM 的层次结构依次向上传播。

事件冒泡可能会引起意料之外的效果,有时候需要阻止事件的冒泡行为,使用 stopPropagation() 方法来实现。

修改 <span> 元素的 click 事件函数:

//为 <span> 元素绑定 click 事件
$("span").click(function(event) {	//为方法添加一个事件对象参数
	$("#msg").html($("#msg").html() + "<p>内层span元素被单击</p>");
	event.stopPropagation();	//阻止 <span> 的 click 事件冒泡
});

此时点击内部 <span> 元素时,只会触发自身的 click 事件,不会再向上冒泡。

2、阻止默认行为

有时候用户的操作未满足某些条件时,需要阻止某些元素的默认行为,如链接的跳转和表单的提交等,jQuery 提供了 preventDefault() 方法来实现。

当用户未填写用户名时,阻止表单提交:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	 	<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
		<script type="text/javascript">
			$(function() {
				$(":submit").click(function(event) {	 //为方法添加一个事件对象参数
					//当未输入用户名时,提示并阻止提交
					if ($(":text").val() == "") {	
						$("#msg").text("用户名不能为空");
						event.preventDefault();		//阻止提交按钮的默认行为(提交表单)
					}
				});
			});
		</script> 	
 	</head>
 
 	<!-- HTML -->
 	<body>
 		<form action="register.action">
 			用户名<input type="text" name="id" />
 			<input type="submit" value="注册" />
 			<div id="msg"></div>
 		</form>
 	</body>
</html>

如果想同时阻止事件冒泡和阻止元素默认行为,可以在事件函数中返回 false 来代替调用 stopPropagation() 和 preventDefault() 方法。

如:

$(":submit").click(function(event) {	 //为方法添加一个事件对象参数
	//当未输入用户名时,提示并阻止提交
	if ($(":text").val() == "") {	
		$("#msg").text("用户名不能为空");
		return false;		//阻止提交按钮的默认行为(提交表单)和事件冒泡
	}
});$("span").click(function(event) {	//为方法添加一个事件对象参数
	$("#msg").html($("#msg").html() + "<p>内层span元素被单击</p>");
	return false;	//阻止 <span> 的 click 事件冒泡和默认行为(此元素没有默认行为)
});

以上这篇浅谈jQuery 中的事件冒泡和阻止默认行为就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
JavaScript 事件查询综合
Jul 13 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
动态加载JS文件的三种方法
Nov 08 Javascript
在JavaScript中重写jQuery对象的方法实例教程
Aug 25 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
详解javascript实现瀑布流列式布局
Jan 29 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
js实现按钮开关单机下拉菜单效果
Nov 22 Javascript
JS实现判断数组是否包含某个元素示例
May 24 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 Javascript
vue+iview实现分页及查询功能
Nov 17 Vue.js
jquery取消事件冒泡的三种方法(推荐)
May 28 #Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
May 28 #Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 #Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 #Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 #Javascript
jQuery操作动态生成的内容的方法
May 28 #Javascript
javascript 用函数实现继承详解
May 28 #Javascript
You might like
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python函数的周期性执行实现方法
2016/08/13 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
Numpy之reshape()使用详解
2019/12/26 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
python实现KNN近邻算法
2020/12/30 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
中学家长会邀请函
2014/02/03 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
协议书范本
2014/04/23 职场文书
服务标兵事迹材料
2014/05/04 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
2015年中秋寄语
2015/07/31 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技