JavaScript - 避免执行事件的默认操作。 `event.cancelable` vs`event.preventDefault`?

时间:2013-02-13 19:29:55

标签: javascript events javascript-events event-handling

当我不想执行与事件关联的默认操作时,我使用

function listener(e){
    if(e.preventDefault) e.preventDefault();
    /* Other code */
}

I have just learnt事件具有布尔cancelable。那么,我应该使用这个代码吗?

function listener(e){
    if(e.cancelable) e.preventDefault();
    /* Other code */
}

我想知道:

  • 如果event.preventDefaulttrue,是否真的意味着该事件可以取消?也许如果它不可取消,那么定义该属性(和true),但它不是一个函数;或者它是一个功能,但如果我调用它会引发错误。
  • 所有浏览器(IE,我看着你)都支持event.cancelable吗?是否存在具有event.preventDefault方法但没有event.cancelable的浏览器;或者方法event.cancelable但没有event.preventDefault;或event.cancelable并不总是暗示event.preventDefault已定义且它是一个函数并且它不会抛出错误?

1 个答案:

答案 0 :(得分:4)

此:

if (e.preventDefault)

仅表示事件对象具有名为“preventDefault”的属性。这是一个浏览器功能测试,因为IE的旧版本没有。相反,在IE中,您将事件对象的属性“returnValue”设置为false

因此,您测试“preventDefault”的原因是查看该功能是否可用;如果属性为null,则显然无法进行函数调用。因此,当您想要阻止默认操作时,您的代码应如下所示:

if (e.preventDefault)
  e.preventDefault();
else
  e.returnValue = false;

如果“cancelable”标志为false,则表示无法阻止默认行为。 “preventDefault”函数仍然存在(如果通常是这样),但对于不可取消的事件,将忽略对它的调用。真的没有必要检查旗帜;它通常是特定类型事件的静态特征。