用于在 Canvas 上按下按键的 addEventListener

IT技术 javascript html canvas html5-canvas
2021-02-26 04:21:51

我正在尝试制作一个响应键盘和鼠标输入的画布应用程序。我有这个代码:

canvas = document.getElementById('canvas');
canvas.addEventListener('mousedown', function(event) {
    alert('mousedown');
        }, false);
canvas.addEventListener('keydown', function(event) {
    alert('keydown');
        }, false);

每当我单击鼠标时都会出现“鼠标按下”警报,但“键盘按下”警报永远不会出现。相同的代码在 JS Bin 上运行良好:http : //jsbin.com/uteha3/66/

为什么它在我的页面上不起作用?画布无法识别键盘输入吗?

4个回答

将画布元素的 tabindex 设置为 1 或类似的东西

<canvas tabindex='1'></canvas>

使任何元素可聚焦是一个古老的技巧

这对我有用,但我注意到将 tabindex 设置为 Safari 中画布的 1 沼泽性能。
2021-05-02 04:21:51
这是我将按键事件侦听器分配给 HTML5 画布的唯一方法。我正在做 Easeljs 舞台的东西。这不起作用:$('canvas').keypress( function(e) { ... }直到我在 HTML 中添加了 tabindex。非常感谢。唯一的缺点是画架,鼠标悬停事件失去焦点(例如,鼠标悬停时舞台元素的阴影)。
2021-05-16 04:21:51

编辑- 这个答案一个解决方案,但更简单和正确的方法是tabindex在画布元素上设置属性(如 hobberwickey 所建议的)。

您无法聚焦画布元素。解决此问题的一个简单方法是让您“自己”专注。

var lastDownTarget, canvas;
window.onload = function() {
    canvas = document.getElementById('canvas');

    document.addEventListener('mousedown', function(event) {
        lastDownTarget = event.target;
        alert('mousedown');
    }, false);

    document.addEventListener('keydown', function(event) {
        if(lastDownTarget == canvas) {
            alert('keydown');
        }
    }, false);
}

JSFIDDLE

我同意你的看法,但无论出于何种原因@Cbas 从未接受 hobberwickeys 的回答。我已经更新了我的帖子,供未来的访问者解决这个问题。
2021-04-17 04:21:51
旧答案,但即使在 2012 年,您也绝对可以:您需要给画布 atabindex="<some number>"和 presto:您的画布(但实际上是任何HTML 元素)现在可以在焦点上正常工作。这个答案不应该被标记为正确,而是接受 hobberwickey 的答案。
2021-05-07 04:21:51

将所有 js 代码封装在 window.onload 函数中。我有一个类似的问题。一切都在 javascript 中异步加载,因此某些部分的加载速度比其他部分快,包括您的浏览器。将所有代码放在 onload 函数中将确保在尝试执行之前,您的代码需要从浏览器中获取的所有内容都可以使用。

有时只需将画布的 tabindex 设置为“1”(或“0”)即可。但有时 - 它没有,出于某种奇怪的原因。

在我的情况下(ReactJS 应用程序,动态画布 el 创建和安装)我需要调用 canvasEl.focus() 来修复它。也许这与 React 有某种关系(我基于 KnockoutJS 的旧应用程序在没有 '..focus()' 的情况下工作)