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, включая динамическое добавление элемента script, все это сработает. Что мне не хватает?


person RStrad    schedule 09.01.2013    source источник


Ответы (1)


Просто идея: я видел пару страницы о динамическом добавлении скриптов, и все они создают новый скрипт и добавляют его как дочерний элемент <HEAD>, а не <BODY>:

  var head= document.getElementsByTagName('head')[0];
  var script= document.createElement('script');
  script.type= 'text/javascript';
  script.src= 'helper.js';
  head.appendChild(script);
person Denis Fuenzalida    schedule 14.03.2013