Các phím mũi tên liên kết trong JS / jQuery


418

Làm cách nào để liên kết một hàm với các phím mũi tên trái và phải trong Javascript và / hoặc jQuery? Tôi đã xem xét plugin js-hotkey cho jQuery (bao bọc hàm liên kết tích hợp để thêm một đối số để nhận ra các khóa cụ thể), nhưng dường như nó không hỗ trợ các phím mũi tên.


Câu trả lời:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

Nếu bạn cần hỗ trợ IE8, hãy khởi động thân hàm như e = e || window.event; switch(e.which || e.keyCode) {.


(chỉnh sửa 2020)
Lưu ý rằng KeyboardEvent.whichhiện không được chấp nhận. Xem ví dụ này bằng cách sử dụngKeyboardEvent.key một giải pháp hiện đại hơn để phát hiện các phím mũi tên.


28
Bởi câu trả lời tốt nhất. Các cách sử dụng e.whichnhư jQuery khuyến nghị cho trình duyệt chéo, sử dụng e.preventDefault()thay vì return false( return falsetrên trình xử lý sự kiện jQuery kích hoạt cả hai e.preventDefault()e.stopPropagation(), điều thứ hai sẽ gây ra bất kỳ sự kiện nào được thêm vào sau đó vì sự kiện sẽ không lan truyền đến chúng) và tại cuối công tắc, sẽ trở lại mà không gọi e.preventDefault()nếu đó là bất kỳ phím nào khác ngoài phím được tìm để không cản trở việc sử dụng khóa khác và thay vào $.ui.keyCode.DOWNđó, nó so sánh với các số (NHIỀU nhanh hơn).
Jimbo Jonny

2
Nathan: có vẻ như không phải tất cả các mã khóa đều nhất quán giữa các trình duyệt, nhưng các phím mũi tên là một số trong số đó. Xem tại đây: stackoverflow.com/questions/5603195/
Mạnh

1
Tài khoản @MichaelScheper - 1) những con số thực sự kỳ diệu khi có bình luận ngay bên cạnh họ nói chính xác chúng là gì và 3) ... tiếp tục
Jimbo Jonny

2
... 3) khi truy cập vào $.ui.keyCode.DOWNbạn tìm kiếm $trong phạm vi từ vựng của bạn, không tìm thấy nó, đi lên một mức ... tìm kiếm $, lặp lại cho đến khi trong phạm vi toàn cầu, tìm thấy nó trên toàn cầu window, truy cập $vào cửa sổ, truy cập uitrên window.$, truy cập keyCodevào window.$.ui, truy cập DOWNvào window.$.ui.keyCodeđể có được giá trị nguyên thủy bạn muốn so sánh, sau đó làm so sánh thực tế của bạn. Cho dù tốc độ đó có quan trọng với bạn hay không là quyết định cá nhân, tôi chỉ có xu hướng tránh 4 cấp độ truy cập khi có tình huống tôi có thể dễ dàng viết / nhận xét nguyên thủy.
Jimbo Jonny

1
@NathanArthur Ở đây tôi đã tìm thấy hai công cụ trực tuyến tốt để kiểm tra mã khóa bàn phím: keycode.info asapes.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
Riccardo Volpe

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

Mã ký tự:

37 - trái

38 - lên

39 - phải

40 - xuống


4
Có bất kỳ mục đích cho sự trở lại?
Alex S

19
Nó dừng bất kỳ sự kiện keydown tiếp theo được nhấn.
s_hewitt

9
Shadow: không, anh ta có nghĩa là nó ngăn sự kiện keydown bắn vào các phần tử DOM khác
JasonWagger

3
Ngoại trừ 39 cũng là dấu nháy đơn, phải không?
Paul D. Chờ

25
Khi sử dụng jQuery, hãy sử dụng e.whichthay vì e.keyCodehỗ trợ nhiều trình duyệt hơn. Xem bình luận của tôi dưới đây.
Sygmoral

108

Bạn có thể sử dụng keyCode của các phím mũi tên (37, 38, 39 và 40 cho trái, lên, phải và xuống):

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

Kiểm tra ví dụ trên ở đây .


1
Tôi không chắc chắn về việc bạn sử dụng | | toán tử trong dòng 2. Không phải là một giá trị khác 0 hoặc không thực hiện cụ thể và không được bảo đảm? Tôi sẽ sử dụng một cái gì đó giống như: var keyCode = (e.keyCode? E.keyCode: e.which); +1 cho việc sử dụng đối tượng mũi tên để đặt tên cho các trường hợp có thể đọc được.
Mnebuerquo

6
Nếu bạn đang sử dụng jQuery, bạn không cần phải kiểm tra e.which: The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

