Перенаправить все события с одного объекта на другой

1

В настоящее время я пытаюсь написать небольшой движок для холста в vanilla javascript, в моей нынешней ментальной модели того, как он будет работать, пользователь будет создавать экземпляр класса Scene, который будет содержать все объекты, которые будут отображаться, а также их поведение. Будет только одна активная сцена за время на холст, так что сцены, которые в настоящее время не загружены, неактивны. Таким образом, я хотел бы иметь возможность перенаправлять все события, отправленные на холст, в текущую активную сцену. Это будет выглядеть примерно так:

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

но, очевидно, это не сработает.

Есть интересный ответ на аналогичный вопрос: слушайте все события в JavaScript

это что-то похожее на итерацию по всем свойствам окна и регистрацию прослушивателя событий для всех свойств, начинающихся с "on".

Проблема в том, что это не будет отслеживать пользовательские события, и я бы хотел, чтобы пользователь мог взаимодействовать со своими сценами с помощью настраиваемых событий, отправленных из других мест (например, кнопка над холстом для сброса текущего уровня могла отправить "сброс" ' событие).

Альтернативами будут:

  1. пользователь вызывает пользовательскую функцию на холсте, которая затем вызывает соответствующую функцию в текущей активной сцене
  2. Пользователь отправляет настраиваемое событие, как я думал, но также должен добавить прослушиватель событий для этого типа события и перенаправить событие на активную сцену вручную (или я предоставляю функцию для регистрации настраиваемого события и перенаправления событий этого типа на активная сцена)

Во всех этих случаях это двухэтапный процесс для пользователя. Я предполагаю, что регистрация всех пользовательских событий один раз в начале программы не будет такой плохой, но мне было интересно, существует ли более элегантное решение.

  • 0
    У каждой сцены может быть свой холст. Показать холст активной сцены, скрыть все остальные.
  • 0
    @ChrisG Я не понимаю, как это решит мою проблему в любом качестве. Это просто переместит проблему, мне нужно будет иметь глобальный объект, который отслеживает активный холст, а не активную сцену (которые теперь являются синонимами) и отправляет события, которые он получает, на этот холст. Или отправьте событие на все полотна, и им придется проверить, активны ли они, прежде чем обрабатывать событие.
Показать ещё 2 комментария
Теги:

1 ответ

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(). Теоретически это должно перенаправить все события, запущенные на объект (который в моем случае был бы холстом) на другой (активная сцена).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню