带有 ClojureScript 的 AJAX Request 有时在 Chrome 上将 nil 作为参数

AJAX Request with ClojureScript sometimes has nil as parameter on Chrome

本文关键字:上将 Chrome nil 参数 ClojureScript AJAX Request 带有      更新时间:2023-09-26

>Edit

下面是一个带有最小示例的 JSFiddle。问题是在Firefox中,我单击按钮的位置并不重要。事件的目标始终是按钮。

另一方面,在Chrome中,如果我单击跨度,事件的目标是跨度而不是按钮。

这是预期的行为吗?

源语言

我在客户端使用clojurescript在clojure中编写了一个litte web应用程序,其中包含以下路线:

(POST "/admin/delete-user" {p :params}
        (println (str "Deleted User: "(pr-str (:username p))))
        (db/delete-user (:username p))
        "Expected return value")

一页包含以下按钮:

<button class="delete btn" data-delete="USERNAME">...</button>

此按钮与以下 ClojureScript 结合使用:

(listen!
   (by-class "delete")
   :click (fn [evt]
            (let [target (evt/target evt)
                  username (:data-delete (attrs target))]
              (POST "/admin/delete-user"
                    {:format :edn
                     :params {:username username}
                     :handler (fn [resp]
                                (log "User deleted")
                                (load-user-table))
                     :error-handler (fn [resp] (log "Error during user deletion"))})
              (log "User " username))))

我使用 domina 进行 dom 操作和事件处理,cljs-ajax用于我的 ajax 请求。这代码是使用我的lein cljsbuild设置中的advanced优化编译的。

在火狐上,这段代码工作正常,但是当我在Chrome中使用我的代码时,我"有时"得到的行为,而不是用户名在 按钮nildata-delete属性用作参数。

当这种行为发生时,我可以反复点击按钮,什么都没有发生。然后经过几次点击后它就可以工作了。

我还检查了共生输出,没有发生错误,而且T 显示登录"用户"后没有任何内容,因此username必须null

如何在 Chrome 中username为空?

我发现了问题:

而不是(target evt)我必须使用current-target.在 Firefox 中,点击事件是在 Chrome span 上的button上触发的。