clojurescript - 如何使用 Domina 处理 onsubmit

标签 clojurescript

我一直在尝试使用 Domina library 在 cljs 中编写以下等效项:

HTML:

<form id="my-form">
    <input type="text />
    <input type="submit" />
</form>

Javascript(jQuery):

$("#my-form").submit(function() {
    console.log("submit suppressed");
    return false;
});

一个令我不满意的解决方案(没有非常冗长的 Domina 库):

(set! (.-onsubmit (.getElementById js/document "my-form")) #(do
                                                              (.log js/console "submit suppressed")
                                                              false))

我尝试了很多解决方案,但都失败了 - 都有点类似于:

(listen! (by-id "my-form") :submit #(do
                                      (log "submit suppressed")
                                      false))

我故意不使用click事件,因为我也希望在通过代码或键盘提交表单时执行该函数。

最佳答案

当您从 jQuery 事件处理程序中返回 false 时,库将自动调用 e.preventDefaulte.stopPropagation (有关更多信息,请参阅 here )。调用此函数是控制事件行为的正确方法。

Domina 将 js/Event 包装在 ClojureScript 可以理解的内容中。因此,您可以直接调用 preventDefaultstopPropagation,而无需使用 Javascript 互操作。您可以在这里阅读有关这个​​巧妙技巧的更多信息:https://github.com/levand/domina#event-objects

这个技巧可能是导致返回 false 根本不起作用的原因。这个技巧的实现方式(看一下代码 here )是用另一个始终返回 true 的函数包装您的函数。

所以你的代码应该更像这样:

(listen! (by-id "my-form") :submit
         (fn [e]
           (do
             (log "submit suppressed")
             (prevent-default e)
             (stop-propagation e))))

关于clojurescript - 如何使用 Domina 处理 onsubmit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18829660/

相关文章:

react-native - React Native打包js时如何防止节点内存不足

clojure - Clojure/ClojureScript 中不区分大小写的过滤器

clojurescript - 无法在 OM 中显示两个组件

testing - 如何获得简单的 clojurescript 编译的直接结果?

javascript - 协助将 JS 翻译为 CLJS

clojure - 在我的 src/中扩展一个库

clojure:根据值的序列划分序列

clojurescript - shadow-cljs - 套接字连接失败,服务器进程死了?

clojurescript - 从 ClojureScript 中的另一个命名空间调用函数

clojure - 在 clojurescript 中使用 clojure 代码的规范方法