Tôi đang cố gắng đặt một người nghe sự kiện quan trọng trên bàn, nhưng nó sẽ không hoạt động. Có một số lượng hạn chế các loại bộ chọn hỗ trợ người nghe sự kiện quan trọng không?
Arman Bimatov

23

Điều này hơi muộn, nhưng HotKeys có một lỗi rất lớn khiến các sự kiện được thực thi nhiều lần nếu bạn gắn nhiều hơn một phím nóng vào một phần tử. Chỉ cần sử dụng jQuery đơn giản.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
+1 để sử dụng đối tượng mã khóa ui. Dễ hiểu hơn nhiều so với 37, 38, 39 hoặc 40. Không chắc tại sao câu trả lời hàng đầu lại sử dụng e.keyCode khi tài liệu jQuery tuyên bố rõ ràng sử dụng e.which để giải thích cho sự khác biệt của trình duyệt. Hy vọng câu trả lời này được công nhận nhiều hơn để làm điều đó đúng.
Không có

2
Sử dụng $ .ui.keyCode.DOWN trên mỗi lần nhấn phím chậm hơn rất nhiều so với sử dụng số. Chỉ cần thêm một nhận xét nếu quan tâm về sự rõ ràng, đặc biệt là vì nó phải được chạy mỗi khi nhấn bất kỳ phím nào.
Jimbo Jonny

16

Tôi chỉ đơn giản là kết hợp các bit tốt nhất từ ​​các câu trả lời khác:

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
"Ui" đến từ đâu? Nhận EDIT "TypeError: $ .ui không xác định" - Tôi bị thiếu UI JQuery. Đã tải rồi - không còn lỗi nữa.
một lập trình viên

3
Anh ta rõ ràng cũng đang sử dụng jQuery UI phải có enum đó. Tôi sẽ không bao gồm giao diện người dùng jQuery chỉ vì điều đó, btw.
Jethro Larson

14

Bạn có thể sử dụng KeyboardJS. Tôi đã viết thư viện cho các nhiệm vụ như thế này.

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

Kiểm tra thư viện tại đây => http://robertwhurst.github.com/PalJS/


14

Một giải pháp ngắn gọn sử dụng Javascript đơn giản (nhờ Sygmoral cho các cải tiến được đề xuất):

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};

Xem thêm https://stackoverflow.com/a/17929007/1397061 .


Có lẽ cũng có giá trị ràng buộc thông quadocument.addEventListener('keydown', myFunction);
nathanbirrell 17/12/17

9

Bạn có chắc chắn jQuery.HotKeys không hỗ trợ các phím mũi tên? Tôi đã loay hoay với bản demo của họ trước đó và quan sát trái, phải, lên và xuống hoạt động khi tôi thử nghiệm nó trong IE7, Firefox 3.5.2 và Google Chrome 2.0.172 ...

EDIT : Dường như jquery.hotkeys đã được chuyển đến Github: https://github.com/jeresig/jquery.hotkeys


Tôi đã đọc nơi nó nói nó dựa trên một thư viện khác và cho rằng danh sách các khóa được hỗ trợ vẫn được áp dụng.
Alex S


4

Ví dụ về js thuần với việc đi phải hoặc trái

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

Bạn có thể sử dụng liên kết jQuery:

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

Bạn có thể kiểm tra thời tiết arrow keyđược nhấn bởi:

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

ngăn mũi tên chỉ khả dụng cho bất kỳ đối tượng nào khác CHỌN, thực ra tôi không biết về đối tượng khác LOL. nhưng nó có thể dừng sự kiện mũi tên trên trang và loại đầu vào.

tôi đã cố gắng chặn mũi tên trái và phải để thay đổi giá trị của đối tượng SELECT bằng cách sử dụng "e.preventDefault ()" hoặc "return false" trong sự kiện "kepress" "keydown" và "keyup" nhưng nó vẫn thay đổi giá trị đối tượng. nhưng sự kiện vẫn cho bạn biết rằng mũi tên đã được nhấn.


0

Một thư viện Javascript mạnh mẽ để chụp đầu vào bàn phím và các tổ hợp phím được nhập. Nó không có phụ thuộc.

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

Tôi đến đây để tìm kiếm một cách đơn giản để cho phép người dùng, khi tập trung vào một đầu vào, sử dụng các phím mũi tên để +1 hoặc -1 một đầu vào số. Tôi chưa bao giờ tìm thấy một câu trả lời hay nhưng làm cho đoạn mã sau có vẻ hoạt động tốt - làm cho trang này trở nên rộng khắp bây giờ.

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

Với cà phê & Jquery

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.