如何通过clojurescript通道传输html dom事件
How to transfer html dom event through clojurescript channel
我正在努力将事件系统与 om-event-bus 集成,它使用 async/chan 来传输事件。然而,事实证明 html DOM 事件无法通过 clojurescript 的异步通道传输。传输事件中的属性变为空,内部函数丢失。
先定义一个频道:
(def event-bus (chan))
设置一个 dom 节点并将回调函数附加到 keydown 事件。在函数中,添加在频道中放置dom事件(PS:我使用om作为UI)
(dom/section #js {:id "VRE"
:tabIndex 0
:onKeyDown #(put! event-bus %)))
等待接收传输的事件
(go-loop
[]
(let [e (<! event-bus)]
(when e
(println "go-loop received" (.stringify js/JSON e))
(recur))))
当我键入一些键时,控制台将打印:
go-loop received {"dispatchConfig":null,
"dispatchMarker":null,
"nativeEvent":null,
"type":null,
...
"_dispatchListeners":null,"_dispatchIDs":null}
所有属性均为空,并且缺少 preventDefault 等内部函数。
我想一定是有什么地方没看懂。有没有人有修复它的想法?如果您能就此问题提出一些 hints/tips 或其他想法,那就太好了
您正在尝试将事件对象字符串化。这不是一个好主意,看看这个答案:
How to stringify event object?
尝试提取有趣的信息(即按下了哪个键)并将其作为值传递给频道。
传递整个事件对象并在接收端对其进行操作可能是不可能的。我在猜测,但似乎事件对象在从频道中提取之前就被删除了。
我正在努力将事件系统与 om-event-bus 集成,它使用 async/chan 来传输事件。然而,事实证明 html DOM 事件无法通过 clojurescript 的异步通道传输。传输事件中的属性变为空,内部函数丢失。
先定义一个频道:
(def event-bus (chan))
设置一个 dom 节点并将回调函数附加到 keydown 事件。在函数中,添加在频道中放置dom事件(PS:我使用om作为UI)
(dom/section #js {:id "VRE"
:tabIndex 0
:onKeyDown #(put! event-bus %)))
等待接收传输的事件
(go-loop
[]
(let [e (<! event-bus)]
(when e
(println "go-loop received" (.stringify js/JSON e))
(recur))))
当我键入一些键时,控制台将打印:
go-loop received {"dispatchConfig":null,
"dispatchMarker":null,
"nativeEvent":null,
"type":null,
...
"_dispatchListeners":null,"_dispatchIDs":null}
所有属性均为空,并且缺少 preventDefault 等内部函数。
我想一定是有什么地方没看懂。有没有人有修复它的想法?如果您能就此问题提出一些 hints/tips 或其他想法,那就太好了
您正在尝试将事件对象字符串化。这不是一个好主意,看看这个答案:
How to stringify event object?
尝试提取有趣的信息(即按下了哪个键)并将其作为值传递给频道。
传递整个事件对象并在接收端对其进行操作可能是不可能的。我在猜测,但似乎事件对象在从频道中提取之前就被删除了。