Слушатель не обнаруживает все нажатия клавиш в Safari - PullRequest
0 голосов
/ 11 марта 2020

У меня есть программа, написанная на 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?

...