向点击事件监听器添加“返回假”有什么作用?


359

很多次,我在HTML页面中都看到过这样的链接:

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

return false在那里的作用是什么?

另外,我通常不会在按钮中看到它。

在任何地方都指定了吗?在w3.org的某些规格中?


5
在leonel的示例中,实际的问题是,如果当前页面向下滚动某种方式,它将跳转到顶部,而不会返回false。
roenving

我的IntelliJ抱怨“返回假”;与“外部函数定义”消息
ses 2013年

Answers:


310

事件处理程序的返回值确定默认浏览器行为是否也应发生。在单击链接的情况下,将在链接之后,但是区别最明显的是表单提交处理程序,如果用户输入信息有误,则可以取消表单提交。

我不相信对此有W3C规范。像这样的所有古代JavaScript接口都被赋予了“ DOM 0”的昵称,并且大多未指定。阅读旧的Netscape 2文档可能会有些运气。

实现此效果的现代方法是调用event.preventDefault(),这是在DOM 2事件规范中指定


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;也可以在IE中使用

3
除Chrome之外的所有浏览器都可以使用该return false方法,但我需要event.preventDefaultChrome。
DOOManiac 2013年

3
Chrome return false现在可以使用该方法。它停止跟随img元素的onclick事件中的链接。

在普通的JS表单中,返回false的提交处理程序不起作用(至少在Chrome中不起作用),因此我使用e.preventDefault()。根据@ 2astalavista在e.preventDefault上面的评论在IE中失败,因此请使用他的方法:event.preventDefault?event.preventDefault():event.returnValue = false;
luigi7up 2014年

162

您可以通过以下示例看到不同之处:

<a href="http://www.google.co.uk/" onclick="return (confirm('Follow this link?'))">Google</a>

单击“确定”,返回true,然后单击链接。单击“取消”将返回false,并且不遵循链接。如果禁用了javascript,则正常跟随链接。


7
正是我想要的,在提交按钮上也很完美!<button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
2013年

27

这是在所有浏览器中取消默认行为和事件冒泡的更强大的例程:

// Prevents event bubble up or any usage after this is called.
eventCancel = function (e)
{
    if (!e)
        if (window.event) e = window.event;
    else return;
    if (e.cancelBubble != null) e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    if (e.preventDefault) e.preventDefault();
    if (window.event) e.returnValue = false;
    if (e.cancel != null) e.cancel = true;
}

在事件处理程序中如何使用此示例:

// Handles the click event for each tab
Tabstrip.tabstripLinkElement_click = function (evt, context) 
{
    // Find the tabStrip element (we know it's the parent element of this link)
    var tabstripElement = this.parentNode;
    Tabstrip.showTabByLink(tabstripElement, this);
    return eventCancel(evt);
}

匀场片虽然很好,但实际的优势是什么return false;kamesh的答案对此进行了一些处理,但是由于您的填充程序有可能一个或另一个执行,这些单独的结果如何使tabstripLinkElement_click浏览器之间进行更改操作?如果没有操作上的差异,为什么(在实践中)会打扰(即使从理论上讲,这是正确的做法)?谢谢,AIA回答了僵尸问题。
ruffin

7
第一个代码块的结尾else。可怕的编码风格。加上一些花括号,这样就不会造成歧义。
mbomb007'7

23

什么是“返回假”真正在做?

返回false实际上是在您调用它时做三件事:

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

请参阅jquery-events-stop-misusing-return-false更多信息,。

例如 :

在单击此链接时,返回false将取消浏览器的默认行为

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

7
的onclick =“返回假”是一样的,从一个jQuery click事件处理程序返回false。浏览器仅阻止默认处理程序(例如e.preventDefault()),但不会停止传播。参见:jsfiddle.net/18yq1783
Jamie Treworgy 2014年

1
首先,指向博客的链接已损坏。一个档案就在这里
ruffin

16

从JavaScript事件中将false调整为false通常会取消“默认”行为-在链接的情况下,它告诉浏览器不要遵循该链接。


5
“通常”?所以不总是这样吗?
Maria Ines Parnisari 2015年

