2013-09-21 32 views
8

Sự kiện mousemove hoạt động và gọi trênMouseMove mỗi khi tôi di chuyển trên canvas. Mặc dù, các sự kiện keydown và keyup không bao giờ hoạt động. Tôi nhấp vào canvas và nhấn một số phím, nhưng không có sự kiện nào được kích hoạt. Có ai biết tại sao các sự kiện không hoạt động? Cảm ơn vì bất cứ lời khuyên nào! Tôi đang theo dõi khóa học html5 trên udacity nếu có ai đó tò mò về mã nguồn xuất phát từ đâu.Trình nghe sự kiện 'keydown' của Javascript không hoạt động

InputEngineClass = Class.extend({ 

keyState: new Array(), 

setup: function() { 
    document.getElementById("gameCanvas").addEventListener('mousemove', gInputEngine.onMouseMove); 
    document.getElementById("gameCanvas").addEventListener('keydown', gInputEngine.onKeyDown); 
    document.getElementById("gameCanvas").addEventListener('keyup', gInputEngine.onKeyUp); 
}, 

onMouseMove: function (event) { 
    console.log("Called onMouseMove"); 
    var posx = event.clientX; 
    var posy = event.clientY; 
}, 

onKeyDown: function (event) { 
    console.log("KEY DOWN!!!"); 
    keyState[event.keyID] = true; 
    gInputEngine.update(); 
}, 

onKeyUp: function (event) { 
    console.log("KEY UP!!!"); 
    keyState[event.keyID] = true; 
}, 

update: function() { 
    KeyW = 87; 

    if(gInputEngine.keyState[KeyW]) console.log("FORWARD!!!"); 
} 
}); 

gInputEngine = new InputEngineClass(); 
+1

gì loại đối tượng là 'gameCanvas'? Nếu nó không bao giờ lấy tiêu điểm bàn phím (hoặc có trẻ em lấy tiêu điểm), thì nó sẽ không nhận được sự kiện bàn phím. Một đối tượng trước tiên phải lấy tiêu điểm bàn phím trước khi các sự kiện bàn phím được gửi đến nó. – jfriend00

+0

Nó là một canvas tạo như thế này: 'body = document.getElementById ("cơ thể"); ' ' canvas = document.createElement ("vải");' 'canvas.setAttribute ("id", " trò chơiCanvas ");' 'canvas.width = window.innerWidth;' 'canvas.height = window.innerHeight;' 'body.appendChild (canvas);' – user1668814

+0

Cảm ơn bạn @ jfriend00 Tôi googled tập trung vào bàn phím và xác định rằng tôi cần thiết để thêm ảnh này vào canvas của tôi: 'canvas.setAttribute (" tabindex ", 0);' – user1668814

Trả lời

17

Tôi sẽ chuyển nhận xét của tôi thành câu trả lời để bạn có thể kết thúc câu hỏi này.

Đối với đối tượng DOM để nhận sự kiện bàn phím, trước tiên họ phải có khả năng lấy tiêu điểm bàn phím trên một trang. Chỉ khi đó các sự kiện bàn phím sẽ được chuyển hướng đến đối tượng đó. Cách đơn giản nhất để làm điều đó cho một đối tượng canvas là cung cấp cho nó một thuộc tính tabIndex.

canvas.setAttribute("tabindex", 0); 

Bạn có thể xem tóm tắt của người khác về vấn đề đó ở đây: http://www.dbp-consulting.com/tutorials/canvas/CanvasKeyEvents.html