Как да получа достъп до свойствата на събитие натискане на клавиш в ClojureScript с помощта на канали?

Използвайки ClojureScript, се опитвам да предприема действия, когато някой натисне enter в текстово поле, и игнорирам други клавиши. Така че трябва да мога да правя разлика между различните натискания на клавиши.

За справка моето ns в моето .cljs е:

(ns calculator.calculator
  (:require-macros [cljs.core.async.macros :refer [go]])
  (:require [goog.dom :as dom]
            [goog.events :as events]
            [cljs.core.async :refer [put! chan <!]]
            [clojure.string :as string]))

Моят html има входен елемент <input id="data-entry-box"></input>. Настроих слушателя по следния начин:

(defn listen [el type]
  (let [out (chan)]
    (events/listen el type
                   (fn [e] (put! out e)))
    out))

(let [keypresses (listen (dom/getElement "data-entry-box") "keypress")]
  (go (while true
        (let [key-event (<! keypresses)
              char-code (.-charCode key-event)]
          (.log js/console (str "The character code is " char-code))
          (.log js/console (str "The key is " (.-key key-event)))
          (.log js/console (str "The event is " (.-event key-event)))
          (.log js/console (str "Or the event is " (:event key-event)))
          (if (= char-code
                 13)
            (handle-submit))))))

След като го компилирам, заредя страницата и натискам enter във входния елемент, получавам следното в конзолата:

"The character code is 13"
"The key is "
"The event is "
"Or the event is "

Това е добре; Мога да проверя какъв е ключът, като потърся ASCII стойността -- но не би трябвало да го правя. Бих искал да получа директен достъп до натиснатия знак.

Ако поставя точка на прекъсване, мога да видя, че има свойство .event и това свойство има допълнително свойство .key. Но по някаква причина нямам достъп до него.


person zck    schedule 14.08.2014    source източник


Отговори (2)


Свойството при натискане на клавиш всъщност не се нарича .event; нарича се .event_. Обърнете внимание на долната черта в края. Така че имаме достъп до него с (.-event_ key-event), както следва:

(let [keypresses (listen (dom/getElement "data-entry-box") "keypress")]
  (go (while true
        (let [key-event (<! keypresses)
              key-pressed (.-key (.-event_ key-event))]
          (.log js/console (str "The key pressed was " key-pressed))
          (if (= key-pressed
                 "Enter")
            (handle-submit))))))

Този код отпечатва: „Натиснатият клавиш беше Enter“.

Имайте предвид, че javascript няма символни литерали, така че това, което (.-key (.-event_ key-event)) връща, е низ "Enter".

person zck    schedule 14.08.2014
comment
покажете вашия метод за слушане, не мисля, че свойство с име event_. Кой браузър използвате? Поставете пълен работещ примерен код. Мерси - person edbond; 14.08.2014
comment
@edbond го редактирах във въпроса и (поне във Firefox 31 и Chromium 36) свойството определено се нарича event_. За съжаление, в Chromium подсвойството не е key, а keyIdentifier. - person zck; 14.08.2014

Разгледайте кода на капана за мишки - https://github.com/ccampbell/mousetrap/blob/master/mousetrap.js

Обичайно е да използвате клавишен код или да го настроите ръчно на „Enter“.

Също така имам голямо съмнение, че event_ е обща собственост, можете да се обърнете към https://developer.mozilla.org/en-US/docs/Web/Events/keypress

person edbond    schedule 14.08.2014
comment
event_ изглежда, че е нещо на ClojureScript (или нещо на Google Closure) -- присвоено е в javascript, генериран от компилатора на ClojureScript. - person zck; 14.08.2014
comment
Тогава не трябва да разчитате на това. При разширена компилация той ще бъде преобразуван в нещо като "A" и вашият код няма да работи. - person edbond; 15.08.2014