Mã khóa nào cho khóa thoát với jQuery


559

Tôi có hai chức năng. Khi nhấn Enter, các chức năng sẽ chạy chính xác nhưng khi nhấn thoát thì không. Số chính xác cho khóa thoát là gì?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});

Phím nhấn sẽ trả về một ký tự được kết nối với một phím (trong các nắp chính xác, v.v.), Keyup sẽ trả về số lượng nút phần cứng được nhấn. Đối với ESC, bạn muốn có mã phần cứng 27 (không phải ký tự ascii 27)
Joeri


Có một mẹo thực sự đơn giản để tìm ra keyCode nào bạn muốn. Chỉ cần mở một tab mới, đặt document.addEventListener("keydown", e => console.log(e.keyCode))vào bảng điều khiển trình duyệt của bạn, nhấp vào cửa sổ và nhấn phím bạn đang tìm kiếm.
vô chính phủ912

Câu trả lời:


926

Thử với sự kiện keyup :

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});

39
Điều này không có gì để làm với keyup so với keypress. Để chụp ESCAPE, bạn cần xem e.keyCode trái ngược với e.which (ví dụ này xảy ra để làm).
dk vitamin

211
"Điều này không liên quan gì đến keyup so với keypress" - điều đó không chính xác, dk vitamin. keypress dường như không được xử lý một cách nhất quán giữa các trình duyệt (thử bản demo tại api.jquery.com/keypress trong IE vs Chrome vs Firefox - đôi khi nó không đăng ký và cả 'mà' và 'keyCode' khác nhau) trong khi keyup là phù hợp. e.which là giá trị chuẩn hóa jquery, vì vậy 'which' hoặc 'keyCode' nên hoạt động trong keyup.
Jordan B thông qua

13
@Jordan Brough - Tôi muốn yêu cầu bạn gửi bình luận của bạn dưới dạng câu trả lời để mọi người đọc nó và hiểu ý nghĩa thực sự của bình luận của bạn! vì nhận xét của bạn cũng quan trọng như câu trả lời giải thích
Murtaza

15
keydownsẽ bắt chước hành vi gốc - ít nhất là trên Windows khi nhấn ESC hoặc Return trong hộp thoại sẽ kích hoạt hành động trước khi khóa được phát hành.
thomthom

2
@gibberish Tôi đã thêm nhận xét của mình dưới dạng câu trả lời tại đây: stackoverflow.com/a/28502629/58876
Jordan Brough

77

Thay vì mã hóa các giá trị mã khóa trong hàm của bạn, hãy xem xét sử dụng các hằng số được đặt tên để truyền đạt ý nghĩa của bạn tốt hơn:

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});

Một số trình duyệt (như FireFox, không chắc chắn về các trình duyệt khác) xác định một KeyEventđối tượng toàn cầu hiển thị các loại hằng này cho bạn. Câu hỏi SO này cũng cho thấy một cách hay để xác định đối tượng đó trong các trình duyệt khác.


15
Cái gì, 27 không chỉ nhảy vào bạn là chìa khóa thoát?!? Thành thật mà nói, điều này thực sự cần phải được thực hiện bởi nhiều người hơn. Tôi gọi chúng là "số ma thuật" và "chuỗi ma thuật". 72 có nghĩa là gì? Tại sao bạn có một chuỗi sao chép rất cụ thể và dễ bay hơi được dán 300 lần trong cơ sở mã của bạn? v.v.
vbullinger

1
Hoặc bạn chỉ có thể thêm một nhận xét ở trên mỗi bình luận, vì có khả năng bạn chỉ sử dụng chúng một lần. IMO thật dễ đọc
Ivan Durst

8
@IvanDurst bạn chỉ có thể sử dụng chúng một lần cho mỗi phương thức , nhưng tôi sử dụng chúng nhiều lần trong (các) dự án của tôi. Bạn có thực sự gợi ý rằng bạn muốn (1) tra cứu các giá trị và (2) nhận xét chúng mỗi khi bạn muốn sử dụng mã khóa? Tôi không biết về bạn, nhưng tôi không muốn ghi nhớ chúng cũng như không tin rằng các lập trình viên khác sẽ bình luận chúng một cách nhất quán. Đó là về việc làm cho mã hóa dễ dàng hơn và nhất quán hơn, không chỉ dễ đọc hơn.
Seth Petry-Johnson

2
Một người biết ý nghĩa của chúng không phải tìm kiếm ý nghĩa để bình luận chúng, và gõ một bình luận cũng nhanh như gõ một tên dài.
NetMage

6
Bất cứ điều gì đã xảy ra với những ngày xưa tốt đẹp khi chúng ta thường mã hóa các hằng ký tự trong hex? Mọi người đều biết ESC là 0x1Bvà Enter 0x0D, phải không?
David R Tribble

42

(Câu trả lời trích từ nhận xét trước của tôi )

Bạn cần sử dụng keyupchứ không phải keypress. ví dụ:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

keypressdường như không được xử lý một cách nhất quán giữa các trình duyệt (thử bản demo tại http://api.jquery.com/keypress trong IE vs Chrome vs Firefox. Đôi khi keypress, không đăng ký và các giá trị cho cả 'which' và ' keyCode 'khác nhau) trong khi đó keyuplà nhất quán.

Vì đã có một số cuộc thảo luận về e.whichvs e.keyCode: Lưu ý rằng đó e.whichlà giá trị chuẩn hóa của jquery và là giá trị được đề xuất để sử dụng:

Thuộc tính event.which bình thường hóa event.keyCode và event.charCode. Bạn nên xem event.which để nhập phím bàn phím.

(từ http://api.jquery.com/event.which/ )


5
Tôi cũng muốn thêm vào đây rằng các trình duyệt không keypresschạy trốn đang làm điều đó đúng. keypresschỉ có nghĩa là bắn khi khóa tạo ra một nhân vật trong khi keyupluôn luôn bắn. developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi 22/03/2016

26

Để tìm mã khóa cho bất kỳ khóa nào, hãy sử dụng chức năng đơn giản này:

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}

14

27là mã cho khóa thoát. :)


