2017-03-20 2 views
1

마우스 이벤트에 응답 할 수 있도록 addEventListener() 메서드를 여러 번 사용하는 HTML5 캔버스 객체가 있습니다. 내가 사용하는 라인은 다음과 같습니다HTML5 넣기 <canvas> 안에 <table>은 마우스 이벤트를 무효로합니다.

canvas.addEventListener("mousemove", this.checkMouseLocation.bind(this, this.inputs), false);

이 모든 작품 완벽하게, 너무 오래 캔버스 문서의 몸 안에 직접, 또는 사업부에있다. 그러나 테이블 안에서는 작동하지 않습니다. 캔버스가 배치되면 모든 마우스 이벤트가 중지되는 것처럼 보입니다.

Mouse event not being triggered on html5 canvas을 읽은 후 그 해결책을 시도하기로 결정했습니다. style="-webkit-transform: translate3d(0, 0, 0);" 속성을 내 캔버스에 추가했습니다. Firefox에서이 문제가 해결되었지만 Chrome에서는 여전히 마우스에 신경 쓰지 않습니다.

는 사람이 어떤 아이디어가 있습니까? 가장 좋은 추측은 마우스 좌표와 관련이 있다는 것입니다.하지만 어떻게 말할 수는 없습니다.

감사합니다.

+1

호기심에서 벗어났습니다 : 왜 '

'안에 ''요소가 있습니까? table 요소는 표 형식의 데이터를 나타내는 데 사용되며 캔버스 요소가 표 형식 데이터로 간주되는 상황은별로 없다고 생각합니다. –

+0

캔버스가 애니메이션 (이 경우 논리 게이트 (및 등))에 사용되고 있습니다. 여러 개가 있기 때문에 나는 그들 모두를 나란히 보여주고 싶었다. –

답변

1

나는 누가 나를 따라 오는지에 대한 답을 찾았습니다.

마우스 메시지가 완전히 이상한 것은 아니며 계속 발생했습니다. 그러나 마우스의 x와 y 좌표는 완전히 응답하지 않았습니다.

나는 다음과 같이 캔버스의 마우스의 위치에서 오프셋 빼서 내 마우스의 좌표를 계산했다 : 불행하게도

var x = event.pageX - canvas.offsetLeft; 
var y = event.pageY - canvas.offsetTop; 

, 이것은 신뢰할 수없는의 canvas 개체의 오프셋과 관련하여 항상하지 않기 때문에 문서 본문에. 테이블 안에있을 때 그들은 <td>에 상대적이었고 canvas은 내부에있었습니다. 따라서 좌표가 벗어나서 canvas 개체가 마우스에 완전히 응답하지 않는 것처럼 보입니다.

var rect = canvas.getBoundingClientRect(); 
var x = event.clientX - rect.left; 
var y = event.clientY - rect.top; 

이 신들 만 getBoundingClientRect() 기능이 얼마나 효율적으로 알고, 그리고 부동 소수점 오히려 좌표와 내가 다루고있어 것을 의미하기 때문에, 조금 kludgey 것 같다

나는이와 그 라인을 교체 정수 좌표보다. 그러나 내가 계산 한 x와 y는 정확하며 더 중요합니다.

다른 사람들에게 도움이되기를 바랍니다.

+0

성능이 현명하고, gBCR은 '.offsetLeft'와'.offsetTop'와 정확히 같아야합니다. 고정 된 속성처럼 보이는 래터라도 실제로 정확히 같은 방식으로 gBCR을 다시 계산합니다. (물론 DOMRect를 생성하고 있기 때문에 약간의 차이가있을 수 있지만 루프를 반복하지 않을 경우 걱정하지 않아도됩니다. – Kaiido

+0

Thanks @Kaiido. 좋은 출처를 가지고 있습니까? JavaScript 프로그램이 효율적인지 아닌지를 결정하는 방법에 대한 정보 기본 프로그래밍 방법 (예 : 복잡성 분석)을 제외하고는 항상이 사실을 알지 못합니다. –