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 相关文章推荐
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
Aug 13 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
JavaScript对象和字串之间的转换实例探讨
Apr 21 Javascript
javascript多行字符串的简单实现方式
May 04 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
教你用javascript实现随机标签云效果_附代码
Mar 16 Javascript
javascript滚轮控制模拟滚动条
Oct 19 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
CryptoJS中AES实现前后端通用加解密技术
Dec 18 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
加速vue组件渲染之性能优化
Apr 09 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脚本代码
2011/02/19 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
简单谈谈python中的Queue与多进程
2016/08/25 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
软件测试工程师笔试题带答案
2015/03/27 面试题
shell的种类有哪些
2015/04/15 面试题
2014年计算机专业个人自我评价
2014/01/19 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
Nginx配置之禁止指定IP访问
2022/05/02 Servers
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers