จะตรวจจับการกดปุ่ม escape ด้วย pure JS หรือ jQuery ได้อย่างไร?


524

ซ้ำเป็นไปได้:
คีย์ใดสำหรับคีย์ escape กับ jQuery

วิธีการตรวจหาปุ่มกด escape ใน IE, Firefox และ Chrome? โค้ดด้านล่างใช้งานได้ใน IE และการแจ้งเตือน27แต่ใน Firefox จะแจ้งเตือน0

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

1
ทำการตรวจหาเบราว์เซอร์ก่อน?
ina

7
ผมพบ quirksmode.org เชื่อถือได้เสมอที่จะหาสิ่งที่ทำงานในเบราว์เซอร์: quirksmode.org/js/keys.html ที่นั่นคุณจะพบว่ามีkeyupหรือkeydownใช้ร่วมกับkeyCodeงานในเบราว์เซอร์ทั้งหมดเท่านั้น
เฟลิกซ์คลิง

1
ฉันคิดว่าชื่อของคำถามนี้ควรเป็น "วิธีตรวจจับการกดปุ่ม Escape ด้วย jquery" หรือคำตอบที่ควรจะเป็นใน JavaScript พื้นเมือง ...
เหี่ยว

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});คำทักทายจาก 2014
Kalle H. Väravas

คำตอบ:


957

หมายเหตุ: keyCodeกำลังจะเลิกใช้งานkeyแทน

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

นี่คือjsfiddle


keyCode กำลังเลิกใช้แล้ว

ดูเหมือนkeydownและkeyupทำงานได้แม้ว่าkeypressจะไม่ได้


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

คีย์รหัสใดสำหรับคีย์ escape ด้วย jQuery


11
เพื่อแยก: $ (เอกสาร). unbind ("keyup", keyUpFunc);
Plattsy

54
หากต้องการยกเลิกการผูกคุณสามารถใช้เนมสเปซในเหตุการณ์$(document).on('keyup.unique_name', ...)และ$(document).unbind('keyup.unique_name')
Lachlan McD

9
ขอแนะนำให้ใช้ e.which (แทน e.keycode) เพื่อตรวจสอบว่ามีการกดคีย์ใด jQuery ทำให้รหัสปกติและรหัสเป็นปกติ (ใช้ในเบราว์เซอร์รุ่นเก่า)
DMTintner

1
@DMTintner: ในหัวข้อเดียวกันดูความคิดเห็นที่เหลือโดย Jordan Brough stackoverflow.com/a/1160109/759452
Adrien Be

8
===คุณควรใช้
pmandell

211

keydownเหตุการณ์จะทำงานได้ดีสำหรับการหลบหนีและมีประโยชน์ในการช่วยให้คุณสามารถใช้keyCodeในเบราว์เซอร์ นอกจากนี้คุณต้องแนบผู้ฟังไปด้วยdocumentแทนที่จะเป็นร่างกาย

อัปเดตพฤษภาคม 2559

