การจับคีย์ผสม ctrl + z ในจาวาสคริปต์


86

ฉันพยายามจับภาพctrl+ zคีย์ผสมในจาวาสคริปต์ด้วยรหัสนี้:

<html>
<head>
    <title>Untitled Document</title>
</head>
<body>

    <script type='text/javascript'>
        function KeyPress(e) {
            var evtobj = window.event? event : e


            //test1 if (evtobj.ctrlKey) alert("Ctrl");
            //test2 if (evtobj.keyCode == 122) alert("z");
            //test 1 & 2
            if (evtobj.keyCode == 122 && evtobj.ctrlKey) alert("Ctrl+z");
        }

        document.onkeypress = KeyPress;
    </script>

</body>
</html>

บรรทัดแสดงความคิดเห็น "test1" จะสร้างการแจ้งเตือนหากฉันกดctrlแป้นค้างไว้และกดแป้นอื่น ๆ

บรรทัดแสดงความคิดเห็น "test2" จะสร้างการแจ้งเตือนหากฉันกดzแป้น

รวมเข้าด้วยกันตามบรรทัดหลังจาก "ทดสอบ 1 & 2" และกดctrlปุ่มค้างไว้จากนั้นกดปุ่มzจะไม่สร้างการแจ้งเตือนตามที่คาดไว้

รหัสผิดอะไร

คำตอบ:


95
  1. ใช้onkeydown(หรือonkeyup) ไม่ใช่onkeypress
  2. ใช้keyCode90 ไม่ใช่ 122

การสาธิตออนไลน์: http://jsfiddle.net/29sVC/

เพื่อความชัดเจนรหัสคีย์ไม่เหมือนกับรหัสอักขระ

รหัสอักขระใช้สำหรับข้อความ (แตกต่างกันไปขึ้นอยู่กับการเข้ารหัส แต่ในหลาย ๆ กรณี 0-127 ยังคงเป็นรหัส ASCII) รหัสคีย์แมปกับปุ่มบนแป้นพิมพ์ ตัวอย่างเช่นในอักขระ Unicode 0x22909 หมายถึง好 มีคีย์บอร์ดไม่มากนัก (ถ้ามี) ที่มีคีย์สำหรับสิ่งนี้

ระบบปฏิบัติการดูแลการเปลี่ยนการกดแป้นพิมพ์เป็นรหัสอักขระโดยใช้วิธีการป้อนข้อมูลที่ผู้ใช้กำหนดค่าไว้ ผลลัพธ์จะถูกส่งไปยังเหตุการณ์การกดแป้น (ในขณะที่คีย์ลงและคีย์อัพตอบสนองต่อการกดปุ่มของผู้ใช้ไม่ใช่การพิมพ์ข้อความ)


1
ขอบคุณที่ได้ผล ทำไม onkeypress และ keyCode 122 ไม่ทำงาน
Paul Johnston

วิธีการ PreventDefault () แทนการแจ้งเตือนในโซลูชันของคุณโปรด ฉันกำลังทดสอบ Ctrl + t
Surendra Jnawali

@SJnawali: ฉันไม่แน่ใจว่าจะเป็นไปได้สำหรับctrl+t
zerkms

4
เหตุใด keyCode 122 จึงไม่ทำงาน ดี122สำหรับคีย์F11 :)
ทารก

7
@PaulJohnston เนื่องจากรหัสคีย์ไม่เหมือนกับรหัสอักขระ รหัสอักขระใช้สำหรับข้อความ (แตกต่างกันไปขึ้นอยู่กับการเข้ารหัส แต่ในหลาย ๆ กรณี 0-127 ยังคงเป็นรหัส ASCII) รหัสคีย์แมปกับปุ่มบนแป้นพิมพ์ ตัวอย่างเช่นในอักขระ Unicode 0x22909 หมายถึง好 มีคีย์บอร์ดไม่มากนัก (ถ้ามี) ที่มีคีย์สำหรับสิ่งนี้ ระบบปฏิบัติการดูแลการเปลี่ยนการกดแป้นพิมพ์เป็นรหัสอักขระโดยใช้วิธีการป้อนข้อมูลที่ผู้ใช้กำหนดค่าไว้ ผลลัพธ์จะถูกส่งไปยังkeypressเหตุการณ์ (ในขณะที่keydownและkeyupตอบสนองต่อการกดปุ่มของผู้ใช้ไม่ใช่การพิมพ์ข้อความ)
Aidiakapi

