javascript - Emscripten canvas + jQuery - 切换焦点

标签 javascript jquery canvas emscripten

我有一个 HTML 页面,大致将 30% - 70% 分为两个垂直列。左列包含聊天提要(通过 Node 和 Socket.io 处理),右列包含 emscripten 生成的 canvas(ID 为 canvas)。 Canvas 包含一个基本的 3D 世界,用户可以使用标准的第一人称控件(WASD 用于移动,鼠标用于“看”)进行导航。

默认情况下, Canvas 会吞下所有键盘事件。我在 Canvas 初始化过程中使用以下代码解决了这个问题:

Module.preRun.push(function () {
    ENV.SDL_EMSCRIPTEN_KEYBOARD_ELEMENT = "#canvas";
});

这让我可以手动关注聊天框、输入消息并提交。

我遇到的问题是,在提交聊天消息后,我尝试使用以下代码将焦点返回到 Canvas (以允许玩家使用 WASD 导航 3d 世界):

 $('#canvas').focus();

这名义上将焦点返回到 Canvas ,但鼠标和键盘移动不起作用。奇怪的是,单击选项卡/浏览器窗口然后进入 Canvas 似乎可行 - 焦点返回到 Canvas ,我可以再次导航。手动调用 $(window).blur().focus() 不起作用。

有谁知道发送聊天消息后如何将焦点强制返回 Canvas ?

-- 更新--

我在 Canvas 后面添加了一个文本输入字段(ID 为 hiddenField),我正在使用 preRun 函数将 Canvas 的关键事件分配给该字段( Canvas 不是' t 由于某种原因一直工作)。

这工作正常直到用户点击离开 Canvas - 例如,进入聊天字段 - 于是 Canvas 停止响应任何键盘或鼠标输入,即使我触发焦点回到hiddenField(并且可以看到它正在获取它)。

似乎在页面上做任何都与 emscripten 的聚焦行为(我相信是绑定(bind)到窗口对象)冲突并阻止 Canvas 重新获得焦点。

肯定有某种方法可以让 emscripten Canvas 与其他 HTML 元素共存吗?

最佳答案

您需要通过添加 tabindex="0" 属性使 canvas 对象可聚焦。

那么应该可以正常触发focus事件了:

document.querySelector("#canvas").focus()

关于javascript - Emscripten canvas + jQuery - 切换焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45936800/

相关文章:

javascript - 使用 Chart.js 在同一页面中显示多个响应式图表

javascript - 如何验证用户编写的PGP公钥?

javascript - 如何更改 Vuetify 数据表中的标签 "Sort by"?

javascript - 在 JS 代码 (Jquery) 中连接 '

javascript - 如何将不透明度应用于非事件 slider 元素?

JavaScript代码解释(事件+ Canvas )[sigma.js]

javascript - Kendo Grid 自定义命令按钮动态显示

javascript - jQuery.fn - 为什么这不起作用?

jquery - 从 ColdFusion 调用 jQuery

javascript - 如何在 d3.js 中显示 y 轴