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,如需转载请自行联系原作者


目录
相关文章
|
8月前
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
219 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
6月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
153 1
|
10月前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
11月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
374 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
11月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
188 2
|
11月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
170 3
|
12月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别