keyCodeขณะนี้อยู่ในระหว่างการเลิกใช้งานและเบราว์เซอร์ที่ทันสมัยส่วนใหญ่เสนอkeyคุณสมบัติในขณะนี้แม้ว่าคุณจะยังคงต้องการทางเลือกใหม่สำหรับการสนับสนุนเบราว์เซอร์ที่เหมาะสมสำหรับตอนนี้ (ในขณะที่เขียน Chrome และ Safari รุ่นปัจจุบัน

อัปเดตกันยายน 2561 evt.keyรองรับเบราว์เซอร์สมัยใหม่ทั้งหมด

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
หมายเหตุคุณยังสามารถเพิ่มผู้ฟังไปยัง<input>องค์ประกอบและมันจะถูกเรียกเมื่อองค์ประกอบนี้มีโฟกัส
Mike

1
@Ranmocy: องค์ประกอบแบบไหน (อันที่มี ID 'test') องค์ประกอบเท่านั้นที่สามารถรับโฟกัส (อินพุตฟอร์มองค์ประกอบที่พึงพอใจองค์ประกอบที่มีชุด tabindex) เหตุการณ์สำคัญของไฟ
Tim Down

1
นอกจากนี้คุณยังสามารถตรวจสอบif (evt.key === 'Escape') {แทนการใช้เลิกใช้keyCode
Keysox

1
@tobymackenzie: ดังนั้นจึงเป็น นั่นช่างน่าอัศจรรย์ใช่ไหม ยินดีต้อนรับสู่โลกใหม่ที่กล้าหาญของการพัฒนาเว็บตามมาตรฐาน
Tim Down

1
หากคุณต้องการทราบว่าสามารถใช้งานได้อย่างปลอดภัยหรือ.keyไม่โปรดดูcaniuse.com/#feat=keyboardevent-key
Jasper de Vries

37

การใช้JavaScriptคุณสามารถตรวจสอบjsfiddle ที่ใช้งานได้

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

การใช้jQueryคุณสามารถตรวจสอบjsfiddle ที่ใช้งานได้

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

17

ตรวจสอบkeyCode&& which& keyup||keydown

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

ฉันเห็นสิ่งนี้ไม่ทำงานjsfiddle.net/GWJVtเพื่อหลบหนี ... ดูเหมือนจะอึดอัดใช่ไหม?
Reigel

$ (document.body) .keypress () ไม่ถูกยิง
Mithun Sreedharan

@Reigel: แน่นอนดูเหมือนว่าจะไม่ทำงานอย่างถูกต้องกับปุ่มกด อะไรก็ตามฉันไม่สามารถหาส่วนที่ 'อึดอัด'
jAndy

3
KeyPress ถูกยกขึ้นสำหรับแป้นอักขระ (ซึ่งแตกต่างจาก KeyDown และ KeyUp ซึ่งเพิ่มขึ้นสำหรับแป้นที่ไม่ใช่อักขระ) ในขณะที่กดแป้น
Marta

7

วิธีที่ดีที่สุดคือสร้างฟังก์ชั่นสำหรับสิ่งนี้

ฟังก์ชั่น:

$.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);
            };
        });
    });
};

ตัวอย่าง:

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

4
ที่จริงแล้วดูเหมือนkeypressว่าไม่ได้ใช้กุญแจหนีไฟ อย่างน้อยไม่ได้อยู่ใน Chrome บน Mac
แซมสัน

1
ขอบคุณสำหรับคำติชมนี้ฉันได้ทำการอัปเดตและเปลี่ยนแปลงกฎ keydownแก้ไขปัญหา.
Ivijan Stefan Stipić

ฉันอัปเดตโซลูชันของคุณเพื่อให้สามารถใช้งาน 'เพียงครั้งเดียวเท่านั้น' นี่คือตัวอย่าง: jsfiddle.net/oxok5x2p
dh

6

ด้านล่างเป็นรหัสที่ไม่เพียง แต่ปิดการใช้งานปุ่ม ESC แต่ยังตรวจสอบสภาพที่มันถูกกดและขึ้นอยู่กับสถานการณ์มันจะทำการกระทำหรือไม่

ในตัวอย่างนี้

e.preventDefault();

จะปิดการทำงานของการกดปุ่ม ESC

คุณอาจทำอะไรก็ได้เพื่อซ่อน div ด้วย:

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

เมื่อพิจารณาถึงการกดปุ่ม ESC จะพิจารณาด้วย:

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

คุณสามารถลบได้หากเงื่อนไขเป็นส่วนหนึ่งหากคุณต้องการใช้กับทุกสิ่ง หรือคุณอาจกำหนดเป้าหมาย INPUT ที่นี่เพื่อใช้การกระทำนี้เมื่อเคอร์เซอร์อยู่ในกล่องอินพุต

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

ฉันคิดว่าวิธีที่ง่ายที่สุดคือ vanilla javascript:

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

6
บนโครเมี่ยมของฉัน (เวอร์ชัน 55.0.2883.95 (64 บิต)) ฉันได้รับEscapeเป็นevent.keyและไม่ได้ 27
MosheZada

ควรเป็นevent.keyCode27.
Jens Törnell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.