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

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

问题描述:

当我不想执行与该事件关联的默认动作,我用JavaScript - 避免执行事件的默认操作。 `event.cancelable` vs`event.preventDefault`?

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被定义,它是一个函数,它不会抛出错误?

此:

if (e.preventDefault) 

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

因此,您测试“preventDefault”的原因是查看该函数是否可用;如果该属性为空,那么显然不能进行函数调用。所以,当你想阻止默认操作,你的代码应该是这样的:

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

如果“取消”标志是假的,那么这意味着你不能防止默认行为。 “preventDefault”函数仍然存在(如果它通常会),但对于不可取消的事件忽略对其的调用。根本没有必要检查国旗,真的;它通常是特定类型事件的静态特征。

+1

他不能,但乔恩Skeet可以! – gdoron 2013-02-13 19:35:39

+0

@gdoron哈哈我相信你是对的 – Pointy 2013-02-13 19:36:39

+0

@gdoron谁是Jon Skeet? – Oriol 2013-02-13 19:37:07