将所有事件从一个对象重定向到另一个

时间:2018-10-29 08:17:23

标签: javascript

我目前正在尝试使用香草javascript编写画布的小型游戏引擎,在我目前的工作原理心理模型中,用户将实例化一个Scene类,该类将包含所有要渲染的对象以及他们的行为。每个画布一次只能有一个活动场景,因此当前未加载的场景是非活动的。因此,我希望能够将调度到画布的所有事件重定向到当前活动的场景。看起来像这样:

canvas.addEventListener(/* all */, (e) => activeScene.dispatchEvent(e));

但是显然这是行不通的。

这里有一个类似问题的有趣答案:NetCDF: How to mask/filter out non-land values in global dataset, preferably using Python and/or NCO?

这涉及遍历所有窗口属性并为以“ on”开头的所有属性注册事件监听器的过程。

问题是,这不会捕获自定义事件,并且我想使用户能够使用从其他位置发送的自定义事件与他们的场景进行互动(例如,画布上方的用于重置当前关卡的按钮可以发送一个“重置”事件)。

替代方法是:

  1. 用户在画布上调用自定义函数,然后在当前活动的场景上调用相应的函数
  2. 用户按照我的想法调度了一个自定义事件,但是还必须为该事件类型添加一个事件侦听器,然后将事件手动重定向到活动场景(或者我提供了一个功能来注册自定义事件并重定向该事件输入活动场景)

在所有这些情况下,对于用户来说,这都是一个两步过程。我猜想在程序开始时注册一次所有自定义事件并没有那么糟糕,但是我想知道是否存在一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

好的,经过一番修补后,我想到了解决方案:

我使用带有此代码的eventListeners重定向所有标准事件

for(let key in myObj){
    if(key.startsWith('on')) {
       myObj.addEventListener(key.slice(2), (e) => {otherObj.dispatchEvent(e)});
    }
}

并且我覆盖了默认的dispatchEvent()方法,以便所有手动触发的事件都被重定向,无论它们的类型如何:

myObj.dispatchEvent = (e) => {otherObj.dispatchEvent(e)};

不幸的是,第一部分是必需的,因为没有通过dispatchEvent()方法触发标准事件。从理论上讲,这应该将在对象(在我的情况下为画布)上触发的所有事件重定向到另一个(活动场景)。