【发布时间】:2017-08-29 10:30:48
【问题描述】:
我有一个 HTML 页面,大致将 30% - 70% 分成两个垂直列。左列包含聊天提要(通过 Node 和 Socket.io 处理),右列包含 emscripten 生成的canvas(ID 为canvas)。画布包含一个基本的 3D 世界,用户可以使用标准的第一人称控件(WASD 用于移动,鼠标用于“查看”)进行导航。
默认情况下,画布会吞下所有键盘事件。我在画布初始化过程中使用以下代码解决了这个问题:
Module.preRun.push(function () {
ENV.SDL_EMSCRIPTEN_KEYBOARD_ELEMENT = "#canvas";
});
这让我可以手动关注聊天框,输入消息并提交。
我遇到的问题是,一旦提交了聊天消息,我尝试使用以下代码将焦点返回到画布(以允许玩家使用 WASD 导航 3d 世界):
$('#canvas').focus();
名义上这会将焦点返回到画布,但鼠标和键盘移动不起作用。奇怪的是,单击选项卡/浏览器窗口然后进入画布似乎工作 - 焦点返回到画布,我可以再次导航。手动调用 $(window).blur().focus() 是不行的。
有谁知道一旦发送了聊天消息,如何将焦点强制回到画布上?
-- 更新--
我在画布后面添加了一个文本输入字段(ID 为hiddenField),并且我正在使用 preRun 函数将画布的关键事件分配给该字段(画布在某些情况下无法始终如一地工作原因)。
这工作正常直到用户点击画布 - 例如,进入聊天字段 - 然后画布停止响应任何键盘或鼠标输入,即使我触发焦点回到hiddenField(并且可以看到它正在获取它)。
似乎在页面上执行任何操作与 emscripten 的聚焦行为(我相信与窗口对象绑定)冲突,并阻止画布重新获得焦点。
肯定有某种方法可以让 emscripten 画布与其他 HTML 元素一起存在吗?
【问题讨论】:
标签: javascript jquery canvas emscripten