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 相关文章推荐
音乐播放用的的几个函数
Sep 07 Javascript
jquery UI 1.72 之datepicker
Dec 29 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
Dec 28 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
深入理解node.js http模块
Jan 24 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 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中看实例学正则表达式
2006/12/25 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python遍历目录的方法小结
2016/04/28 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Python中一些深不见底的“坑”
2019/06/12 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
如何写你的创业计划书
2014/01/07 职场文书
2014年元旦感言
2014/03/06 职场文书
医德医风演讲稿
2014/05/20 职场文书
幼儿学前班评语
2014/12/29 职场文书
食品安全责任书范本
2015/05/09 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书