2010-07-30 29 views
383

thể trùng lặp:
Which keycode for escape key with jQueryLàm cách nào để phát hiện phím bấm thoát bằng JS hoặc jQuery thuần túy?

Làm thế nào để phát hiện thoát nhấn phím trong IE, Firefox và Chrome? Dưới đây đang làm việc trong IE và cảnh báo 27, nhưng trong firefox nó cảnh báo 0

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

thực hiện một số phát hiện trình duyệt trước? – ina

+6

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: http://www.quirksmode.org/js/keys.html. Ở đó bạn có thể thấy rằng chỉ 'keyup' hoặc' keydown' kết hợp với 'keyCode' hoạt động trong tất cả các trình duyệt. –

+1

Tôi nghĩ rằng tiêu đề của câu hỏi này nên 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 ở dạng javascript gốc ... – Wilt

Trả lời

738

Dường keydownkeyup làm việc, mặc dù có thể không keypress


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

Which keycode for escape key with jQuery

+10

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

+43

Để hủy liên kết, bạn cũng có thể sử dụng không gian tên trên sự kiện, '$ (tài liệu) .on ('keyup.unique_name', ...)' và '$ (tài liệu).unbind ('keyup.unique_name') ' –

+9

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

14

séc keyCode & & which & keyup || keydown

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

tôi thấy điều này không làm việc, http://jsfiddle.net/GWJVt/ chỉ để thoát ... có vẻ khó xử? – Reigel

+0

$ (document.body) .keypress() không kích hoạt –

+0

@Reigel: thực sự, có vẻ như không hoạt động đúng cách với nhấn phím. Bất kì cái gì, tôi không thể hình dung được phần 'vụng về'. – jAndy

138

Sự kiện keydown sẽ làm việc tốt cho Escape và có lợi cho phép bạn sử dụng keyCode trong tất cả các trình duyệt. Ngoài ra, bạn cần phải đính kèm người nghe đến document thay vì cơ thể.

CẬP NHẬT Tháng Năm 2016

keyCode hiện đang trong quá trình bị phản đối và hầu hết các trình duyệt hiện đại cung cấp key bất động sản bây giờ, mặc dù bạn vẫn sẽ cần một dự phòng để hỗ trợ trình duyệt phong nha cho bây giờ (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ó).

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

+3

Lưu ý, bạn cũng có thể thêm người nghe vào 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

+0

Tôi đã thử nhưng không thành công: 'document.getElementById ('test'). Onkeydown = function (evt) {if ((evt || window.event) .keyCode == 27) {alert()}}' – Ranmocy

+1

@Ranmocy: Loại phần tử nào (phần tử có kiểm tra ID ')? Chỉ các phần tử có khả năng nhận tiêu điểm (đầu vào biểu mẫu, yếu tố có thể chỉnh sửa được, các phần tử có thiết lập tabindex) các sự kiện quan trọng về cháy. –

20

Sử dụng JavaScript bạn có thể thực hiện kiểm tra công tác jsfiddle

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

Sử dụng jQuery bạn có thể thực hiện kiểm tra công tác jsfiddle

6

Cách tốt nhất là để thực hiện chức năng 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); 
      }; 
     }); 
    }); 
}; 

VÍ DỤ:

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

Thực ra, có vẻ như 'phím bấm' không kích hoạt phím thoát. Ít nhất, không phải 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. 'keydown' khắc phục sự cố. –

+0

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

1

tôi nghĩ rằng cách đơn giản nhất là vani javascript:

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

Trên chrome của tôi (Phiên bản 55.0.2883.95 (64-bit)) Tôi nhận được 'Thoát' dưới dạng' event.key' và không phải là 27 – MosheZada

2

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 mà 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 các hành động tác bấm phím ESC.

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

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

Trường hợp phím ESC ép cũng được đưa vào xem xét:

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

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

window.addEventListener('keydown', function(e){ 
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){ 
     e.preventDefault(); 
     return false; 
    } 
}, true); 
Các vấn đề liên quan