2011-10-07 7 views
4

Clojurescript의 dom에 SVG 요소를 추가하는 가장 좋은 방법은 무엇입니까? Twitterbuzz 예제는 Google 클로저 lib의 Graphics 객체를 사용하지만 IE 호환성을 신경 쓰지 않는다고 말하면 HTML과 같은 요소를 추가 할 수있는 방법이 있습니까 (dom/build [:svg [:g [:text "something like this ?"]]]) 클로저의 그래픽 라이브러리를 사용해 보았지만 많이 사용하지는 않습니다. 편리한 SVG 기능. Apogee를 사용해 보았지만 SVG 코드를 직렬화하면 직접 DOM 조작을 선호합니다.Clojurescript의 SVG

답변

4

dom/build는 네임 스페이스가없는 DOM 요소를 생성합니다. dom/build를 향상 시키거나 SVG를 작성해야합니다. 다음 코드를 사용하여 SVG 요소를 만듭니다.

(defn element-ns 
    "Create a namespaced dom element" 
    [namespace tag & args] 
    (let [[tag attrs children] (normalize-args tag args) 
     parent (. js/document createElementNS namespace (name tag)) 
     [parent children] (if (string? (first children)) 
          [(set-text (element-ns namespace tag attrs) (first children)) 
          (rest children)] 
          [parent children])] 
    (doseq [[k v] attrs] 
     (. parent setAttributeNS nil (name k) v)) 
    (apply append parent children))) 

(defn build-svg 
    "Build up a svg element from nested vectors." 
    [x] 
    (if (vector? x) 
    (let [[parent children] (if (keyword? (first x)) 
          [(apply element-ns "http://www.w3.org/2000/svg" (take-while element-arg? x)) 
          (drop-while element-arg? x)] 
          [(first x) (rest x)]) 
     children (map build-svg children)] 
     (apply append parent children)) 
    x)) 
+0

[element-ns] (https://gist.github.com/1274699) – Hendekagon

+0

'element-arg?''normalize-args','set-text' 및'append'는 어디에 정의되어 있습니까? – noisesmith

3

당신은 D3 자바 스크립트 라이브러리에 대한 ClojureScript 래퍼 내 cljs-d3 도서관에 관심이있을 수 있습니다. D3은 SVG DOM을 조작하기위한 훌륭한 도구입니다.

2

Enlive을 SVG 용으로 사용 하시겠습니까? 이것은 내가 몇 가지 실시간 프로젝트에 사용할 계획입니다.

+0

왜냐하면 AFAIK, Enlive는 런타임에 클라이언트에서 SVG를 생성하는 반면 서버에서 HTML을 생성하는 데 좋은 HTML 템플릿 라이브러리입니다. 또한 SVG에 필요한 XML 네임 스페이스를 지원하지 않는다고 생각합니다. – Hendekagon

+0

아, 알겠습니다. 제 사과 - ClojureScript 랜드에 대한 'Enfocus'를 살펴보십시오. 클라이언트와 서버 모두에서 svg를 생성 할 것입니다. – humasect