Làm thế nào để một người nắm bắt khóa lệnh của Mac thông qua JavaScript?


Câu trả lời:


238

EDIT: Kể từ năm 2019, e.metaKeyđược hỗ trợ trên tất cả các trình duyệt chính theo MDN .

Lưu ý rằng trên Windows, mặc dù ⊞ Windowskhóa được coi là khóa "meta", nhưng nó sẽ không bị bắt bởi các trình duyệt như vậy.

Điều này chỉ dành cho phím lệnh trên MacOS / bàn phím.


Không giống như Shift/ Alt/ Ctrl, Cmdthay vào đó, phím (Apple Apple) không được coi là khóa sửa đổi, bạn nên lắng nghe keydown/ keyupvà ghi lại khi nhấn phím và sau đó nhấn phím event.keyCode.

Thật không may, các mã khóa này phụ thuộc vào trình duyệt:

  • Firefox: 224
  • Opera: 17
  • Trình duyệt WebKit (Safari / Chrome): 91(Lệnh trái) hoặc 93(Lệnh phải)

Bạn có thể thích đọc bài viết JavaScript Madness: Bàn phím Sự kiện , từ đó tôi học được kiến ​​thức đó.


2
Biết rằng Opera bây giờ cũng thuộc thể loại Webkit. Tôi nghĩ chỉ cần nghe 91, 93 và 224, sẽ hoàn thành công việc. Nhân tiện, 17 là Ctrl. Có phải Opera cũ không phân biệt Cmd và Ctrl ??
Steven Lu

56
Có vẻ như event.metaKey hoạt động trong các phiên bản hiện tại của Safari, Firefox và Chrome như một nét quyến rũ. IMO nó là giải pháp rõ ràng nhiều.
Miroslav Nedyalkov

5
Đáp lại bình luận của Miroslav, chỉ cần lưu ý rằng nó chỉ hoạt động trên keydowncác sự kiện chứ không phải keyup.
nachocab

209

Bạn cũng có thể xem event.metaKeythuộc tính trên sự kiện nếu bạn đang làm việc với các sự kiện keydown. Làm việc tuyệt vời cho tôi! Bạn có thể thử nó ở đây .


Điều đó dường như không được thiết lập cho tôi với Firefox 4.0.1 trên MacOS. Cho rằng câu trả lời được chấp nhận và tham chiếu được liên kết đều không đồng ý với những gì bạn đã nói, tôi nghĩ rằng câu trả lời này là không chính xác.
Josh Glover

8
.metaKeythực sự hoạt động trong Firefox, Safari và Opera mới nhất. Trong Chrome, .metaKeykích hoạt trên Control (không phải trên Command).
Ilya Semenov

1
FWIW, cmd + e không hoạt động với tôi trong kịch bản của bạn. Ctrl kích hoạt biểu tượng CMD mà bạn có
Oscar Godson

1
cmd + e không kích hoạt sự kiện cho tôi (chrome). ctrl + e nào.
Spencer Williams

23
Tôi nghĩ mẹo (ngay cả trong Chrome) là cách này hiệu quả keydownnhưng KHÔNG cho keyuphoặc keypress.
philfreo

15

Tôi thấy rằng bạn có thể phát hiện khóa lệnh trong phiên bản Safari mới nhất (7.0: 9537.71) nếu nó được nhấn cùng với một phím khác. Ví dụ: nếu bạn muốn phát hiện + x:, bạn có thể phát hiện khóa x VÀ kiểm tra xem event.metaKey có được đặt thành true không. Ví dụ:

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

Khi nhấn x trên chính nó, điều này sẽ xuất ra 120, false. Khi nhấn + x, nó sẽ xuất ra120, true

Điều này dường như chỉ hoạt động trong Safari - không phải Chrome


tình trạng năm 2017 là gì?
SuperUberDuper

13

Dựa trên dữ liệu của Ilya, tôi đã viết thư viện Vanilla JS để hỗ trợ các khóa sửa đổi trên Mac: https://github.com/MichaelZelensky/jsLologists/blob/master/macKeys.js

Chỉ cần sử dụng nó như thế này, ví dụ:

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

Đã thử nghiệm trên Chrome, Safari, Firefox, Opera trên Mac. Vui lòng kiểm tra nếu nó làm việc cho bạn.


8

Đối với những người sử dụng jQuery, có một plugin tuyệt vời để xử lý các sự kiện chính:

Các phím nóng jQuery trên GitHub

Để chụp + SCtrl+ STôi đang sử dụng:

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

1
Hoạt động quá tốt. Tất cả các phím bấm khác cũng bị bắt.
Felix Rabe

Có hỗ trợ trình duyệt chéo không?
Adil Malik

1
Nếu bạn đã truy cập liên kết trong câu trả lời của tôi, bạn sẽ biết: github.com/tzuryby/jquery.hotkeys#jquery-comp Tương thích
Koen.

3

Đây là cách tôi đã làm trong 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()

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.