2013-03-31 4 views
2

У меня возникли проблемы с получением списка «touch» или «changedTouches» из события Touchstart в Domina.clojurescript: события касания и Domina

Вот мой: требуется материал:

(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)))) 

«де» является атом, который я пытаюсь использовать для отладки. Я могу получить тип: из события, но это все. Практически никто из прокомментированных вещей не работает, кроме ev/raw-event. raw-event возвращает объект, который может быть инкрустирован из repl, по крайней мере для меня. Если я поменяю! де с сырым-событие выглядит следующим образом:

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

Я понятия не имею, как извлекать информацию из этого, кажется, довольно не реагирует на такие вещи, как (ключи х) или (.keys х) и т.д.

Также странно, что я могу вызвать (: type evt) в вышеприведенной функции, но если я назначу evt на de, я не могу сделать то же самое с атомом de в repl, то есть (: type @de).

ответ

5

После долгого разочарования я наконец-то начал работать. Оказывается, на работе есть несколько слоев, о которых я действительно не знал (и не ХОЧУ был знать!). Главное, что в объекте события с доминой не было никакой информации о касании, которая убирается даже до того, как domina получит событие. Его, как это:

оригинальное событие браузера -> закрытие Google библиотека -> домина библиотека -> мой код

И закрытие Google (не Clojure, его Javascript) библиотека фактически вычеркивает сенсорную информацию, поэтому его не доступный в объекте события, который я получаю. Спасибо, google. Однако исходное событие все еще доступно, его всего два слоя. Код выглядит следующим образом:

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

Поэтому я использую функцию сырых событий Domina, чтобы получить закрывающую версию Google события («ВАТЫ»). Но у этого также нет информации о касании. Я должен пойти еще на один уровень с 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 здесь, но ничего не помогало мне. Откройте для этого предложения.