У меня есть HTML-страница, примерно разделенная на 30% - 70% на две вертикальные колонки. Левый столбец содержит канал чата (обрабатывается через Node и Socket.io), а правый столбец содержит созданный emscripten canvas
(с идентификатором canvas
). Холст содержит базовый трехмерный мир, по которому пользователь может перемещаться, используя стандартные элементы управления от первого лица (WASD для движения, мышь для «взгляда»).
По умолчанию холст поглощает все события клавиатуры. Я исправил это с помощью следующего кода в процедуре инициализации холста:
Module.preRun.push(function () {
ENV.SDL_EMSCRIPTEN_KEYBOARD_ELEMENT = "#canvas";
});
Это позволяет мне вручную сосредоточиться на окне чата, набрать сообщение и отправить его.
Проблема, с которой я сталкиваюсь, заключается в том, что после отправки сообщения чата я пытаюсь вернуть фокус на холст с помощью следующего кода (чтобы позволить игрокам перемещаться по трехмерному миру с помощью WASD):
$('#canvas').focus();
Это номинально возвращает фокус холсту, но движение мыши и клавиатуры не работает. Как ни странно, нажатие на вкладку / окно браузера, а затем на холст, кажется, работает - фокус возвращается на холст, и я могу перемещаться еще раз. Ручной вызов $(window).blur().focus()
не помогает.
Кто-нибудь знает, как вернуть фокус обратно на холст после отправки сообщения чата?
- ОБНОВЛЕНИЕ -
Я добавил поле ввода текста (с идентификатором hiddenField
) за холстом, и я использую функцию preRun, чтобы назначить ключевые события холста этому полю (холст по какой-то причине работал некорректно).
Это работает нормально до, пока пользователь не щелкнет холст, например, в поле чата, после чего холст перестает реагировать на любой ввод с клавиатуры или мыши, даже если я снова переключаю фокус на hiddenField
( и видно, что он это получает).
Кажется, что выполнение чего-либо на странице конфликтует с поведением фокусировки emscripten (я полагаю, привязанным к объекту окна) и не позволяет холсту восстановить фокус.
Конечно, есть способ разрешить холсту emscripten жить вместе с другими элементами HTML?