jQuery:如何在自定义事件中使用event.preventDefault()?

36

在我的触发代码中,如何知道已经调用了 preventDefault

$(document).trigger('customEvent', params);
if (/* ??? */)
    doDefaultActions();

如果您的自定义事件确实是自定义的,那么您试图防止什么?通常使用preventDefault以防止浏览器执行其正常操作。浏览器本身不知道也不关心自定义事件。 - Ben Zotto
1
如果它是自定义事件..则不应有默认操作.. - Gabriele Petrioli
1
有用的一个原因是当您将处理程序绑定到实际事件和自定义事件时。当您需要从(例如)复选框的初始状态初始化系统时,这很好。您不希望触发“单击”处理程序,因为您不希望复选框切换。因此,他可能想知道在这种过程中是否有什么决定取消复选框切换。(处理程序不一定会检查事件名称。) - Pointy
1
如果处理程序也用于非自定义事件,那么它仍然可以在事件机制中使用。 - Dave Van den Eynde
5个回答

47

trigger()方法也可以接受事件对象作为参数。如果你能够创建一个事件对象,就像这样:

var event = jQuery.Event("customEvent");
$(document).trigger(event);

那么您可以在触发事件后检查是否调用了preventDefault(),示例如下:

var prevented = event.isDefaultPrevented();

3
没问题,我今天通过查阅 jQuery API 自己学会了它。所以我们今天都学到了! - Dave Van den Eynde
这似乎没有记录(至少在api.jquery.com上) - 好吧,无论如何我都找不到它。文档现在好了一点,但我仍然希望他们能把它变成维基。[编辑:好的,我现在在源代码中看到它了!] - Pointy
请访问http://api.jquery.com/trigger/并查看第一条评论。“文档化”可能不是这里的正确词语,但它确实存在。 - Dave Van den Eynde

2
如果有人需要,就像我一样。重要的是第二个构造函数参数: 纯JS:
var event = new CustomEvent("close", { "cancelable": true });
// now event listeners can prevent default behavior
element.onclose(event);
// or: element.dispatchEvent(event);

if (!event.defaultPrevented)
    defaultBehavior();

1
如果您想知道是否已经阻止了默认操作,请使用以下代码:

if (event.defaultPrevented) { // 默认操作已被阻止 }

event.isDefaultPrevented()

根据preventDefault()是否被调用,此函数将返回'true'或'false'。

EDIT: http://api.jquery.com/event.isDefaultPrevented/


1

自定义事件没有一些默认的操作发生...(它们是自定义的)。

另一方面,如果你想要停止这个事件向其他地方冒泡的效果,那么可以看看triggerHandler,它不会向上层冒泡...


0
据我所知,“preventDefault()”调用是为了防止原生浏览器对诸如单击锚标签或在文本字段中按键等事件的响应。一旦事件处理周期结束,它就结束了。对于虚构的事件,我认为它根本没有任何影响,因为它完全是关于jQuery事件处理系统而不是关于原生浏览器功能的。
您的代码可以在某个地方设置某种标志,以便与“外部世界”通信。
[编辑]哦,您可以尝试让处理程序将对事件对象的引用藏在某个地方,以便外部代码可以找到它,然后使用“isDefaultPrevented()”进行外部检查。但我不知道那是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接