ChatGPT解决这个技术问题 Extra ChatGPT

event.preventDefault() 与返回 false

当我想在某个事件被触发后阻止其他事件处理程序执行时,我可以使用两种技术之一。我将在示例中使用 jQuery,但这也适用于纯 JS:

1. event.preventDefault()

$('a').click(function (e) {
    // custom handling here
    e.preventDefault();
});

2.返回假

$('a').click(function () {
    // custom handling here
    return false;
});

这两种停止事件传播的方法之间有什么显着区别吗?

对我来说,return false; 比执行方法更简单、更短并且可能更不容易出错。使用该方法,您必须记住正确的大小写、括号等。

另外,我必须在回调中定义第一个参数才能调用该方法。也许,有一些原因我应该避免这样做并使用 preventDefault 代替?有什么更好的方法?

请注意,jQuery 的 preventDefault 确实 阻止其他处理程序执行。这就是 stopImmediatePropagation 的用途。
@CrescentFresh,它确实阻止了其他(随后绑定的)处理程序执行......在触发事件的DOM节点上。它只是不阻止传播。
这些不是“阻止事件传播的两种方法吗?” e.preventDefault();阻止默认操作,它不会停止事件传播,这是由 e.stopPropagation() 完成的。
这个问题及其答案是关于 jQuery 的。如果您来这里是为了寻找一个简单的 javascript 答案,请参阅 event.preventDefault() vs. return false (no jQuery)
这个答案有一个解释这一切的表格stackoverflow.com/a/5302939/759452

L
Leo

在 jQuery 事件处理程序中 中的 return false 实际上与在传递的 jQuery.Event object. 上调用 e.preventDefaulte.stopPropagation 相同

e.preventDefault() 将阻止默认事件发生,e.stopPropagation() 将阻止事件冒泡,而 return false 将同时执行这两项操作。请注意,此行为不同于 普通(非 jQuery)事件处理程序,其中值得注意的是,return false not 阻止事件冒泡。

来源:John Resig

Any benefit to using event.preventDefault() over "return false" to cancel out an href click?


