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 相关文章推荐
javascript 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
Nov 26 Javascript
jQuery-serialize()输出序列化form表单值的方法
Dec 26 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
AngularJS手动表单验证
Feb 01 Javascript
使用原生js封装的ajax实例(兼容jsonp)
Oct 12 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
微信小程序实现图片上传
May 23 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
浅谈php和.net的区别
2014/09/28 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
python文字转语音的实例代码分析
2019/11/12 Python
广州地球村科技数据库题目
2016/04/25 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
班组建设经验交流材料
2014/05/12 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
护士求职简历自我评价
2015/03/10 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python