คนหนึ่งจับคีย์คำสั่งของ Mac ผ่าน JavaScript ได้อย่างไร


คำตอบ:


238

แก้ไข:ในฐานะของ 2019 e.metaKeyจะได้รับการสนับสนุนบนเบราว์เซอร์ที่สำคัญทั้งหมดตาม MDN

โปรดทราบว่าใน Windows แม้ว่า⊞ Windowsคีย์จะถือเป็นคีย์ "เมตา" แต่เบราว์เซอร์จะไม่สามารถจับภาพได้

ใช้สำหรับคีย์คำสั่งบน MacOS / คีย์บอร์ดเท่านั้น


ซึ่งแตกต่างจากShift/ Alt/ Ctrlที่Cmd(“แอปเปิ้ล”) ที่สำคัญจะไม่ถือว่าเป็นตัวปรับแต่งที่สำคัญแทนคุณควรฟังบนkeydown/ และบันทึกเมื่อมีการกดแป้นแล้วเศขึ้นอยู่กับkeyupevent.keyCode

น่าเสียดายที่รหัสคีย์เหล่านี้ขึ้นอยู่กับเบราว์เซอร์:

  • Firefox: 224
  • Opera: 17
  • เบราว์เซอร์ WebKit (Safari / Chrome): 91(คำสั่งด้านซ้าย) หรือ93(คำสั่งด้านขวา)

คุณอาจสนใจอ่านบทความJavaScript Madness: Keyboard Eventsซึ่งฉันได้เรียนรู้จากความรู้นั้น


2
รู้ว่า Opera อยู่ในประเภท Webkit ด้วย ฉันคิดว่าแค่ฟัง 91, 93 และ 224 จะทำให้งานเสร็จ 17 คือ Ctrl โดยวิธี Opera เก่าไม่แยกความแตกต่าง Cmd และ Ctrl หรือไม่?
— Steven Lu

56
ดูเหมือนว่า event.metaKey ใช้งานได้กับ Safari, Firefox และ Chrome รุ่นปัจจุบัน IMO มันเป็นทางออกที่ชัดเจนมาก
— Miroslav Nedyalkov

5
ในการตอบสนองต่อความคิดเห็นของมิโรสลาฟเพียงแค่ทราบว่ามันทำงานเฉพาะในเหตุการณ์ที่เกิดขึ้นไม่ได้keydown keyup
— nachocab

209

นอกจากนี้คุณยังสามารถดูแอevent.metaKeyททริบิวในเหตุการณ์ได้หากคุณทำงานกับกิจกรรมดาวน์คีย์ ทำงานอย่างมหัศจรรย์สำหรับฉัน! คุณสามารถลองได้ที่นี่


ดูเหมือนจะไม่ถูกตั้งค่าให้ฉันด้วย Firefox 4.0.1 บน MacOS เนื่องจากคำตอบที่ได้รับการยอมรับและการอ้างอิงที่เชื่อมโยงนั้นไม่เห็นด้วยกับสิ่งที่คุณพูดเช่นกันฉันคิดว่าคำตอบนี้ไม่ถูกต้อง
— Josh Glover

8
.metaKeyใช้งานได้จริงใน Firefox, Safari และ Opera ล่าสุด ใน Chrome ให้.metaKeyเรียกใช้งานการควบคุม (ไม่ใช่ในคำสั่ง)
— Ilya Semenov

1
FWIW, cmd + e ใช้ไม่ได้กับสคริปต์ของคุณ Ctrl เรียกไอคอน CMD ที่คุณมี
— Oscar Godson

1
cmd + e ไม่ได้ใช้เหตุการณ์นี้สำหรับฉัน (chrome) ctrl + e ทำ
— Spencer Williams

23
ผมคิดว่าเคล็ดลับ (แม้ใน Chrome) คือว่างานนี้ได้keydownแต่ไม่ได้หรือkeyup keypress
— philfreo

15

ฉันพบว่าคุณสามารถตรวจจับคีย์คำสั่งใน Safari เวอร์ชันล่าสุด (7.0: 9537.71) ถ้ามันถูกกดร่วมกับคีย์อื่น ตัวอย่างเช่นหากคุณต้องการตรวจจับ⌘ + x: คุณสามารถตรวจจับปุ่ม x และตรวจสอบว่า event.metaKey ตั้งค่าเป็นจริง ตัวอย่างเช่น:

var key = event.keyCode || event.charCode || 0;
console.log(key, event.metaKey);

เมื่อกด x 120, falseที่มันเป็นตัวเองออกจะนี้ เมื่อกด⌘ + x จะเป็นการส่งออก120, true

ดูเหมือนว่าจะใช้งานได้ใน Safari เท่านั้นไม่ใช่ Chrome


สถานะในปี 2560 คืออะไร?
— SuperUberDuper

13

เมื่อพิจารณาจากข้อมูลของ Ilya ฉันได้เขียนไลบรารี Vanilla JS สำหรับการสนับสนุนคีย์ตัวแก้ไขบน Mac: https://github.com/MichaelZelensky/jsLไลบรารี/blob/master/macKeys.js

ใช้มันแบบนี้เช่น:

document.onclick = function (event) {
  if (event.shiftKey || macKeys.shiftKey) {
    //do something interesting
  }
}

ทดสอบบน Chrome, Safari, Firefox, Opera บน Mac โปรดตรวจสอบว่ามันเหมาะกับคุณหรือไม่


8

สำหรับผู้ที่ใช้ jQuery มีปลั๊กอินที่ยอดเยี่ยมสำหรับการจัดการเหตุการณ์สำคัญ:

ปุ่มลัด jQuery บน GitHub

สำหรับการจับภาพ⌘+ SและCtrl+ Sฉันใช้สิ่งนี้:

$(window).bind('keydown.ctrl_s keydown.meta_s', function(event) {
    event.preventDefault();
    // Do something here
});

1
ทำงานได้ดีเกินไป การกดปุ่มอื่น ๆ ทั้งหมดก็เช่นกัน
— เฟลิกซ์ Rabe

รองรับเบราว์เซอร์ข้ามหรือไม่?
— Adil Malik

1
หากคุณเยี่ยมชมลิงก์ในคำตอบของฉันคุณจะรู้จัก: github.com/tzuryby/jquery.hotkeys#jquery-compatibility
— Koen

3

นี่คือวิธีที่ฉันทำใน AngularJS

app = angular.module('MM_Graph')

class Keyboard
  constructor: ($injector)->
    @.$injector  = $injector
    @.$window    = @.$injector.get('$window')                             # get reference to $window and $rootScope objects
    @.$rootScope = @.$injector.get('$rootScope')

  on_Key_Down:($event)=>
    @.$rootScope.$broadcast 'keydown', $event                             # broadcast a global keydown event

    if $event.code is 'KeyS' and ($event.ctrlKey or $event.metaKey)       # detect S key pressed and either OSX Command or Window's Control keys pressed
      @.$rootScope.$broadcast '', $event                                  # broadcast keyup_CtrS event
     #$event.preventDefault()                                             # this should be used by the event listeners to prevent default browser behaviour

  setup_Hooks: ()=>
    angular.element(@.$window).bind "keydown", @.on_Key_Down              # hook keydown event in window (only called once per app load)
    @

app.service 'keyboard', ($injector)=>
  return new Keyboard($injector).setup_Hooks()

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