2011-08-23 11 views
5

Tôi có chức năng javascript chạy khi nhấn phím 'xuống'. Tôi muốn, nếu phím 'xuống' được giữ, chức năng sẽ không chạy chút nào.Phân biệt giữa phím bấm và phím được giữ

Tôi đã nghĩ về thời gian giữa khóa phím và thời gian chờ, nếu thời gian nhỏ hơn 1 giây thì chức năng sẽ chạy trên khóa. Vấn đề là, nếu tôi giữ phím xuống trình duyệt thấy nó là chìa khóa được nhấn nhiều lần liên tiếp.

Có cách nào tốt hơn để thực hiện việc này không?

Cảm ơn

+1

Ngữ cảnh là gì?Nếu bạn đang ở trong một hộp văn bản, nó sẽ có ý nghĩa để theo dõi giá trị của đầu vào trước khi nhấn phím cuối cùng, sau đó kiểm tra xem liệu nhiều ký tự đã được thêm vào sự kiện quan trọng tiếp theo? Chỉ cần câu cá xung quanh ... – Guttsy

+1

Bạn có thể đặt cờ (ví dụ: biến boolean) khi sự kiện '' keydown'' đầu tiên kích hoạt (nhưng không phải nếu nó đã được đặt) và không đặt nó khi '' keyup'' kích hoạt? –

Trả lời

1

Nếu tôi hiểu vấn đề của bạn là trình duyệt của bạn giải thích một chìa khóa được tổ chức như nhiều sự kiện KeyDown. Bạn muốn điều gì đó khác xảy ra nếu khóa được giữ khi nó được nhấn đơn giản; và bạn muốn sự khác biệt đó được dựa trên một số thời gian mà bạn nghĩ rằng nên tạo thành "giữ" chìa khóa. Vì vậy, bạn cần phân biệt giữa giữ và nhấn bằng cách theo dõi sự kiện khóa. Giả sau đây sẽ giải quyết vấn đề này:

On KeyDown:

if !yourBool 
    start timer 

yourBool = true 

trên KeyUp:

if timer < yourTime 
    do something 

yourBool = false 

này sẽ làm việc vì bộ đếm thời gian sẽ không khởi động lại trừ khi KeyUp sự kiện đã xảy ra.

Bây giờ ... nếu trình duyệt của bạn giải thích nắm giữ chìa khóa như:
KeyDown, KeyUp, KeyDown, KeyUp .......
sau đó bạn có một vấn đề với cách tiếp cận này.

0

Có lẽ bạn có thể kích hoạt bộ đếm khi nhấn phím và sau đó lắng nghe lần đăng nhập tiếp theo. Ngay sau khi truy cập đi qua năm giây, hoặc tuy nhiên nhiều thời gian bạn cho là, bạn có thể bắt đầu chức năng. Có lý?

0

Phím tắt kế tiếp sẽ không kích hoạt khóa, vì vậy có thể phân biệt giữa chúng.

http://jsfiddle.net/pimvdb/xMFGQ/

$('body').keydown(function() { 
    if(!$(this).data('timeDown')) { // if not pressed yet, save time 
     $(this).data('timeDown', +new Date); 
    } 
}).keyup(function() { 
    var diff = new Date - $(this).data('timeDown'); // time difference 
    if(diff < 1000) { // less than one second 
     alert(123); 
    } 
    $(this).data('timeDown', null); // reset time 
}); 
0

Trình duyệt nhìn thấy phím được nhấn nhiều lần nhưng sự kiện keydown chỉ xảy ra trên báo chí đầu tiên.

Điều bạn muốn là dành thời gian từ sự kiện keydown chứ không phải keypressed.

2

Tôi vừa viết tập lệnh nhỏ này phân biệt giữa một phím được nhấn và một phím nhấn xuống trong 200 mili giây. Có lẽ bạn có thể làm cho sử dụng nó:

document.onkeydown = function(e){ 
    var keycode = window.event ? window.event.keyCode : e.which; 
    if(keycode == 40){ 
     var timer = setTimeout(function(){ 
      alert('Down key held'); 
      document.onkeyup = function(){}; 
     }, 200); 
     document.onkeyup = function(){ 
      clearTimeout(timer); 
      alert('Down key pressed'); 
     } 
    } 
}; 

JSFiddle

0

Tôi đã có một vấn đề tương tự. Tôi muốn nắm bắt tất cả các sự kiện keydown "đầu tiên", nhưng bỏ qua các sự kiện liên tiếp nếu chúng là kết quả của một khóa được giữ lại. Không chắc chắn nếu đó là những gì bạn muốn, nhưng đây là một cách tiếp cận:

var repeat = false; 
el.addEventListener("keyup", function() { repeat = false; }); 
el.addEventListener("keydown", function() { 
    if (!repeat) { 
    // Run your code. 
    repeat = true; 
    } 
});