2012-04-22 70 views
9

Tôi đã tìm thấy rất nhiều câu hỏi liên quan (ở đây và ở nơi khác), nhưng chưa tìm thấy câu hỏi này một cách cụ thể.Javascript: Sự kiện Keydown: Phím mũi tên "Lên" ngăn chặn các phím mũi tên tiếp theo Các sự kiện quan trọng? (đã trả lời: bàn phím bóng mờ)

Tôi đang cố gắng nghe các sự kiện keydown cho các phím mũi tên (37-40), tuy nhiên khi sử dụng các phím mũi tên theo thứ tự nhất định, mũi tên tiếp theo không tạo ra các sự kiện "keydown".

Ví dụ: http://blog.pothoven.net/2008/05/keydown-vs-keypress-in-javascript.html

  1. Tại trang đó, nhấp vào "gõ vào đây ->" hộp.
  2. Bấm và giữ mũi tên bên phải chính: cập nhật bảng để keyCode 39
  3. Trong khi tiếp tục giữ phím mũi tên, bấm và giữ phím mũi tên lên: cập nhật bảng đến 38
  4. Trong khi tiếp tục giữ phím mũi tên bên phải và lên, bấm và giữ phím mũi tên trái: bảng không cập nhật

Tuy nhiên, nếu tôi làm điều tương tự nhưng sử dụng xuống phím mũi tên thay vì lên phím mũi tên sau đó nó hoạt động như mong đợi.

Ngoài ra, nếu tôi sử dụng bàn phím thay vì các phím mũi tên, nó hoạt động như mong đợi.

Tôi đang ngăn chặn hoạt động bình thường của sự kiện keydown (cả hai bằng cách trả về false trong trình xử lý sự kiện và bằng cách gọi preventDefault()), nhưng hành vi vẫn tồn tại.

Tôi nghĩ đó có thể là bàn phím của tôi, nhưng nó xảy ra trên máy tính xách tay cũng như máy của bạn bè.

Có ai có bất kỳ thông tin chi tiết nào về những gì đang diễn ra không? Hoặc một số ý tưởng hay về cách giải quyết?

[sửa] Đây là ví dụ về ý tôi. Tôi nhận ra điều này có thể không hoạt động trên tất cả các trình duyệt, nhưng tôi chỉ ném này với nhau trên máy tính xách tay của tôi để chứng minh những gì đang xảy ra đối với tôi (trên chrome trên w7 và cũng chrome & Safari trên mac os 10.6.8)

<html> 
<body> 
<script> 

var keysDown = {}; 
addEventListener("keydown", function(e) { 
    keysDown[e.keyCode] = true; 
    document.getElementById('latestKeydown').value=e.keyCode; 
}, false); 

addEventListener("keyup",function(e){ 
    delete keysDown[e.keyCode]; 
}, false); 

var loop = function(){ 
    document.getElementById('upinput').value=keysDown[38]; 
    document.getElementById('downinput').value=keysDown[40]; 
    document.getElementById('leftinput').value=keysDown[37]; 
    document.getElementById('rightinput').value=keysDown[39]; 
} 

setInterval(loop,1); 

</script> 
Up: <input id="upinput" type=text size=10><br /> 
Down: <input id="downinput" type=text size=10><br /> 
Left: <input id="leftinput" type=text size=10><br /> 
Right: <input id="rightinput" type=text size=10><br /> 
Recent Keydown: <input id="latestKeydown" type=text size=10><br /> 

</body> 
</html> 

Một lần nữa, vấn đề là: Nếu tôi giữ A, sau đó S, sau đó D, sau đó F, sau đó G, bạn có thể thấy "Keydown gần đây" cập nhật mỗi lần tôi bắt đầu giữ một khóa mới.

Tuy nhiên, nếu tôi giữ mũi tên phải, sau đó mũi tên lên, sau đó mũi tên trái, tôi không thấy cập nhật "Khóa gần đây" cho phím mũi tên trái.

+1

Đang đợi một số dòng mã. –

+0

Chào mừng bạn đến với Stack Overflow! –

+0

* "... PC có thể không hiểu nó do cách bàn phím có dây" * oO –

Trả lời

3

Tôi không thể nói về thẩm quyền về điều này, nhưng theo https://stackoverflow.com/a/4177260/562209, trừ khi bạn đang làm việc với đồng thời bấm một phím bổ trợ (s) và một phím không bổ trợ, liên quan đến nhiều phím bấm "PC có thể không hiểu nó do cách bàn phím có dây ".

+3

Đây là một lời giải thích tốt đẹp về vấn đề đó: http://www.microsoft.com/appliedsciences/antighostingexplained.mspx – user123444555621

+0

Gah :(Cảm ơn, folks, điều này có vẻ là thủ phạm có khả năng. – ElleryTheJones

Các vấn đề liên quan