【问题标题】:Attach keyboard events to html5 canvas将键盘事件附加到 html5 画布
【发布时间】:2011-09-30 16:38:04
【问题描述】:
看起来mouse events 可以将侦听器添加到canvas 元素,但keyboard events 似乎不适用于canvas 元素。
示例:
http://jsfiddle.net/H8Ese/1/
浏览器:
铬 14.0
FF 5.0.1
我知道我可以使用文档级侦听器,但我正在尝试首先获取 Canvas 元素(以便您的键盘在页面上的其他任何地方都可以使用)。
关于如何在画布元素上监听关键事件有什么想法吗?
【问题讨论】:
标签:
html5-canvas
dom-events
addeventlistener
【解决方案1】:
我认为您不能将键盘事件侦听器直接添加到画布。如果您不想在窗口级别注册事件处理程序,那么我认为您可以将画布包装在 div 中并在 div 上注册键盘事件。
<div id="canvasWrapper" style="border:1px solid; width:600px; height:400px;">
<canvas id="canvas" width="600" height="400" >
Could not create Canvas!
</canvas>
</div>
jQuery("#canvasWrapper").keypress(function(e){
keys[e.keyCode] = true;
alert("key pressed!");
});
另一种有趣的方法是在画布标签上使用 tabIndex 并在画布上绑定按键。我已经更新了 jsfiddle 的代码,也在这里粘贴以供将来参考。
<canvas id="my-canvas" tabindex="1"></canvas>
$("#my-canvas").bind({
keydown: function(e) {
var key = e.keyCode;
var elem=document.getElementById("my-canvas");
var context=elem.getContext("2d");
context.font = "bold 20px sans-serif";
context.clearRect(0,0,300,200);
context.fillText("key pressed " + key, 10,29);
},
focusin: function(e) {
$(e.currentTarget).addClass("selected");
},
focusout: function(e) {
$(e.currentTarget).removeClass("selected");
}
});
$("#my-canvas").focus();
【讨论】:
-
起初这对我不起作用,但是当我在 div/canvas 上单击鼠标时,它就会触发。估计是焦点问题。编辑 - 是的,this answer 解释了如何聚焦画布。