4

cljs ファイルに次のコードがあります。

(def template 
    "<script type=\"text/javascript\">
      console.log(\"The script was run\");
    </script>")

(defn add-script []
  (let [s (js/document.createElement "div")]
    (set! (.-innerHTML s) template)
    (js/document.head.appendChild (.-firstChild s))))

(明らかに、実際のスクリプト テンプレートの内容はこれとは異なりますが、これは問題を示しています)

add-script が実行された後にドキュメントを見ると、案の定、スクリプト テンプレートがコードに挿入されています。問題は、コードが実際に実行されていないことです。これが単なる js の場合は、単純にテンプレートを評価します。ただし、Clojurescript には eval がないので、script タグを使用して JavaScript テンプレートのコンテンツを動的に追加しようと考えました。

これを機能させるにはどうすればよいですか。具体的には、動的に挿入した後にスクリプト テンプレートのこれらのコンテンツを評価するにはどうすればよいですか?

4

2 に答える 2

3

私はこのコードで似たようなことをしました

(let [the-head js/document.head
      the-script (.createElement js/document "script")
      the-script-value "console.log(\"The script was run\");"
      ]
  ; if you need to load a js file
  ;(set! (.-type the-script) "text/javascript")
  ;(set! (.-src the-script) "url_file")
  (set! (.-innerHTML the-script) the-script-value)  
    (.appendChild the-head the-script)
  )

お役に立てば幸いです

于 2013-10-22T09:32:36.013 に答える
0
(def template 
    "<script type=\"text/javascript\">
      console.log(\"The script was run\");
    </script>")

(defn add-script []
  (let [e (js/document.createElement "script")
        t (subs template 32 (- (count template) 14))]
    ;; t -> "      console.log(\"The script was run\");"
    (set! (.-text e) t)
    (js/document.head.appendChild e)))

動作します。実際、この innerHTML の動作によりコードが読み込まれないことに非常に驚いています。矛盾しているようで、私にはあまり意味がありません。

script タグのコンテンツを取得するための適切な Clojurescript 正規表現もありがたいです。cljsで実際に正規表現を使用する実際の例を見つけることができなかったようです.

于 2013-07-18T20:44:17.180 に答える