我对 Clojurescript 比较陌生,并且遇到了一些我不太确定问题所在的问题。我的 clojurescript 中有一个函数,它向文档中添加了一个新的脚本元素,用于加载脚本从未尝试加载的 FB API。该资源没有活动。我已经用javascript重写了这个例子,它可以工作。我查看了生成的 clojurescript 代码,它看起来与我编写的 javascript 代码基本相同。我已经尝试了一些东西,但最终没有什么能让浏览器通过使用 ClojureScript 加载动态脚本。
我的代码是
(ns wearthisorthat.client.fblogin
(:require [goog.net.XhrIo :as xhr]
[cljs.reader :as cljrdr]
[clojure.browser.repl :as repl]
[domina.events :as ev]
[domina :as d]
[domina.css :as css]))
(defn load-fb-sdk [debug?]
(let [ id "facebook-jssdk"
debug-str (if debug? "/debug" "")
ref (d/by-id "fb-script")
_ (.log js/console "ref = " ref)
parent (.-parent ref)
el-id (d/by-id id)
element (d/string-to-dom (str "<script id=" id " async"
" src=//connect.facebook.net/en_US/all"
debug-str ".js></script>"))
_ (.log js/console element)]
(when-not el-id (d/insert-before! ref element))))
(defn ^:export fbcb []
(let [data {:appId "<myappid>",
:channelUrl "<my-channel>",
:status true,
:cookie true,
:xfbml true}]
(.log js/console "RRRRRRRRRRR")
(js/FB.init (clj->js data))))
;; Load the SDK's source Asynchronously
(.log js/console "RIGHT HERE")
(aset js/window "fbAsyncInit" fbcb)
(load-fb-sdk true)
我的 index.html (在我上面的 cljs 更新之前)
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="fb-root"></div>
<script id="fb-script"></script>
<script type="text/javascript" src="js/wtot.js"></script>
</body>
</html>
在我的 cljs 运行后,我的文档看起来像这样......
<!DOCTYPE html>
<!-- saved from url=(0037)http://localhost:3000/wtot/index.html -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<div id="fb-root"></div>
<script id="facebook-jssdk" async src="//connect.facebook.net/en_US/all/debug.js"></script>
<script id="fb-script"></script>
<script type="text/javascript" src="./index_files/wtot.js"></script>
</body>
</html>
Google 网络流量仅显示正在加载的 index.html 和 wtot.js,而不是 debug.js(没有错误,但日志中没有尝试加载 debug.js 的引用)。如果我通过将上面的动态元素复制并粘贴到我的 index.html 中来使动态脚本元素成为静态元素,那么代码将按预期工作。如前所述,如果我在 javascript 中完成这一切,包括动态添加脚本元素,那么一切正常。我错过了什么?