Làm cách nào để phát hiện phím bấm thoát với JS hoặc jQuery thuần?


524

Có thể trùng lặp: Mã khóa
nào cho khóa thoát với jQuery

Làm cách nào để phát hiện phím bấm thoát trong IE, Firefox và Chrome? Mã bên dưới hoạt động trong IE và cảnh báo 27, nhưng trong Firefox nó cảnh báo0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});

1
làm một số trình duyệt phát hiện đầu tiên?
ina

7
Tôi thấy quirksmode.org luôn đáng tin cậy để tìm hiểu những gì hoạt động trong trình duyệt nào: quirksmode.org/js/keys.html . Ở đó bạn có thể thấy rằng chỉ keyuphoặc keydownkết hợp với keyCodehoạt động trong tất cả các trình duyệt.
Felix Kling

1
Tôi nghĩ tiêu đề của câu hỏi này phải là "Làm thế nào để phát hiện phím bấm thoát với jquery?" Hoặc câu trả lời phải có trong javascript gốc ...
Wilt

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Chúc mừng từ năm 2014
Kalle H. Väravas

Câu trả lời:


957

Lưu ý: keyCodeđang được sử dụng keythay thế.

function keyPress (e) {
    if(e.key === "Escape") {
        // write your logic here.
    }
}

Đây là jsfiddle


keyCode đang bị phản đối

Nó dường như keydownkeyuplàm việc, mặc dù keypresscó thể không


$(document).keyup(function(e) {
     if (e.key === "Escape") { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

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


11
để hủy liên kết: $ (tài liệu) .unbind ("keyup", keyUpFunc);
Plattsy

54
Để hủy liên kết, bạn cũng có thể sử dụng một không gian tên trong sự kiện $(document).on('keyup.unique_name', ...)$(document).unbind('keyup.unique_name')
Lachlan McD.

9
Bạn nên sử dụng e.which (thay vì e.keycode) để kiểm tra phím nào được nhấn. jQuery bình thường hóa mã khóa và mã charcode (được sử dụng trong các trình duyệt cũ hơn)
DMTintner 18/03/2016

1
@DMTintner: trong cùng một chủ đề, hãy xem nhận xét của Jordan Brough stackoverflow.com/a/1160109/759452
Adrien Be

8
Bạn nên luôn luôn sử dụng ===.
pmandell

211

Sự keydownkiện này sẽ hoạt động tốt cho Escape và có lợi ích là cho phép bạn sử dụng keyCodetrong tất cả các trình duyệt. Ngoài ra, bạn cần phải gắn người nghe documentchứ không phải cơ thể.

Cập nhật tháng 5 năm 2016

keyCodehiện đang trong quá trình không còn sử dụng nữa và hầu hết các trình duyệt hiện đại đều cung cấp keytài sản ngay bây giờ, mặc dù hiện tại bạn vẫn cần một dự phòng hỗ trợ trình duyệt phù hợp (tại thời điểm viết các bản phát hành hiện tại của Chrome và Safari không hỗ trợ nó).

Cập nhật tháng 9 năm 2018 evt.key hiện được hỗ trợ bởi tất cả các trình duyệt hiện đại.

document.onkeydown = function(evt) {
    evt = evt || window.event;
    var isEscape = false;
    if ("key" in evt) {
        isEscape = (evt.key === "Escape" || evt.key === "Esc");
    } else {
        isEscape = (evt.keyCode === 27);
    }
    if (isEscape) {
        alert("Escape");
    }
};
Click me then press the Escape key


3
Lưu ý, bạn cũng có thể thêm người nghe vào một <input>phần tử và do đó nó sẽ chỉ được kích hoạt khi phần tử này có tiêu điểm.
Mike

1
@Ranmocy: Đây là loại phần tử nào (loại có ID 'test')? Chỉ các yếu tố có khả năng nhận tiêu điểm (đầu vào mẫu, yếu tố có thể nội dung, yếu tố có bộ tabindex) kích hoạt các sự kiện quan trọng.
Tim Down

1
Bạn cũng có thể kiểm tra if (evt.key === 'Escape') {thay vì sử dụng không dùng nữakeyCode
Keysox

1
@tobymackenzie: Nó là như vậy. Điều đó có tuyệt vời không? Chào mừng bạn đến với thế giới mới dũng cảm của phát triển web dựa trên tiêu chuẩn.
Tim Down

1
Nếu bạn muốn biết liệu bạn có thể sử dụng một cách an toàn hay không .key, hãy xem caniuse.com/#feat=keyboardevent-key
Jasper de Vries

37

Sử dụng JavaScript, bạn có thể kiểm tra jsfiddle đang hoạt động

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
        alert('Esc key pressed.');
    }
};

Sử dụng jQuery bạn có thể kiểm tra jsfiddle làm việc

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});