来自 DOM2 处理程序 (addEventListener) 的 return false 什么都不做(既不会阻止默认值,也不会停止冒泡;来自 Microsoft DOM2-ish 处理程序 (attachEvent),它会阻止默认值但不冒泡;来自 DOM0 处理程序(onclick="return ..."),它会阻止默认值(假设您在属性中包含 return)但不会冒泡;对于 jQuery 事件处理程序,它会同时执行这两种操作,因为这是 jQuery 的事情。Details and live tests here
在这里定义“传播”和“默认”会很有帮助。我一直在混淆他们。这个对吗?传播 = 我的代码(父元素的 JavaScript 事件处理程序)。默认 = 浏览器代码(链接、文本选择等)
冒泡的真正含义是什么?例子?
+1 注意到 return false 确实 not 停止非 jQuery 事件处理程序中的事件传播。即<a href="#" onclick="return false">Test</a>不会阻止事件冒泡。
J
Jeff Poulton

根据我的经验,使用 event.preventDefault() 比使用 return false 至少有一个明显的优势。假设您正在捕获锚标记上的点击事件,否则如果用户被导航离开当前页面,这将是一个大问题。如果您的单击处理程序使用 return false 来阻止浏览器导航,则可能会导致解释器无法到达 return 语句,并且浏览器将继续执行锚标记的默认行为。

$('a').click(function (e) {
  // custom handling here

  // oops...runtime error...where oh where will the href take me?

  return false;
});

使用 event.preventDefault() 的好处是您可以将其添加为处理程序的第一行,从而保证锚的默认行为不会触发,无论是否未到达函数的最后一行(例如运行时错误)。

$('a').click(function (e) {
  e.preventDefault();

  // custom handling here

  // oops...runtime error, but at least the user isn't navigated away.
});

虽然确实如此,但在进行渐进增强时通常更可取相反的行为(我认为这可能是覆盖默认操作的最可能原因)
两者都是阻止事件默认行为的方法,这只是您要解决的问题的问题。
C
Community

正如你所说的,这不是一个“JavaScript”问题。这是一个关于 jQuery 设计的问题。

jQuery 和 John Resig 中的 previously linked citation(在 karim79's message 中)似乎是对事件处理程序一般工作方式的误解的根源。

事实:返回 false 的事件处理程序会阻止该事件的默认操作。它不会停止事件传播。自 Netscape Navigator 的旧时代以来,事件处理程序一直以这种方式工作。

documentation from MDN 解释了事件处理程序中的 return false 如何工作

jQuery 中发生的事情与事件处理程序中发生的事情不同。 DOM 事件侦听器和 MSIE “附加”事件完全不同。

如需进一步阅读,请参阅 attachEvent on MSDNW3C DOM 2 Events documentation


@rds 说“preventDefault 不会阻止事件通过 DOM 进一步传播。应该使用 event.stopPropagation。”
关于一个密切相关的问题的 answer 声称,在 HTML 5 之前,从事件处理程序返回 false 并没有指定做任何事情。现在,这可能是对(难以理解的)规范的错误解释,或者尽管没有按字面定义,但所有浏览器都将 return false 解释为与 event.preventDefault() 相同。但我不知道;这足以让我用一小撮盐吃这个。
我讨厌谷歌中的每个 javascript 搜索结果实际上都是关于 jQuery,+1
他将其标记为 JavaScript 和 jQuery,两者都是正确的。 jQuery 只是 JavaScript 的一个子集,而不是它自己的语言。
J
JosefAssad

通常,您的第一个选项 (preventDefault()) 是您可以选择的选项,但您必须知道您所处的环境以及您的目标是什么。

为您的编码加油有一个很棒的article on return false; vs event.preventDefault() vs event.stopPropagation() vs event.stopImmediatePropagation()


@VisruthCV 查看我添加的注释以及存档版本的链接
S
Salman von Abbas

使用 jQuery 时,return false 在您调用它时会做 3 件不同的事情:

event.preventDefault(); event.stopPropagation();停止回调执行并在调用时立即返回。

有关更多信息和示例,请参阅 jQuery Events: Stop (Mis)Using Return False


如果代码的其他部分正在监听这个事件,event.stopPropagation();会取消他们的回调吗?
u
user66001

您可以在一个元素的 onClick 事件上挂起很多函数。您如何确定 false 将是最后一个触发?另一方面,preventDefault 肯定只会阻止元素的默认行为。


您不需要让最后一个事件处理程序返回 false。任何处理程序都可以返回 false 以防止默认行为。请参阅myprogrammingnotes.com/…
u
user66001

我认为

event.preventDefault()

是 w3c 指定的取消事件的方式。

您可以在 Event cancelation 上的 W3C 规范中阅读此内容。

您也不能在每种情况下都使用 return false 。在 href 属性中提供 javascript 函数时,如果您返回 false,则用户将被重定向到写入 false 字符串的页面。


在我见过的任何浏览器中都没有。也许您将其与 <a href="javascript:return false" 或其他东西混淆了?
-1;声称返回 false 的 href 将生成一个带有“false”字样的文本页面,这完全是胡说八道。
(减)1;断开的链接+完全废话
d
dangom

我认为最好的方法是使用 event.preventDefault() 因为如果在处理程序中引发了一些异常,那么 return false 语句将被跳过并且行为将与您想要的相反。

但是,如果您确定代码不会触发任何异常,那么您可以使用任何您希望的方法。

如果您仍然想使用 return false,那么您可以将整个处理程序代码放在 try catch 块中,如下所示:

$('a').click(function (e) {
  try{
      your code here.........
  }
   catch(e){}
  return false;
});

A
Abdullah Shoaib

return falseevent.preventDefault() 之间的主要区别在于,您在 return false 之下的代码将不会被执行,而在 event.preventDefault() 的情况下,您的代码将在此语句之后执行。

当您编写 return false 时,它会在幕后为您执行以下操作。

* Stops callback execution and returns immediately when called.
* event.stopPropagation();
* event.preventDefault();

P
Parth Raval

e.preventDefault();

它只是停止元素的默认操作。

实例示例:-

防止超链接跟随 URL,防止提交按钮提交表单。当您有许多事件处理程序并且您只想防止默认事件发生,并且多次发生时,我们需要在函数()的顶部使用。

原因:-

使用 e.preventDefault(); 的原因是在我们的代码中,如果代码出现问题,那么它将允许执行链接或表单以提交或允许执行或允许您需要执行的任何操作。 &链接或提交按钮将被提交 &仍然允许事件的进一步传播。

阻止页面重定向

返回假;

它只是停止函数()的执行。

"return false;" 将结束整个进程的执行。

原因:-

使用return false的原因;是您不想再在严格模式下执行该功能。

Blah


A
Alireza

基本上,通过这种方式你可以组合事物,因为 jQuery 是一个主要关注 HTML 元素的框架,你基本上可以防止默认值,但同时,你会停止传播以冒泡。

所以我们可以简单地说,jQuery 中的 return false 等于:

返回 false 是 e.preventDefault AND e.stopPropagation

但也不要忘记它都在 jQuery 或 DOM 相关函数中,当您在元素上运行它时,基本上,它会阻止一切触发,包括默认行为和事件传播。

基本上在开始使用 return false; 之前,首先要了解 e.preventDefault();e.stopPropagation(); 的作用,然后如果您认为同时需要两者,那么只需使用它即可。

所以基本上下面的代码:

$('div').click(function () {
  return false;
});

等于此代码:

$('div').click(function (event) {
  event.preventDefault();
  event.stopPropagation();
});

S
Sathish Shajahan

根据我的经验,event.stopPropagation() 主要用于 CSS 效果或动画作品,例如当您对卡片和按钮元素都有悬停效果时,当您将鼠标悬停在按钮上时,卡片和按钮悬停效果都会在这种情况下触发,您可以使用 event.stopPropagation() 停止冒泡动作,而 event.preventDefault() 用于防止浏览器动作的默认行为。例如,您有表单,但您只为提交操作定义了点击事件,如果用户通过按 Enter 提交表单,则浏览器由按键事件触发,而不是您的点击事件,您应该使用 event.preventDefault() 以避免不当行为。我不知道到底是什么 return false ;抱歉。有关更多说明,请访问此链接并使用第 33 行 https://www.codecademy.com/courses/introduction-to-javascript/lessons/requests-i/exercises/xhr-get-request-iv


a
ann

根据我的经验,我认为总是更好地使用

event.preventDefault() 

实际上,在我们需要时停止或阻止提交事件,而不是 return false event.preventDefault() 工作正常。


为什么更好?你在这里给出的任何理由都是零。 -1。
在有多个事件绑定的情况下,e.preventDefault() 比 return false 更有针对性。
preventDefault 是一些我理解的英文单词“防止默认”。 return false 是一些英文单词,我理解它“返回错误”,但我不知道为什么,直到我谷歌这个神秘代码。另外,我可以分别控制 stopPropagationpreventDefault