【问题标题】:clojurescript: touch events and Dominaclojurescript:触摸事件和 Domina
【发布时间】:2013-04-01 22:55:57
【问题描述】:

我无法从 Domina 中的 touchstart 事件中获取“touch”或“changedTouches”列表。

这是我的:需要的东西:

(ns myproj
  (:require-macros [hiccups.core :as h])
  (:require [domina :as dom]
        [hiccups.runtime :as hiccupsrt]
        [domina.events :as ev]
        [cljs.reader :refer [read-string]]
        [wsosc :as wo]
        [clojure.browser.repl :as repl]
        ))

这是我的 touchstart 事件处理程序:

(defn touchstart [evt]
  ; store event in an atom for repl access
  (swap! de (fn [x] evt))
  ; print something to html to show a result (no console on the phone)
  (dom/set-text! (dom/by-id "result") (str "blah" evt))
  ; hopefully someday extract touch coordinates here.
   (let [rct (.getBoundingClientRect (dom/by-id "osccanvas"))
         ;touchlist1 (get evt "changedTouches")
         ;touchlist2 (.changedTouches evt)
         ;touchlist3 (.-changedTouches evt)
         ;kies (keys evt)]
         wat (:type evt)             ; this works
         ;wat (ev/raw-event evt)     ; this works
         ;touchlist (.-changedTouches evt)]
         ;touch (.item touchlist 1)]
         ]
  (dom/set-text! (dom/by-id "result") (str "touchstart touch:" wat))))

'de' 是我试图用于调试的原子。我能够从事件中获取 :type ,仅此而已。除了 ev/raw-event 之外,几乎所有其他评论的东西都不起作用。 raw-event 返回一个从 repl 中相当难以破解的对象,至少对我来说是这样。如果我换! de 与原始事件看起来像这样:

ClojureScript:myproj>@de
#<[object Object]>

我不知道如何从中提取信息,它似乎对 (keys x) 或 (.keys x) 等内容反应迟钝。

同样奇怪的是,我可以在上述函数中调用 (:type evt),但是如果我将 evt 分配给 de,我就不能对 repl 处的 'de' 原子做同样的事情,即 (:输入@de)。

【问题讨论】:

    标签: clojurescript


    【解决方案1】:

    好吧,在经历了很多挫折之后,我终于可以开始工作了。事实证明,有许多层在起作用,我并没有真正意识到(也不想知道!)。主要的是 domina 触摸事件对象中没有触摸信息 - 甚至在 domina 获取事件之前就被剥离了。是这样的:

    原始浏览器事件 -> google 闭包库 -> domina 库 -> 我的代码

    而 google 闭包(不是 clojure,它的 javascript)库实际上去除了触摸信息,因此它在我得到的事件对象中不可用。谢谢,谷歌。但是,原始事件仍然可以访问,它仅向下两层。代码如下所示:

    (defn touchstart [evt]
       (let [wat (ev/raw-event evt)
             touches (.-changedTouches (.getBrowserEvent wat))
             touch (.item touches 0)
            ]
       (domousedown (.-clientX touch) (.-clientY touch))
      ))
    

    所以我使用 Domina 的 raw-event 函数来获取事件的 google 闭包版本('wat')。但这也没有触摸信息。我必须使用 getBrowserEvent 再上一层,然后我可以调用这里记录的 changedTouches 方法:

    https://developer.mozilla.org/en-US/docs/DOM/TouchEvent

    最后一个难题是首先检测是否存在触摸屏,因此我可以为此设置正确的事件函数。这个非clojure hack可以完成这项工作:

    (if (js* "'ontouchstart' in window")
       <set up touch events>
       <set up non-touch events>)
    

    我在这里尝试了 clojure 语法的各种排列,但似乎没有什么对我有用。对这方面的建议持开放态度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2015-02-06
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多