1

ClojureScriptを使用して、どのブラウザー固有のバージョンの「requestAnimationFrame」メソッドが定義されているかを検出しています。私は次のコードを使用します:

(defn animationFrameMethod []
  (let [window (dom/getWindow)
        options (list #(.-requestAnimationFrame window)
                      #(.-webkitRequestAnimationFrame window)
                      #(.-mozRequestAnimationFrame window)
                      #(.-oRequestAnimationFrame window)
                      #(.-msRequestAnimationFrame window))]
    ((fn [[current & remaining]]
       (cond
        (nil? current) #((.-setTimeout window) % (/ 1000 30))
        (fn? (current)) (current)
        :else (recur remaining)))
     options)))

これは問題なく機能し、ひどいことではありませんが、メソッド名をリストに入れられるようにしたいと思っています。

'(requestAnimationFrame webkitRequestAnimationFrame ...)

次に、リスト内の各シンボルのマクロを呼び出して、無名関数コードを生成します。

私はそのように機能するものが欲しいです:

user> (def name webkitRequestAnimationFrame)
user> (macroexpand '(macros/anim-method name window))
#(.-webkitRequestAnimationFrame window)

しかし、しばらくマクロをいじってみたところ、この効果は得られませんでした。問題の一部は、メソッド名とドット表記が奇妙に機能することであり、これが可能かどうかさえわかりません。

これを機能させるためのヒントはありますか?ありがとう!

4

1 に答える 1

2

javascriptオブジェクトも連想ハッシュであるため、このようなものはマクロに頼らずに機能するはずです(テストされていません)...

(def method-names ["requestAnimationFrame"
                   "webkitRequestAnimationFrame"
                   "mozRequestAnimationFrame"
                   "oRequestAnimationFrame" 
                   "msRequestAnimationFrame"])

(defn animationFrameMethod []
  (let [window (dom/getWindow)
        options (map (fn [n] #(aget window n)) method-names)]
    ((fn [[current & remaining]]
       (cond
        (nil? current) #((.-setTimeout window) % (/ 1000 30))
        (fn? (current)) (current)
        :else (recur remaining)))
     options)))
于 2012-03-27T17:45:01.720 に答える