1

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

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

我刚刚了解到事件有 boolean 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已定义并且它是一个函数并且它不会引发错误?
4

2 回答 2

4

这个:

if (e.preventDefault)

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

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

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

如果“可取消”标志为假,则意味着您无法阻止默认行为。“preventDefault”函数仍然存在(如果它通常会存在的话),但对于不可取消的事件,对它的调用将被忽略。真的,根本不需要检查标志;它通常是特定类型事件的静态特征。

于 2013-02-13T19:32:34.457 回答
0

首先,您可以检查事件是否可取消。知道并非所有事件都是可取消的,例如change事件。

之后,您检查事件是否已被defaultPrevented

if (!event.cancelable || !event.defaultPrevented) {
  // execute the event logic, because the previous event didn't prevented it
}

检查是可选的cancelable,但我用它来提醒自己并非所有事件都可以取消。

于 2022-02-09T15:12:32.453 回答