В настоящее время я пытаюсь написать небольшой движок для холста в vanilla javascript, в моей нынешней ментальной модели того, как он будет работать, пользователь будет создавать экземпляр класса Scene, который будет содержать все объекты, которые будут отображаться, а также их поведение. Будет только одна активная сцена за время на холст, так что сцены, которые в настоящее время не загружены, неактивны. Таким образом, я хотел бы иметь возможность перенаправлять все события, отправленные на холст, в текущую активную сцену. Это будет выглядеть примерно так:
canvas.addEventListener(/* all */, (e) => activeScene.dispatchEvent(e));
но, очевидно, это не сработает.
Есть интересный ответ на аналогичный вопрос: слушайте все события в JavaScript
это что-то похожее на итерацию по всем свойствам окна и регистрацию прослушивателя событий для всех свойств, начинающихся с "on".
Проблема в том, что это не будет отслеживать пользовательские события, и я бы хотел, чтобы пользователь мог взаимодействовать со своими сценами с помощью настраиваемых событий, отправленных из других мест (например, кнопка над холстом для сброса текущего уровня могла отправить "сброс" ' событие).
Альтернативами будут:
Во всех этих случаях это двухэтапный процесс для пользователя. Я предполагаю, что регистрация всех пользовательских событий один раз в начале программы не будет такой плохой, но мне было интересно, существует ли более элегантное решение.
Хорошо, после некоторого возиться здесь решение, которое я придумал:
Я перенаправляю все стандартные события, используя 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()
. Теоретически это должно перенаправить все события, запущенные на объект (который в моем случае был бы холстом) на другой (активная сцена).