【发布时间】:2021-12-31 03:55:47
【问题描述】:
在 JavaScript 中,当处理事件时,您可以调用 event.preventDefault() 来阻止事件的默认操作。在 NodeJS 中,这会将 event.defaultPrevented 设置为 true。我希望能够在我的类中创建自定义发射器,这些发射器默认执行诸如关闭应用程序提供的事件。preventDefault() 不会被调用。问题是,发射器似乎没有办法检查 preventDefault() 是否已被调用,因为 defaultPrevented 是事件的属性,而不是发射器,因此发射器无法读取。
这是一些示例代码
class MyClass extends EventEmitter{
close(winID:number):void{
this.emmit('will-quit');
app.close(winID);
}
}
如果 will-quit 的侦听器调用 preventDefault,我想阻止 app.close() 被调用。
我对如何检查是否已调用 preventDefault 有一个想法,但它非常笨拙,可能不是最好的想法。
class MyClass extends EventEmitter{
close(winID:number):void{
this.once('will-quit', (event) => {
if (!event.defaultPrevented){
app.close(winID);
};
};
this.emit('will-quit');
}
}
在事件触发之前创建一个监听器,因此它应该是最后一个被调用的。当它被调用时,它会检查 preventDefault 是否已被调用以及是否没有调用所需的代码。因为它使用一次,一调用就销毁。
我认为应该有更好的方法来做到这一点,但我在任何文档或教程中都找不到任何东西,所以我想知道这是否可能。但是在同样的想法上,像 Electron 这样的框架似乎通过使用 C++ 模块来实现这一点。
注意:所有代码示例都是用 TypeScript 编写的
【问题讨论】:
-
preventDefault 是围绕 DOM 事件的浏览器 API 的一部分。你想完成什么?
-
好吧,例如在Electron中,当
will-close事件在发出时,你可以调用event.preventDefault()来阻止窗口关闭。 electronjs.org/docs/latest/api/browser-window#event-close我正在尝试在我自己的代码中重新创建此功能。 -
这是一个电子 API,而不是一个节点 API。你是在 NodeJS 还是 Electron 工作?
-
对于这种特定情况,它将是节点。
-
NodeJS 事件不是这样工作的。 see the docs - 你必须发出一个事件然后传递参数:
something.emit('eventName',arg1,arg2,arg3)。没有为回调提供名为event的对象,只有在发出该事件时传递的参数。
标签: javascript node.js typescript preventdefault