clojurescript:触摸事件和Domina

时间:2013-03-31 17:02:13

标签: clojurescript

我无法在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'是我正在尝试用于调试的原子。我能从事件中得到:类型,但就是这样。除了ev / raw-event之外,几乎所有其他评论的东西都不起作用。 raw-event返回一个从repl中完全可以包含的对象,至少对我来说是这样。如果我交换! de与原始事件看起来像这样:

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

我不知道如何从中提取信息,它似乎对(键x)或(.keys x)等事情没有反应。

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

1 个答案:

答案 0 :(得分:5)

好好受挫之后我终于开始工作了。事实证明,工作中有很多层我并不是真正意识到(并且不想知道!)。主要的是在多米纳触摸事件对象中没有触摸信息 - 甚至在多米纳获得事件之前就被剥离了。它是这样的:

原始浏览器事件 - &gt;谷歌闭包库 - &gt;多米纳图书馆 - &gt;我的代码

谷歌关闭(不是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的原始事件函数来获取事件的谷歌关闭版本('wat')。但那也没有触控信息。我必须使用getBrowserEvent再多一个级别,然后我可以调用这里记录的changedTouches方法:

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

最后一个难题是首先检测是否存在触摸屏,因此我可以为此设置正确的事件功能。这个非clojure黑客做的工作:

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

我尝试了各种各样的clojure语法排列,但似乎没有什么对我有用。对此提出建议。