32

สำหรับคนในอนาคตที่สะดุดกับคำถามนี้นี่เป็นวิธีที่ดีกว่าในการทำงานให้สำเร็จ:

document.addEventListener('keydown', function(event) {
  if (event.ctrlKey && event.key === 'z') {
    alert('Undo!');
  }
});

การใช้event.keyโค้ดช่วยลดความซับซ้อนลงอย่างมากโดยลบค่าคงที่ฮาร์ดโค้ด รองรับ IE 9+

นอกจากนี้การใช้document.addEventListenerวิธีการที่คุณจะไม่ปิดบังผู้ฟังคนอื่น ๆ ในเหตุการณ์เดียวกัน

window.eventในที่สุดก็มีเหตุผลที่จะใช้ไม่มี มันหมดกำลังใจและอาจส่งผลให้โค้ดเปราะบาง


นอกจากนี้ฉันขอเพิ่มเติมว่าKeyboardEvent.keyCodeตอนนี้เลิกใช้งานไปตั้งแต่สองสามปีที่แล้ว วิธีที่ดีที่สุดในการจับภาพเบราว์เซอร์ทั้งหมดจะถูกตรวจสอบครั้งแรกแล้วทางเลือกที่จะe.key e.keyCodeหรือคุณสามารถใช้โพลีฟิลล์นี้
Yes Barry



3

90 เป็นZกุญแจสำคัญและจะทำการจับภาพที่จำเป็น ...

function KeyPress(e){
     // Ensure event is not null
     e = e || window.event;

     if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {
         // Ctrl + Z
         // Do Something
     }
}

ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการเพิ่มe.preventDefault();คำสั่ง if ของคุณเพื่อดำเนินการฟังก์ชันที่กำหนดเองของคุณโดยเฉพาะ


0
document.onkeydown = function (e) {
    var special = e.ctrlKey || e.shiftKey;
    var key = e.charCode || e.keyCode;
  console.log(key.length);
  if (special && key == 38 || special && key == 40 ) { 
    // enter key do nothing
    e.preventDefault();
  }        
}

ต่อไปนี้เป็นวิธีบล็อกสองคีย์ไม่ว่าจะเป็นการกด Shift + หรือ Ctrl + คีย์ผสม

&& ช่วยในการผสมคีย์โดยไม่ต้องใช้ชุดค่าผสมจะบล็อกแป้น ctrl หรือ shift ทั้งหมด


-3

ปลั๊กอินที่สร้างโดยฉันนี้อาจเป็นประโยชน์

เสียบเข้าไป

คุณสามารถใช้ปลั๊กอินนี้ที่คุณต้องใส่รหัสคีย์และฟังก์ชันที่จะเรียกใช้เช่นนี้

simulatorControl([17,90], function(){console.log('You have pressed Ctrl+Z');});

ในรหัสที่ผมได้แสดงวิธีการดำเนินการสำหรับ+Ctrl Zคุณจะได้รับเอกสารโดยละเอียดในลิงค์ ปลั๊กอินอยู่ในส่วนรหัส JavaScript ของปากกาของฉันบน Codepen


-5

ใช้รหัสนี้+CTRL ZรหัสสำหรับZในการกดแป้นคือ 122 และCTRL+ Zคือ 26 ตรวจสอบรหัสคีย์นี้ในพื้นที่คอนโซลของคุณ

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.