12

我相信这会导致标准事件不会发生。

在您的示例中,浏览器将不会尝试转到#。


12

在JavaScript运行之后,返回false将停止遵循超链接。这对于可以正常降级的不引人注意的javascript很有用-例如,您可能拥有一个使用javascript打开全尺寸图像弹出窗口的缩略图。当关闭javascript或单击鼠标中键(在新选项卡中打开)时,此操作将忽略onClick事件,并通常以全尺寸图像的形式打开图像。

如果未指定return false,则图像将同时启动弹出窗口并正常打开图像。某些人不是使用return false而是将javascript用作href属性,但这意味着禁用javascript时,链接将无效。


7

在onclick事件中使用return false可以阻止浏览器处理其余的执行堆栈,包括跟踪href属性中的链接。

换句话说,添加return false会使href停止工作。在您的示例中,这正是您想要的。

在按钮中,这是没有必要的,因为onclick就是它将执行的全部东西-没有href可以处理和转到。


6

返回false表示不采取默认操作,如果是,<a href>则默认操作是跟随链接。当您向onclick返回false时,href将被忽略。



3

返回false将阻止导航。否则,该位置将成为someFunc的返回值


不,该位置将成为href属性的内容
Chris Marasti-Georg

如果位置是href =“ javascript:someFunc()”,则该位置仅成为someFunc的返回值,事件处理程序则不是这种情况。
吉姆

3

这样return false可以防止页面被浏览以及窗口不必要地滚动到顶部或底部。

onclick="return false"

3

我很惊讶,没有人提到onmousedown代替onclick。的

onclick='return false'

无法捕获浏览器的默认行为,从而导致(有时是不必要的)文本选择发生,mousedown

onmousedown='return false'

做。

换句话说,当我单击按钮时,有时会意外选择其文本,从而改变按钮的外观,这可能是不希望的。这是我们试图在此处防止的默认行为。但是,该mousedown事件是在之前注册的click,因此,如果仅阻止click处理程序中的该行为,则不会影响该mousedown事件引起的不需要的选择。因此,文本仍然被选中。但是,防止该mousedown事件的默认设置将起到作用。

另请参阅event.preventDefault()与return false


@FrederikKrautwald你说的对,这很神秘,我应该说“选择”而不是“标记”。我试图写得更清楚,希望它更有意义。
Dmitri Zaitsev

0

我的HTML页面上有以下链接:

<a href = "" 
onclick = "setBodyHtml ('new content'); return false; "
> click here </a>

函数setBodyHtml()定义为:

function setBodyHtml (s)
{ document.body.innerHTML = s;
}

当我单击链接时,链接消失,浏览器中显示的文本变为“新内容”。

但是,如果我从链接中删除“ false”,则单击链接不会(似乎)没有任何作用。这是为什么?

这是因为,如果我不返回false,则不会取消单击链接并显示其目标页面的默认行为。但是,此处的超链接的href为“”,因此它链接回SAME当前页面。因此,该页面实际上只是刷新了,似乎什么也没有发生。

在后台,函数setBodyHtml()仍会执行。它将其参数分配给body.innerHTML。但是,由于该页面会立即刷新/重新加载,因此修改后的正文内容可能不会在几毫秒内保持可见状态,因此我不会看到它。

此示例说明了为什么有时有时会使用“ return false”。

我确实想将SOME href分配给该链接,以便它显示为链接,并带有下划线的文本。但我不希望单击链接来有效地重新加载页面。我希望取消默认的navigation = behavior,并通过调用我的函数使之保持有效而引起任何副作用。因此,我必须“返回假”。

上面的示例是您在开发过程中会很快尝试的示例。对于生产而言,您更有可能在JavaScript中分配一个点击处理程序,然后调用preventDefault()。但是,为了快速尝试,上面的“ return false”可以解决问题。


0

使用表格时,我们可以使用“ return false”来防止提交。

function checkForm() {
    // return true to submit, return false to prevent submitting
}
<form onsubmit="return checkForm()">
    ...
</form>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.