2

我一直在尝试使用Domina 库在 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事件,因为我还希望在通过代码或键盘提交表单时执行该功能。

4

1 回答 1

3

当您falsejQuery事件处理程序中返回时,库将自动调用e.preventDefaultand e.stopPropagation(有关更多信息,请参见此处)。调用此函数是控制event.

多米娜包裹js/Event着一些可以ClojureScript理解的东西。因此,您可以直接调用preventDefaultand stopPropagation,而无需使用 Javascript 互操作。你可以在这里阅读更多关于这个巧妙技巧的信息:https ://github.com/levand/domina#event-objects 。

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

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

(listen! (by-id "my-form") :submit
         (fn [e]
           (do
             (log "submit suppressed")
             (prevent-default e)
             (stop-propagation e))))
于 2013-09-16T19:26:19.657 回答