3258

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

1event.proventDefault()

$('a').点击(功能(e){//此处进行自定义处理e.预防违约();});

2返回false

$('a').点击(函数(){//此处进行自定义处理返回false;});

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

为了我,返回false;与执行方法相比,它更简单、更短,而且可能不太容易出错。使用该方法,您必须记住正确的大小写、括号等。

此外,我必须在回调中定义第一个参数才能调用该方法。也许,我应该避免这样做并使用预防违约而不是?更好的方法是什么?

8
  • 181
    注意jQuery的预防违约防止其他人执行。就是这样停止立即传播是的。 评论 2009年8月31日12:22
  • 19
    @CrescentFresh,它确实会阻止其他(随后绑定的)处理程序执行。。。在DOM节点上触发事件。它只是无法阻止传播。
    – 无眼
    评论 2011年10月17日2:51
  • 43
    这不是“停止事件传播的两种方法?”e.preventDefault();阻止默认操作,它不会停止由e.stopPropagation()完成的事件传播。 评论 2012年1月9日1:44
  • 32
    这个问题及其答案是关于jQuery的。如果您来这里寻找简单的javascript答案,请参阅event.proventDefault()vs.返回false(无jQuery) 评论 2013年9月28日21:23
  • 6
    这个答案有一张表解释了一切stackoverflow.com/a/5302939/759452 评论 2014年4月16日7:20

14答案14

重置为默认值
2979
+500

返回false在jQuery事件处理程序中实际上与调用两者相同e.预防违约e.stopPropagation(停止传播)在经过的时候jQuery。事件对象。

e.预防违约()将防止发生默认事件,e.停止传播()将防止事件发生返回false两者都能做到。请注意,此行为与正常的(非jQuery)事件处理程序,其中值得注意的是,返回false阻止事件发生。

资料来源:作者

使用event.proventDefault()而不是“return false”取消href单击有什么好处?

5
  • 140
    返回false来自DOM2处理程序(添加事件侦听器)什么都不做(既不阻止默认值,也不停止冒泡;来自Microsoft DOM2 ish处理程序(附件事件),防止默认但不冒泡;来自DOM0处理程序(onclick=“返回…”),它可以防止默认值(如果您包括返回属性中)但不冒泡;从jQuery事件处理程序中,它可以同时执行这两项操作,因为这是jQuery的事情。此处提供详细信息和现场测试 评论 2011年11月30日13:09
  • 14
    在这里定义“传播”和“默认”将很有帮助。我就一直把他们搞糊涂。这是正确的吗?传播=我的代码(父元素的JavaScript事件处理程序)。违约=浏览器代码(链接、文本选择等) 评论 2013年7月28日14:49
  • 6
    冒泡到底是什么意思?例子? 评论 2016年8月17日10:59
  • 6
    +1表示注意到返回false停止非jQuery事件处理程序中的事件传播。测试</a>阻止事件发生。
    – 道格·S
    评论 2016年8月21日2:42
  • 1
    @GovindaSakhare如果你不知道事件冒泡意味着什么,你可能想阅读并理解整个页面:developer.mozilla.org/en-US/docs/Learn/JavaScript/… 评论 2022年9月29日15:26
457

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

$('a').点击(功能(e){//此处进行自定义处理//哎呀。。。运行时错误。。。哦,href会带我去哪里?返回false;});

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

$('a').点击(功能(e){e.预防违约();//此处进行自定义处理//哎呀。。。运行时错误,但至少用户没有被导航走。});
2
  • 72
    尽管如此,在进行渐进增强时,相反的行为通常更可取(我认为这可能是覆盖默认操作的最可能原因)
    – 平均码
    评论 2012年4月27日22:53
  • 这两种方法都是阻止事件的默认行为的方法,这只是一个你试图解决的问题。 评论 2020年2月3日21:00
117

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

jQuery和先前链接的引文作者(英寸卡里姆79的 消息)似乎是对事件处理程序一般工作方式的误解。

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

返回false的事件处理程序内容属性和事件处理程序IDL属性会阻止该事件处理程序的默认操作。

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

有关详细信息,请参阅[[W3C DOM 2 Events文档]][1]。

10
  • 6
    @rds表示“preventDefault不会停止通过DOM.event.stopPropagation进一步传播事件。”
    – 加勒特
    评论 2011年7月24日23:40
  • 回答在一个密切相关的问题上,他声称在HTML5之前,从事件处理程序返回false不是有规格的做任何事情。现在,也许这是对规范的错误解释(很难理解),或者也许尽管它并没有按照字面意思对所有解释的浏览器进行规范返回false一样event.proventDefault().但我不知道;这足以让我加点盐吃了。 评论 2016年1月24日0:13
  • 11
    我讨厌google中的每个javascript搜索结果实际上都是关于jQuery,+1 评论 2016年10月11日21:26
  • 他将其标记为JavaScript和jQuery,两者都是正确的。jQuery(jQuery)只是JavaScript的一个子集,而不是它自己的语言。 评论 2020年1月28日5:26
  • 1
    MSDN现在正在改写历史,假装它的历史就是当前Firefox的历史。改写历史对政府来说并不是什么新鲜事,它是一种权力工具,也是一种观念管理工具。MSDN用event.returnValue重写历史是多么的随意和可笑。然而,这不是现实。lists.w3.org/Archives/Public/www-style/2010年9月/0458.html
    – 加勒特
    评论 2022年11月14日16:14
77

一般来说,您的第一个选择(预防默认())这是一个选择,但你必须知道你所处的环境和你的目标是什么。

为您的编码加油有一个很棒的关于的文章返回false;event.proventDefault()event.stopPropagation()event.stopImmediatePropagation().

1
  • @VisruthCV查看我添加的便笺以及存档版本的链接 评论 2017年8月2日15:44
62

使用jQuery时,返回false称之为做三件事:

  1. event.proventDefault();
  2. event.stopPropagation();
  3. 停止回调执行,并在调用时立即返回。

请参阅jQuery事件:使用返回False停止(Mis)获取更多信息和示例。

1
  • 如果代码的其他部分正在侦听此事件,则为event.stopPropagation();会取消回叫吗? 评论 2020年2月3日21:02
48

您可以在onClick(单击)一个元素的事件。你怎么能确定最后一个开枪?预防违约另一方面,肯定只会阻止元素的默认行为。

1
  • 您不需要让最后一个事件处理程序返回false。任何处理程序都可以返回false以阻止默认行为。请参阅myprogrammingnotes.com/…
    – 彼得
    评论 2022年5月19日9:06
24

我想

event.proventDefault()

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

您可以在上的W3C规范中阅读此内容事件取消.

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

  • 4
    在我见过的任何浏览器中都没有。也许你把它和<a href=“javascript:return false”还是什么? 评论 2012年2月15日12:53
  • 14
    -1; 声称返回false的href会生成一个文本页面,上面写着单词“false”,这完全是胡说八道。 评论 2016年1月23日23:10
  • 1
    (减去)1;断开的链接+完全胡说八道
    – 菲尔
    评论 2017年11月6日16:01
19

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

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

如果你还想退货,然后可以将整个处理程序代码放入如下所示的try-catch块中:

$('a').点击(功能(e){尝试{您的代码在这里。。。。。。。。。}捕获(e){}返回false;});
5

两者之间的主要区别返回falseevent.proventDefault()下面是你的代码吗返回false不会执行,并且event.proventDefault()case您的代码将在该语句之后执行。

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

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

预防默认()返回false是防止默认事件发生的不同方法。

例如,当用户单击外部链接时,我们应该显示一个确认模式,询问用户是否重定向到外部网站:

hyperlink.addEventListener(“单击”,函数(e){//不要将用户重定向到链接e.预防违约();});

或者我们不想在单击表单的提交按钮时提交表单。相反,我们希望首先验证表单:

submitButton.addEventListener('单击',函数(e){//单击提交时不提交表单e.预防违约();});

差异

  1. 返回false如果使用添加事件侦听器方法来处理事件。仅当事件处理程序声明为元素的属性时,它才起作用:
hyperlink.addEventListener(“单击”,函数(e){//不工作返回false;});//工作hyperlink.onclick=函数(e){返回false;};
  1. 根据HTML 5规范,返回false将取消活动,但鼠标悬停事件。

良好做法

  1. 建议使用预防违约方法而不是返回false在事件处理程序中。因为后者只适用于使用onclick(单击)属性,该属性将删除同一事件的其他处理程序。

  2. 如果使用jQuery管理事件,那么可以使用返回false在事件处理程序中:

$(element).on('单击',函数(e){返回false;});

在返回false值之前,处理程序将执行其他操作。问题是,如果处理程序中发生任何运行时错误,我们将无法在末尾返回false语句。

在这种情况下,将采用默认行为:

$(element).on('click',函数(e){//在此处执行操作,但如果运行时出现错误// ...返回false;});

我们可以通过使用预防违约方法,然后再执行任何自定义处理程序:

$(element).on('单击',函数(e){e.预防违约();//在这里做点什么//无论运行时出现什么错误,都会阻止默认行为// ...});

很高兴知道

如果使用jQuery管理事件,那么返回false将与预防默认()停止传播()方法:

$(element).on('单击',函数(e){//防止默认事件发生,并//防止事件冒泡到父元素返回false;});
1

e.预防违约();

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

实例示例:-

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

原因:-

使用的原因e.预防违约();就是在我们的代码中,代码中出现了一些错误,然后它将允许执行链接或表单以提交,或者允许执行或允许执行任何您需要执行的操作。链接或提交按钮将被提交&仍然允许事件的进一步传播。

<!DOCTYPE html><html lang=“en”dir=“ltr”><头部><元字符集=“utf-8”><标题></头><body><script src=“https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js“></script><a href=“https://www.google.com“onclick=”doSomethingElse()“>防止页面重定向</a><script type=“text/javascript”>函数doSomethingElse(){console.log(“这是测试…”);}$(“a”).点击(功能(e){e.预防违约();});</script></body></html>

return False;

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

"返回false;“将结束整个流程的执行。

原因:-

使用return false的原因;就是你不想再以严格的模式执行这个函数了。

<!DOCTYPE html><html lang=“en”dir=“ltr”><头部><元字符集=“utf-8”><标题></头><body>废话</a><script type=“text/javascript”>函数returnFalse(){console.log(“在没有位置重定向的情况下返回false….”)返回false;location.href=“http://www.google.com网站/";}</script></body></html>

1

基本上,这种组合方式是因为jQuery是一个主要关注HTML元素的框架,基本上可以防止出现默认值,但同时也可以停止传播以产生泡沫。

所以我们可以简单地说,在jQuery(jQuery)等于:

return false是e.preventDefault和e.stopPropagation

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

基本上在开始使用之前返回false;,首先要了解e.预防违约();e.停止传播();那么,如果你认为你同时需要两者,那么就简单地使用它。

所以基本上这个代码如下:

$('div').点击(函数(){返回false;});

平等的到该代码:

$('div').点击(函数(事件){event.proventDefault();event.stopPropagation();});
1

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

0
0

根据我的经验,我认为使用

event.proventDefault()

实际上在我们需要时停止或阻止提交事件,而不是返回false event.proventDefault()效果很好。

  • 14
    为什么更好?你在这里没有给出任何理由-1 评论 2016年1月23日23:07
  • 在有多个事件绑定的情况下,e.preventDefault()比return false更有针对性。 评论 2017年8月22日22:50
  • 预防违约是一些我理解的英语单词“防止默认”。返回false是一些英语单词,我理解它“返回false”,但我不知道为什么,直到我谷歌这个神秘的代码。还有奖金,我可以单独控制停止传播预防违约.
    – 
    评论 2018年3月28日17:25

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.