e.preventDefault&& e.preventDefault()

时间:2014-05-05 13:22:02

标签: javascript event-handling

由于我一直在阅读有关原生拖放事件的教程,因此在调用e.preventDefault之前,我遇到了检查e.preventDefault()的条件。这个条件写成:

e.preventDefault && e.preventDefault();

if (e.preventDefault) { 
  e.preventDefault();
}

Remy Sharp的Native Drag and Drop教程,Remy Sharp的Drag and Drop and Automatically Send to the Server和Matt West的Implementing Native Drag and Drop

我以前从未遇到过这种模式。我习惯于在没有条件的情况下看到e.preventDefault()。什么时候e.preventDefault是假的,最好在每个调用e.preventDefault的情况下使用这种措辞?

3 个答案:

答案 0 :(得分:2)

似乎每个浏览器的preventDefault行为都是not standardized。它解释了为什么jQuery在它的Event对象包装器中有一个wrapper for the native preventDefault(),使它始终存在且更具可预测性。在这种情况下,您不必对preventDefault及其值进行额外测试,但可以假设它在事件发生的地方可用。但是,如果你没有像jQuery这样的抽象库,你仍然需要进行额外的测试。 jQuery的代码似乎是一个很好的指南。

答案 1 :(得分:1)

如果Javascript找不到该函数(浏览器没有此函数),那将是错误的,但无论如何它应该是“undefined”,它将被转换为false。如果要保持与旧版浏览器的兼容性,则每次调用此函数时都应该使用它。

 e.preventDefault && e.preventDefault ()

如果第一个条件为真,则执行。无论如何,在jQuery中你可以找到一种通用的方法来实现它。

例如,如果我不记得错了,某些浏览器(IE?)可以使用e.returnValue来避免执行默认操作代码。

您添加的两个代码是相同的,并且也是相同的。

答案 2 :(得分:1)

  

e.preventDefault什么时候会变得麻烦?

在不遵守DOM规范的非常旧的浏览器中,它将是未定义的,例如IE<=8

  

最佳做法是在每个调用e.preventDefault的实例中使用这种措辞吗?

没有。通过标准DOM方法附加的监听器也可以期望此方法存在。如果你关心旧的浏览器,你通常会使用一个框架来支持这些浏览器。