clojurescript动态脚本加载

时间:2013-01-09 20:50:42

标签: clojurescript

我对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中完成所有操作,包括动态添加脚本元素,那么一切正常。我错过了什么?

1 个答案:

答案 0 :(得分:3)

只是一个想法:我看到了couple pages关于动态添加脚本的问题,他们都创建了一个新脚本并将其作为<HEAD>的子项附加,而不是{ {1}}:

<BODY>