我在ClojuseScript中使用enfocus进行dom操作。
我有一个事件处理程序:
(ns numeros-linguas.script
(:require [enfocus.core :as ef]
[enfocus.events :as ev])
(:require-macros [enfocus.macros :as em]))
(defn aviso-seleciona []
(ef/at "select" (ev/listen :change
(fn [evt]
(let [lingua-id (ef/from [:select] (ef/get-prop :value))
lingua-selector (str "#" lingua-id)
cores (array "azul" "vermelho" "laranja" "verde")
linguas-visiveis (when-let [r (ef/from [:#resultado :> :div.visivel] (ef/get-attr :id))]
(-> r
list
flatten))]
(ef/at "#resultado" (ef/append (ef/from lingua-selector identity)))
(ef/at lingua-selector (ef/remove-class "invisivel"))
(ef/at lingua-selector (ef/add-class "visivel"))
(map #(do
(ef/at (str "#" %)
(ef/add-class %2))
(map (fn [cor]
(ef/at (str "#" %)
(ef/remove-class cor)))
(remove #{%2} cores)))
linguas-visiveis cores))))))
(set! (.-onload js/window)
aviso-seleciona)
棘手的部分在地图上。我想从一些div元素中删除一些css类,并在这些元素中添加其他一些。但它没有用。除了这一个之外,表单中的所有其他元素都在工作。但是,如果我将表单复制并粘贴到连接到该页面的repl并运行代码,它将按预期工作。我试着评论部分代码,以了解发生了什么,但没有希望。
答案 0 :(得分:1)
我注意到你在map
做副作用,因为map
很懒,所以不会起作用,即除非你尝试使用它否则不会评估它生成的序列,这解释了它在REPL中的工作原理,而不是在浏览器中。
要获得最快和最脏的修复方法,请尝试使用dorun
强制评估您的序列:(dorun (map #(do ...... )
。
或者,惯用,将您的代码重写为类似的东西(这不是非常惯用的):
(doseq [[el cor-to-add] (map vector linguas-visiveis cores)]
(ef/at (str "#" el)
(ef/add-class cor-to-add))
(doseq [cor-to-remove (remove #{cor} cores)]
(ef/at (str "#" el)
(ef/remove-class cor-to-remove)))
)
或者,首先从每个元素中删除所有类:
(doseq [el linguas-visiveis
cor cores]
(ef/at (str "#" el)
(ef/remove-class cor)))
稍后只添加必需的类:
(doseq [[el cor] (map vector linguas-visiveis cores)]
(ef/at (str "#" el)
(ef/add-class cor)))