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 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
js工具方法弹出蒙版
May 08 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
js实现按钮控制带有停顿效果的图片滚动
Aug 30 Javascript
使用jQuery,Angular实现登录界面验证码详解
Apr 27 jQuery
node.js操作mysql简单实例
May 25 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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实现更新中间关联表数据的两种方法
2014/09/01 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
PHP面试题大全
2015/10/16 面试题
户外婚礼策划方案
2014/02/08 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
学生党员检讨书范文
2014/12/27 职场文书
教师党员个人总结
2015/02/10 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL
微信小程序实现轮播图指示器
2022/06/25 Javascript