1
Tôi có hai hàm khi nhấn là nhấn các hàm chạy đúng nhưng không có phím thoát .. $ (tài liệu) .keypress (hàm (e) {if (e.which == 13) {$ ('. Save'). Click ();} if (e.which == 27) {$ ('. hủy'). click ();}});
Shishant

$ (tài liệu) .keypress (hàm (e) {y = e.keyCode? e.keyCode: e.which;}); Khi tôi cảnh báo (y), nó sẽ cảnh báo 27 trong IE và FF. Bạn có chắc chắn không có gì khác với mã của bạn?
Mặn

14

Đặt cược tốt nhất của bạn là

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

Tóm lược

  • whichđược ưa thích hơn là keyCodevì nó được chuẩn hóa
  • keyupđược ưa thích hơn keydownvì phím tắt có thể xảy ra nhiều lần nếu người dùng nhấn nó.
  • Không sử dụng keypresstrừ khi bạn muốn chụp các ký tự thực tế.

Thật thú vị Bootstrap sử dụng keydown và keyCode trong thành phần thả xuống của nó (kể từ 3.0.2)! Tôi nghĩ rằng đó có thể là sự lựa chọn nghèo nàn ở đó.

Đoạn mã liên quan từ tài liệu JQuery

Trong khi các trình duyệt sử dụng các thuộc tính khác nhau để lưu trữ thông tin này, jQuery bình thường hóa thuộc tính .which để bạn có thể sử dụng nó một cách đáng tin cậy để lấy mã khóa. Mã này tương ứng với một phím trên bàn phím, bao gồm mã cho các phím đặc biệt như mũi tên. Để bắt mục nhập văn bản thực tế, .keypress () có thể là lựa chọn tốt hơn.

Mục quan tâm khác: Thư viện phím JavaScript


10

Hãy thử plugin jEscape ( tải xuống từ ổ đĩa google )

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

hoặc lấy mã khóa cho trình duyệt chéo

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

có lẽ bạn có thể sử dụng chuyển đổi

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}

8

Mã của bạn hoạt động tốt. Rất có thể cửa sổ không tập trung. Tôi sử dụng một chức năng tương tự để đóng hộp iframe, v.v.

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});

8

Tôi đang cố gắng làm điều tương tự và nó đã làm tôi thất vọng. Trong firefox, có vẻ như nếu bạn cố gắng thực hiện một số điều khi nhấn phím thoát, nó sẽ tiếp tục xử lý phím thoát và sau đó hủy bỏ mọi thứ bạn đang cố gắng làm. Cảnh báo hoạt động tốt. Nhưng trong trường hợp của tôi, tôi muốn quay lại lịch sử không hoạt động. Cuối cùng đã tìm ra rằng tôi phải buộc việc truyền bá sự kiện phải dừng lại như hình dưới đây ...

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}

8

Để giải thích những câu trả lời khác chưa có; vấn đề là bạn sử dụng keypress.

Có lẽ sự kiện chỉ được đặt tên sai nhưng keypressđược xác định để bắn khi . Tức là văn bản. Trong khi những gì bạn muốn là / , sẽ kích hoạt bất cứ khi nào (trước hoặc sau, tương ứng) . Tức là những thứ đó trên bàn phím.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

Sự khác biệt xuất hiện ở đây vì esclà một ký tự điều khiển (nghĩa đen là ' ký tự không in') và do đó không viết bất kỳ văn bản nào, do đó thậm chí không bắn keypress.
enterlà lạ, bởi vì mặc dù bạn đang sử dụng nó làm ký tự điều khiển (tức là để điều khiển UI), nó vẫn đang chèn một ký tự dòng mới, sẽ kích hoạt keypress.

Nguồn: quirksmode


1
Kudos để đọc thông số kỹ thuật! Đây chắc chắn là câu trả lời được chấp nhận :)
DylanYoung

7

Để lấy mã hex cho tất cả các ký tự: http://asciitable.com/


2
Tôi sẽ nói ..... Tôi ghét rằng trang web này đứng đầu trong các kết quả tìm kiếm bởi vì nó rất xấu, nhưng nó truyền tải thông tin cần thiết.
mpen

1
Lưu ý rằng tùy thuộc vào sự kiện và trình duyệt, mã khóa không phải lúc nào cũng khớp với bảng ascii.
Alan H.

2
downvote: không trả lời câu hỏi, thậm chí không trả lời câu hỏi, hex không liên quan gì đến câu hỏi và OP đã thể hiện kiến ​​thức về esc == 27.
Jeremy

7

Chỉ cần đăng một câu trả lời cập nhật hơn e.keyCodeđược coi là ĐỔI trên MDN .

Thay vào đó, bạn nên chọn e.keythay vì hỗ trợ tên sạch cho mọi thứ. Đây là mì ống sao chép có liên quan

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);

3
Nhưng dường như nó chỉ được hỗ trợ trong Firefox và Chrome.
Gayan Weerakutti


Thật không may, ít nhất một số phiên bản Internet Explorer vượt qua mã Escchứ không phải tiêu chuẩn Escape.
Robin Stewart

6

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('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

hotkeys hiểu được bổ như sau: , shiftoptionaltctrlcontrolcommand, và .

Các phím đặc biệt sau đây có thể được sử dụng cho các phím tắt: backspacetab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, deletef1thông qua f19.


5

Tôi đã luôn sử dụng keyup và e.which để bắt key thoát.


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.