【问题标题】:Custom prevent default in NodeJSNodeJS中的自定义阻止默认值
【发布时间】: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


【解决方案1】:

问题是,发射器似乎没有办法检查 preventDefault() 是否已被调用,因为 defaultPrevented 是事件的属性而不是发射器,因此发射器无法读取.

您根本没有发出事件对象,因此没有方法和属性。但是,您可以通过创建这样的对象轻松模拟DOM dispatchEvent method:

class MyClass extends EventEmitter{
    close(winID:number): void {
        const event = {
            defaultPrevented: false,
            preventDefault(): void {
                this.defautPrevented = true;
            },
        };
        this.emit('will-quit', event);
        if (!event.defaultPrevented) {
            app.close(winID);
        }
    }
}

无需自己安装事件监听器。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 2015-08-18
    • 2018-08-23
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多