2012-10-14 3 views
38

키보드 및 마우스 입력에 응답하는 캔버스 앱을 만들려고합니다. 이 코드를 가지고 :캔버스의 keydown에 대한 addEventListener

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

마우스를 클릭 할 때마다 'mousedown'경고가 나타나지만 'keydown'경고가 나타나지 않습니다. 동일한 코드가 JS Bin에서 잘 작동합니다. http://jsbin.com/uteha3/66/

내 페이지에서 작동하지 않는 이유는 무엇입니까? 캔버스가 키보드 입력을 인식하지 못합니까?

+4

당신은 '수 캔버스 요소에 초점을 맞 춥니 다. –

+3

'keydown'은 아마도 포커스가있는 경우에만 캔버스에서만 실행됩니다. 캔버스 요소가 전혀 포커스를 가질 수 있는지 확실하지 않습니다. –

답변

47

편집 -이 답변 해결책이지만, (hobberwickey에 의해 제안) 훨씬 간단하고 적절한 방법은 캔버스 요소에 tabindex 속성을 설정 될 것이다.

캔버스 요소를 포커스 할 수 없습니다. 이것에 대한 간단한 작업은 "자신의"초점을 맞추는 것입니다.

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

+1

은 매력처럼 작동합니다 ... 최고의 솔루션을위한 고마워. –

+1

이전 답변이지만 이전에 캔버스에 tabindex = ""과 presto : 캔버스 (실제로는 * 모든 HTML 요소)가 포커스로 잘 작동하도록해야합니다. 이 대답은 올바른 것으로 표시되어서는 안되며 대신 호버위키의 대답이 받아 들여집니다. –

+0

나는 당신의 의견에 동의하지만, 어떠한 이유에서든지 @Cbas는 결코 hobberwickeys의 대답을 받아 들일 수 없다. 나는 미래의 방문자가이 문제를 해결할 수 있도록 내 게시물을 업데이트했습니다. –

86

그것은 포커스 모든 요소를 ​​만들기 위해 오래된 트릭이

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

처럼 1 또는 뭔가 캔버스 요소의 tabIndex를 설정

+1

그게 너무 작동합니다. – Cbas

+0

적어도 최신 크롬에서는 작동하지 않습니다. –

+5

내가 너에게 백만 달러를 걸 겠어. http://jsfiddle.net/WJhGr/1/ – hobberwickey