Tôi không nghĩ rằng bạn có thể thêm trình xử lý sự kiện bàn phím trực tiếp vào canvas. Nếu bạn không muốn đăng ký trình xử lý sự kiện ở mức cửa sổ thì tôi nghĩ bạn có thể quấn khung bên trong một div và đăng ký các sự kiện bàn phím trên 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!");
});
Một cách thú vị khác là sử dụng tabIndex trên thẻ canvas và nhấn phím trên canvas. Tôi đã cập nhật mã tại jsfiddle, dán ở đây cũng để tham khảo trong tương lai.
<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();
Nguồn
2011-09-30 17:22:19
Lúc đầu, điều này không hiệu quả đối với tôi, nhưng khi tôi nhấp chuột vào div/canvas, nó sẽ kích hoạt. Tôi đoán đó là vấn đề trọng tâm. Chỉnh sửa - yep, [câu trả lời này] (http://stackoverflow.com/a/57332/78409) giải thích cách tập trung canvas. –