javascript中return false;preventDefault();stopPragation()的区别

简介:

主要内容:

  • 区别的介绍
  • 代码演示区别
  • 建议

 

1. 区别的介绍

我们在平时的编码中javascript中经常会用到[return false;]语句来阻止事件的向上传递,其实[return false;]语句包含了2层意思:

  1. 阻止触发事件的元素的默认动作(比如说一个link(<a href="http://www/baidu.com"></a>),它的默认动作就是迁移到baidu首页)
  2. 阻止触发事件的元素向上传递事件

 

由于[return false;]包含了2个意思,所以在使用时首先要明确上面的2个阻止是否符合我们的预期。

如果我们在只想阻止元素的默认动作或者只想阻止元素向上传递事件的情况下误用了[return false;]的话,

那么在大量的代码中就很难调试出问题的所在了。

在javascript中其实有相应的函数分别实现上面的2个阻止,分别是:

  1. event.preventDefault() 阻止触发事件的元素的默认动作
  2. event.stopPragation()  阻止触发事件的元素向上传递事件

 

2. 代码演示区别

下面分5种情况用代码演示[return false;], [preventDefault()], [stopPragation()]的区别。

html代码:

<!DOCTYPE>
<html xml:lang="zh" lang="zh">
    <head>
        <title>test js 事件阻止</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
        <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
        <script type="text/javascript" src="my.js"></script>
        <style type="text/css" media="screen">
          #parent{
          width:300px;
          height:300px;
          boder:1px;
          background-color:red;
          margin-left:auto;
          margin-right: auto;
          }
          #child{
          width:200px;
          height:200px;
          margin-left:auto;
          margin-right: auto;
          boder:1px;
          background-color:blue;
          }
        </style>
    </head>
    <body>
      <div id="parent">
          <div id="child">
            <a href="http://www.baidu.com" id="lnk">go to baidu!</a>
          </div>
      </div>
    </body>
</html>

 

情况一,不使用[return false;], [preventDefault()], [stopPragation()]

默认的my.js的代码如下:

// init
$(function(){
    $("#parent").bind('click', fun_p);
    $("#child").bind('click', fun_c);
    $("#lnk").bind('click', fun_a);

});

function fun_p()
{
    alert('parent');
}

function fun_c()
{
    alert('child');
}

function fun_a()
{
    alert('link');
}

在浏览器中打开html文件,点击其中的link("go to baidu!"),依次执行以下操作:

  1. 触发link的click事件alert('link')
  2. 向上传递click事件到父元素div(id为child的div),触发此div的click事件alert('child')
  3. 继续传递click事件到父元素div(id为parent的div),触发此div的click事件alert('parent')
  4. 执行link的默认动作,即迁移到baidu首页

 

情况二,使用[return false;]

my.js中的function fun_a里追加一行[return false;]

function fun_a()
{
    alert('link');
    return false;
}

在浏览器中打开html文件,点击其中的link("go to baidu!"),依次执行以下操作:

1. 触发link的click事件alert('link')

情况一中的2~4步被阻止了

 

情况三,使用[preventDefault()]

my.js中的function fun_a里追加一行[event.preventDefault()]

function fun_a()
{
    alert('link');
    event.preventDefault();
}

在浏览器中打开html文件,点击其中的link("go to baidu!"),依次执行以下操作:

  1. 触发link的click事件alert('link')
  2. 向上传递click事件到父元素div(id为child的div),触发此div的click事件alert('child')
  3. 继续传递click事件到父元素div(id为parent的div),触发此div的click事件alert('parent')

link的默认动作被函数[preventDefault()]阻止了

 

情况四,使用[stopPragation()]

my.js中的function fun_a里追加一行[event.stopPragation()]

function fun_a()
{
    alert('link');
    event.stopPropagation();
}

在浏览器中打开html文件,点击其中的link("go to baidu!"),依次执行以下操作:

  1. 触发link的click事件alert('link')
  2. 执行link的默认动作,即迁移到baidu首页

向上传递事件被函数[stopPragation()]阻止了

 

情况五,同时使用[preventDefault()]和[stopPragation()]

my.js中的function fun_a里追加两行[event.preventDefault()]和[event.stopPragation()]

function fun_a()
{
    alert('link');
    event.preventDefault();
    event.stopPropagation();
}

在浏览器中打开html文件,点击其中的link("go to baidu!"),依次执行以下操作:

触发link的click事件alert('link')

与情况二一样,说明了[return false;]是包含了[preventDefault]和[stopPragation]两个功能的。

 

3. 建议

建议尽量使用[preventDefault]和[stopPragation]函数,

即使是在确实要使用[return false;]的地方,也可以上面的情况五那样用[preventDefault]和[stopPragation]来代替。

这样可以使代码的含义更加明确,可读性更好。




本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2013/04/11/3014767.html,如需转载请自行联系原作者


目录
相关文章
|
20天前
|
JavaScript 前端开发 索引
问js的forEach和map的区别
JavaScript中的`forEach`和`map`都是数组迭代方法。`forEach`遍历数组但不修改原数组,无返回值;它接受回调函数处理元素。`map`则遍历数组并返回新数组,新数组元素为回调函数处理后的结果。两者都接收元素、索引和数组作为回调函数参数。
20 7
|
1天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
12 3
|
2天前
|
JavaScript 前端开发
js开发:请解释同步和异步编程的区别。
同步编程按顺序执行,易阻塞;异步编程不阻塞,提高效率。同步适合简单操作,异步适合并发场景。示例展示了JavaScript中同步和异步函数的使用。
13 0
|
6天前
|
算法
Swiper库和Glide.js库的性能有何区别
Swiper和Glide.js是两个流行的响应式轮播图库。Swiper功能强大且灵活,支持多方向滑动,拥有丰富的配置和切换效果,适合复杂需求,其高性能得益于优化的算法和惰性加载。Glide.js则轻量级、快速,专注于基础功能,适合简洁需求。两者各有侧重,选择应基于项目具体需求和性能考虑。
|
10天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
15 0
|
13天前
|
JavaScript 前端开发
JQuery和JS的区别有哪些?
JQuery和JS的区别有哪些?
13 0
|
13天前
|
JavaScript 前端开发
js中浅拷贝和深拷贝的区别
js中浅拷贝和深拷贝的区别
20 1
|
16天前
|
JavaScript 前端开发 算法
JavaScript 中前置自增与后置自增:区别、应用场景
【4月更文挑战第6天】JavaScript中的前置自增`++a`先增后用,返回新值,适合复合赋值和循环计数;后置自增`a++`先用后增,返回原值,适用于保留变量原值的操作。二者差异在于运算时机和返回值,选择时要考虑递增时机和表达式中使用的值。在复杂表达式中应避免混用,注重代码清晰度和一致性。理解这些差异能提高代码效率,避免逻辑错误。
18 1
|
24天前
|
JavaScript 前端开发
JavaScript中call()与apply()的作用与区别?
JavaScript中call()与apply()的作用与区别?
22 2
|
24天前
|
JavaScript 前端开发
JavaScript中Object.prototype.toString.call()、instanceOf和Array.isArray()的区别
JavaScript中Object.prototype.toString.call()、instanceOf和Array.isArray()的区别
23 1