67

我想知道,如果event.preventDefault()return false是相同的。event.preventDefault()与返回false(没有的jQuery)

我已经做了some tests,它似乎是

  • 如果使用旧模式,例如

    elem.onclick = function(){ 
        return false; 
    }; 
    

    然后添加一个事件处理程序,return false防止默认操作,如event.preventDefault()

  • 如果事件处理程序使用addEventListener,例如

    添加
    elem.addEventListener(
        'click', 
        function(e){ 
         return false; 
        }, 
        false 
    ); 
    

    然后,return false不会阻止默认动作。

是否所有浏览器的行为都是这样的?

是否有event.preventDefault()return false之间更多的区别是什么?

在哪里我可以找到一些文件(我不能在MDN)约return false在某些情况下的行为像event.preventDefault()


我的问题是只有普通的JavaScript,jQuery的没有,所以请不要将其标记为event.preventDefault() vs. return false重复,即使这两个问题几乎相同的标题。

+0

http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false的复制如果你读的问题,你会发现,这是一个普通的JS问题不是特定的jQuery的一个。 jQuery仅用于使示例代码尽可能简短/干净。 – RaYell

+9

@RaYell不,因为jQuery的'return false'行为与普通的JavaScript不同。此外,另一个问题没有任何答案可以解释普通JS的区别(只有一条评论可以解释它,但很难找到)。所以我认为最好有两个不同的问题。 – Oriol

回答

49

W3C Document Object Model Events Specification1.3.1支持。事件注册接口指出handleEvent在事件监听没有返回值:每当一个事件的量,事件侦听接口的登记 类型的发生

handleEvent 此方法被调用。 [...] 无返回值

1.2.4。取消活动该文件还指出,

对消是通过调用事件的preventDefault 方法来实现。如果一个或多个事件侦听器在事件的任何 阶段调用了preventDefault流的默认操作将被取消。

这应该阻止你使用任何返回true/false的效果,可以在任何浏览器中使用并使用event.preventDefault()

更新

HTML5规范实际上规定了如何对待一个返回值不同。 Section 6.1.5.1 of the HTML Spec指出

如果返回值是一个WebIDL布尔值false值,则取消 事件。

的一切,但 “鼠标悬停” 事件。

结论

我仍然建议使用event.preventDefault()在大多数项目中,因为你将与旧的规范,因此兼容旧的浏览器。只有当你只需要支持尖端的浏览器时,返回false来取消是可以的。的preventDefault,stopPropogation之间

+2

添加HTML5规范:http://www.w3.org/TR/ html5/webappapis.html#event-handler-attributes看起来像处理许多事件(不是鼠标悬停)的返回值:“如果返回值是一个WebIDL布尔值false值,则取消事件” –

+0

并且通过chrome中的一些快速测试,都返回false和event.preventDefault()做*不*停止传播。主要信用于@Oriol:请参阅[停止传播](http://jsfiddle.net/c9hxq8t8/)与[正常](http://jsfiddle.net/8bwr2/) –

+0

thx,编辑答案 –

-11

return false仅仅是IE,event.preventDefault()由铬,FF ......现代浏览器

+9

但在Firefox'()返回FALSE'就像''event.preventDefault当事件处理程序使用此链接写于2000年的老型号 – Oriol

1

差异,返回false

Table Showing Difference

默认操作 - 服务器端操作时控制事件加薪。

假设我们有一个div控件和里面我们有一个按钮。所以div是按钮的父控件。我们有客户端点击和服务器端点击按钮事件。此外,我们有客户端的点击事件的股利。

在客户端上的按钮单击事件中,我们采用以下三种方式可以控制父控件和服务器端代码的行为:

  • return false - 这允许控制的唯一客户端事件。父控件的服务器端事件和客户端事件不会被触发。

  • preventDefault() - 这允许控制的客户端事件及其母公司控制。服务器端事件即。控件的默认操作未被触发。

  • stopPropogation() - 这允许客户端和控制的服务器端事件。该控件的客户端事件不被允许。

+20

你错了,'return false'不会停止传播,所以父控件被激发([demo](http://jsfiddle.net/8bwr2/))。此外,我不确定你的意思是“*服务器端点击事件*”。 – Oriol

+5

@Beginners,请忽略此答案。 – pilau

+3

这是关于服务器端事件的废话? -1 –