为什么如果声明与e.preventDefault? - 拖放javascript

时间:2016-04-28 16:40:32

标签: javascript drag-and-drop preventdefault

我正在按照这个例子制作一个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解释这个新手的人。

谢谢!

2 个答案:

答案 0 :(得分:0)

第一个调用实际上并不是调用函数,只是检查它是否已定义。代码基本上是问“是e.preventDefault()方法定义的吗?”如果是,则执行它:

// 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;

答案 1 :(得分:0)

通常这样的陈述与浏览器兼容性有关。例如,某些浏览器可能没有实现preventDefault()功能。话虽如此,我不知道任何有这个问题的浏览器。

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

另一个候选原因是handleDragOver不仅仅是来自eventlistener。在示例代码中,情况并非如此,但可能在某些时候需要这样做。我认为这是不好的做法,eventlistener应该只有一个输入参数,它应该始终是一个事件。

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