当我想在某个事件被触发后阻止其他事件处理程序执行时,我可以使用两种技术之一。我将在示例中使用 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
代替?有什么更好的方法?
preventDefault
确实不 阻止其他处理程序执行。这就是 stopImmediatePropagation
的用途。
在 jQuery 事件处理程序中 中的 return false
实际上与在传递的 jQuery.Event object. 上调用 e.preventDefault
和 e.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?
根据我的经验,使用 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.
});
正如你所说的,这不是一个“JavaScript”问题。这是一个关于 jQuery 设计的问题。
jQuery 和 John Resig 中的 previously linked citation(在 karim79's message 中)似乎是对事件处理程序一般工作方式的误解的根源。
事实:返回 false 的事件处理程序会阻止该事件的默认操作。它不会停止事件传播。自 Netscape Navigator 的旧时代以来,事件处理程序一直以这种方式工作。
documentation from MDN 解释了事件处理程序中的 return false
如何工作
jQuery 中发生的事情与事件处理程序中发生的事情不同。 DOM 事件侦听器和 MSIE “附加”事件完全不同。
如需进一步阅读,请参阅 attachEvent on MSDN 和 W3C DOM 2 Events documentation。
return false
解释为与 event.preventDefault()
相同。但我不知道;这足以让我用一小撮盐吃这个。
jQuery
只是 JavaScript 的一个子集,而不是它自己的语言。
通常,您的第一个选项 (preventDefault()
) 是您可以选择的选项,但您必须知道您所处的环境以及您的目标是什么。
为您的编码加油有一个很棒的article on return false;
vs event.preventDefault()
vs event.stopPropagation()
vs event.stopImmediatePropagation()
。
使用 jQuery 时,return false
在您调用它时会做 3 件不同的事情:
event.preventDefault(); event.stopPropagation();停止回调执行并在调用时立即返回。
有关更多信息和示例,请参阅 jQuery Events: Stop (Mis)Using Return False。
您可以在一个元素的 onClick
事件上挂起很多函数。您如何确定 false
将是最后一个触发?另一方面,preventDefault
肯定只会阻止元素的默认行为。
我认为
event.preventDefault()
是 w3c 指定的取消事件的方式。
您可以在 Event cancelation 上的 W3C 规范中阅读此内容。
您也不能在每种情况下都使用 return false 。在 href 属性中提供 javascript 函数时,如果您返回 false,则用户将被重定向到写入 false 字符串的页面。
<a href="javascript:return false"
或其他东西混淆了?
我认为最好的方法是使用 event.preventDefault()
因为如果在处理程序中引发了一些异常,那么 return false
语句将被跳过并且行为将与您想要的相反。
但是,如果您确定代码不会触发任何异常,那么您可以使用任何您希望的方法。
如果您仍然想使用 return false
,那么您可以将整个处理程序代码放在 try catch 块中,如下所示:
$('a').click(function (e) {
try{
your code here.........
}
catch(e){}
return false;
});
return false
和 event.preventDefault()
之间的主要区别在于,您在 return false
之下的代码将不会被执行,而在 event.preventDefault()
的情况下,您的代码将在此语句之后执行。
当您编写 return false 时,它会在幕后为您执行以下操作。
* Stops callback execution and returns immediately when called.
* event.stopPropagation();
* event.preventDefault();
e.preventDefault();
它只是停止元素的默认操作。
实例示例:-
防止超链接跟随 URL,防止提交按钮提交表单。当您有许多事件处理程序并且您只想防止默认事件发生,并且多次发生时,我们需要在函数()的顶部使用。
原因:-
使用 e.preventDefault();
的原因是在我们的代码中,如果代码出现问题,那么它将允许执行链接或表单以提交或允许执行或允许您需要执行的任何操作。 &链接或提交按钮将被提交 &仍然允许事件的进一步传播。
返回假;
它只是停止函数()的执行。
"return false;
" 将结束整个进程的执行。
原因:-
使用return false的原因;是您不想再在严格模式下执行该功能。
基本上,通过这种方式你可以组合事物,因为 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();
});
根据我的经验,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
根据我的经验,我认为总是更好地使用
event.preventDefault()
实际上,在我们需要时停止或阻止提交事件,而不是 return false
event.preventDefault()
工作正常。
preventDefault
是一些我理解的英文单词“防止默认”。 return false
是一些英文单词,我理解它“返回错误”,但我不知道为什么,直到我谷歌这个神秘代码。另外,我可以分别控制 stopPropagation
和 preventDefault
。
addEventListener
) 的return false
什么都不做(既不会阻止默认值,也不会停止冒泡;来自 Microsoft DOM2-ish 处理程序 (attachEvent
),它会阻止默认值但不冒泡;来自 DOM0 处理程序(onclick="return ..."
),它会阻止默认值(假设您在属性中包含return
)但不会冒泡;对于 jQuery 事件处理程序,它会同时执行这两种操作,因为这是 jQuery 的事情。Details and live tests herereturn false
确实 not 停止非 jQuery 事件处理程序中的事件传播。即<a href="#" onclick="return false">Test</a>
不会阻止事件冒泡。