17

kiểm tra keyCode&& which& keyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});

Tôi thấy điều này không hoạt động, jsfiddle.net/GWJVt chỉ để trốn thoát ... có vẻ khó xử?
Reigel

$ (document.body) .keypress () không bắn
Mithun Sreedharan

@Reigel: thực sự, dường như không hoạt động đúng với phím nhấn. Dù thế nào đi nữa, tôi không thể tìm ra phần 'vụng về'.
jAndy

3
KeyPress được nâng lên cho các phím ký tự (không giống như KeyDown và KeyUp, cũng được nâng lên cho các phím không có vi khuẩn) trong khi nhấn phím.
Marta

7

Cách tốt nhất là tạo chức năng cho việc này

CHỨC NĂNG:

$.fn.escape = function (callback) {
    return this.each(function () {
        $(document).on("keydown", this, function (e) {
            var keycode = ((typeof e.keyCode !='undefined' && e.keyCode) ? e.keyCode : e.which);
            if (keycode === 27) {
                callback.call(this, e);
            };
        });
    });
};

THÍ DỤ:

$("#my-div").escape(function () {
    alert('Escape!');
})

4
Trên thực tế, có vẻ như keypresskhông bắn vào phím thoát. Ít nhất, không có trong Chrome trên máy Mac.
samson

1
Cảm ơn phản hồi này, tôi đã thực hiện cập nhật và thay đổi quy tắc. keydownkhắc phục sự cố.
Ivijan Stefan Stipić

Tôi đã cập nhật giải pháp của bạn để có thể hỗ trợ việc sử dụng 'chỉ một lần'. Dưới đây là một ví dụ: jsfiddle.net/oxok5x2p .
dh

6

Dưới đây là mã không chỉ vô hiệu hóa phím ESC mà còn kiểm tra tình trạng nơi nó được nhấn và tùy thuộc vào tình huống, nó sẽ thực hiện hành động hay không.

Trong ví dụ này,

e.preventDefault();

sẽ vô hiệu hóa hành động nhấn phím ESC.

Bạn có thể làm bất cứ điều gì muốn ẩn một div với điều này:

document.getElementById('myDivId').style.display = 'none';

Trường hợp phím ESC được nhấn cũng được xem xét:

(e.target.nodeName=='BODY')

Bạn có thể loại bỏ phần này nếu phần điều kiện nếu bạn muốn áp dụng cho phần này. Hoặc bạn có thể nhắm mục tiêu INPUT tại đây để chỉ áp dụng hành động này khi con trỏ ở trong hộp nhập.

window.addEventListener('keydown', function(e){
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){
        e.preventDefault();
        return false;
    }
}, true);

0

Tôi nghĩ cách đơn giản nhất là vanilla javascript:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}

6
Trên chrome của tôi (Phiên bản 55.0.2883.95 (64-bit)) tôi nhận được Escapenhư event.keyvà không 27
MosheZada

Nó sẽ là event.keyCode27.
Jens Törnell
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.