2013-03-31 5 views
2

Domina의 터치 시작 이벤트에서 '터치'또는 'changedTouches'목록을 가져 오는 데 문제가 있습니다. 여기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]> 

나는이 정보를 추출하는 방법을 몰라, 그것은 같은 것들 (키 X) 또는 (.keys의 x)는 꽤 응답하지 않는 것 등

이상한 점은 위의 함수에서 (: type evt)를 호출 할 수 있지만 evt에 de를 할당하면 repl에서 'de'atom과 동일한 작업을 수행 할 수 없다는 것입니다 (예 : type @de).

답변

5

많은 좌절감을 얻은 후 마침내 일할 일이 생겼습니다. 내가 실제로 몰랐던 수많은 레이어가 있음이 밝혀졌습니다 (그리고 알고 싶지 않았습니다!). 주요한 것은 domina touch 이벤트 객체에 터치 정보가 없다는 것입니다. domina가 이벤트를 받기 전에도 제거됩니다. 그것과 같은 :

원래 브라우저 이벤트 -> 구글 폐쇄 도서관 -> 도미 라이브러리 -> 내 코드

그리고 구글 폐쇄 (안 Clojure에 자사의 자바 스크립트) 라이브러리가 실제로 터치 정보를 제거합니다, 그래서이 아니 내가 얻을 수있는 이벤트 개체에서 사용할 수 있습니다. 고마워, 구글. 그러나 원래 이벤트는 여전히 액세스 할 수 있습니다. 단 두 계층 아래에 ​​있습니다. 코드는 다음과 같습니다

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

그래서 나는 이벤트 ('와트')의 구글 폐쇄 버전을 얻을 도미의 원시 이벤트 기능을 사용하십시오. 하지만 터치 정보도 없습니다. ,

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

을 그리고 퍼즐의 마지막 조각이 터치 스크린은 처음부터 존재 여부를 검출했다 : 나는 getBrowserEvent 하나 개 더 수준을 가야하고, 여기에 설명 된대로 다음 나는 changedTouches 메서드를 호출 할 수 있습니다 그래서 나는 그것에 대한 올바른 이벤트 기능을 설정할 수 있습니다. 여기 Clojure의 구문의 다양한 순열을 시도했지만 아무것도 날 위해 일하는 것 같았다

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

이 아닌 Clojure에 해킹 작업을 수행합니다. 그것에 대한 제안을 엽니 다.