js中的preventDefault与stopPropagation详解


Posted in Javascript onJanuary 29, 2014

首先讲解一下js中preventDefault和stopPropagation两个方法的区别:
preventDefault方法的起什么作用呢?我们知道比如<a href="http://www.baidu.com">百度</a>,这是html中最基础的东西,起的作用就是点击百度链接到http://www.baidu.com,这是属于<a>标签的默认行为,而preventDefault方法就是可以阻止它的默认行为的发生而发生其他的事情。看一段代码大家就明白了:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS阻止链接跳转</title>
<script type="text/javascript"> 
function stopDefault( e ) { 
if ( e && e.preventDefault ) 
   e.preventDefault(); 
    else 
   window.event.returnValue = false;     return false; 
} 
</script> 
</head>
<body>
<a href="http://www.baidu.com" id="testLink">百度</a> 
<script type="text/javascript"> 
var test = document.getElementById('testLink'); 
test.onclick = function(e) { 
   alert('我的链接地址是:' + this.href + ', 但是我不会跳转。'); 
   stopDefault(e); 
} 
</script>
</body>
</html>

此时点击百度链接,不会打开http://www.baidu.com,而只是弹出一个alert对话框。

preventDefault方法讲解到这里,stopPropagation方法呢?讲stopPropagation方法之前必需先给大家讲解一下js的事件代理。

事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素。当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。对任何一个事件来说,其目标元素都是原始元素,在我们的这个例子中也就是按钮。目标元素它在我们的事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地判断出这个事件是从哪个元素开始的。

stopPropagation方法就是起到阻止js事件冒泡的作用,看一段代码。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xHTML1/DTD/xHTML1-transitional.dtd">
<HTML XMLns="http://www.w3.org/1999/xHTML" lang="gb2312">
<head>
<title> 阻止JS事件冒泡传递(cancelBubble 、stopPropagation)</title>
<meta name="keywords" content="JS,事件冒泡,cancelBubble,stopPropagation" />
<script>
function doSomething (obj,evt) {
 alert(obj.id);
 var e=(evt)?evt:window.event;
 if (window.event) {
  e.cancelBubble=true;// ie下阻止冒泡
 } else {
  //e.preventDefault();
  e.stopPropagation();// 其它浏览器下阻止冒泡
 }
}
</script>
</head>
<body>
<div id="parent1" onclick="alert(this.id)" style="width:250px;background-color:yellow">
 <p>This is parent1 div.</p>
 <div id="child1" onclick="alert(this.id)" style="width:200px;background-color:orange">
  <p>This is child1.</p>
 </div>
 <p>This is parent1 div.</p>
</div>
<br />
<div id="parent2" onclick="alert(this.id)" style="width:250px;background-color:cyan;">
 <p>This is parent2 div.</p>
 <div id="child2" onclick="doSomething(this,event);" style="width:200px;background-color:lightblue;">
  <p>This is child2. Will bubble.</p>
 </div>
 <p>This is parent2 div.</p>
</div>
</body>
</HTML>

大家运行一下上面的代码就明白了。
Javascript 相关文章推荐
IE 下的只读 innerHTML
Aug 21 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
node.js [superAgent] 请求使用示例
Mar 13 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
Feb 12 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
基于javascript html5实现多文件上传
Mar 03 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
layui实现显示数据表格、搜索和修改功能示例
Jun 03 Javascript
js正则表达式中test,exec,match方法的区别说明
Jan 29 #Javascript
js的正则test,match,exec详细解析
Jan 29 #Javascript
js正则表达exec与match的区别说明
Jan 29 #Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 #Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 #Javascript
jQuery实现当按下回车键时绑定点击事件
Jan 28 #Javascript
用js正确判断用户名cookie是否存在的方法
Jan 28 #Javascript
You might like
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
JS的事件绑定深入认识
2014/06/26 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
python实现机器学习之元线性回归
2018/09/06 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python之mock模块基本使用方法详解
2019/06/27 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
深入了解NumPy 高级索引
2020/07/24 Python
Python 中如何写注释
2020/08/28 Python
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
考试违纪检讨书
2014/02/02 职场文书
运动员口号
2014/06/09 职场文书
小学家长通知书评语
2014/12/31 职场文书
杭白菊导游词
2015/02/10 职场文书
教师反邪教心得体会
2016/01/15 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Nginx进程调度问题详解
2021/09/25 Servers
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