У меня есть программа, написанная на ClojureScript с использованием Reagent. Я пытаюсь использовать некоторые из тех же нажатий клавиш, которые использует браузер для некоторых операций - Cmd-s
для сохранения документа, Cmd-o
для открытия документа и так далее. Кажется, все работает, как и ожидалось, в Firefox, Opera и Brave, но не для всех нажатий клавиш в Safari.
Мой слушатель выглядит примерно так:
(defn capture-global-shortcuts
[aps] ; Just the program state ratom
(let [real-capture-fn (fn [evt aps]
(let [km (du/key-evt->map evt)]
(println "km: " km)
(cond
;; Open a file.
(= km {:key "o" :modifiers (merge-def-mods {:cmd true})})
(do
(println "saw cmd-o")
(du/prevent-default evt)
(du/stop-propagation evt)
;; A function to open a new document in the program
)
;; Save the file.
(= km {:key "s" :modifiers (merge-def-mods {:cmd true})})
(do
(println "saw cmd-s")
(du/prevent-default evt)
(du/stop-propagation evt)
;; A function to save the current document.
)
;; More keystrokes. Some of which work, others don't.
:default nil)))]
(du/add-event-listener "keydown" (fn [evt] (real-capture-fn evt aps)))))
Слушатель подключен как это:
(defn add-event-listener
[event-name f]
(.addEventListener js/document event-name f))
Я также пытался присоединить слушателя к окну браузера и элементу тела с теми же результатами.
Вывод после нажатия Cmd-s
с последующим Cmd-o
выглядит так:
[Log] km: {:key Meta, :modifiers {:ctrl false, :shift false, :alt false, :cmd true}}
[Log] km: {:key s, :modifiers {:ctrl false, :shift false, :alt false, :cmd true}}
[Log] saw cmd-s
[Log] km: {:key Meta, :modifiers {:ctrl false, :shift false, :alt false, :cmd true}}
Cmd-s
обнаружен как ожидалось. При нажатии Cmd-o
, однако, мета (Cmd) клавиша обнаруживается, а «o» - нет. Браузер открывает свой обычный диалог. Точно так же Cmd-n
открывает новое окно браузера вместо того, чтобы быть обнаруженным программой для создания нового документа.
Я не пробовал обнаруживать события keypress
и keyup
и модификаторы стека, начиная с keypress
в По крайней мере, кажется, не рекомендуется.
Может ли это быть сделано для работы в Safari?