为什么 if 语句带有 e.preventDefault ? - 拖放 javascript

why if statement with e.preventDefault ? - drag and drop javascript

我正在按照这个例子制作一个 javascript html5 DnD(拖放):http://www.html5rocks.com/en/tutorials/dnd/basics/

为了防止某些浏览器的默认行为,默认事件被阻止。我明白这个需要。但是为什么还有if语句呢?

function handleDragOver(e) { 
  if (e.preventDefault) {
    e.preventDefault(); // Necessary. Allows us to drop.
  }

// 为什么是这个 if 语句?, 对我来说,这似乎是双重的: 如果它已经存在(如果为真),再做一次......?

感谢任何有时间向 JavaScript 中的新手解释这一点的人。

谢谢!

第一次调用实际上并不是调用函数,而是简单地检查它是否已定义。该代码基本上是在询问 "is the e.preventDefault() method defined?" ,然后如果是:

则执行它
// Is preventDefault() currently defined?
if (e.preventDefault) {
     // Then do it.
     e.preventDefault(); 
}

可能的推理

这种情况存在的可能原因是 support for event.preventDefault() wasn't added in Internet Explorer until IE9,因此在 IE9 之前的那些黑暗日子里,类似于以下的代码可能更常见:

// An example of a pre-IE9 check for preventing default events
(event.preventDefault) ? event.preventDefault() : event.returnValue = false;

通常这样的陈述与浏览器兼容性有关。例如,某些浏览器可能没有实现 preventDefault() 功能。也就是说,我不知道有哪个浏览器有这个问题。

旧版本的 Internet Explorer 不会 将事件对象作为参数传递,而是事件在全局范围内(即 window.event)。但是这段代码并没有防止这种情况发生,因为如果 e 未定义 if(e.preventDefault) 将抛出异常。

另一个可能的原因是 handleDragOver 不仅仅是从事件监听器调用的。在示例代码中,情况并非如此,但也许在某些时候需要这样做。我认为这是一种不好的做法,事件监听器应该只有一个输入参数,而且它应该始终是一个事件。

我相信您可以删除 if 声明。