<script>
ブラウザは、 経由でドキュメントに追加された要素のコンテンツを解析していないようですtargetElement.innerHTML
。それはおそらくあなたが遭遇しているものです。
最善の解決策は、このような問題を解決するために jQuery のような十分にテストされたフレームワークを使用することです。彼らは、DOM にスクリプトを安全かつ正確に挿入する方法をすでに理解しています。ライブラリの帯域幅をどうしても確保できない場合を除き、一からやり直しても意味がありません。
これを修正する方法の 1 つは、Ajax 応答で JavaScript を HTML から分離することです。これは、2 つの要求を発行する (おそらく低速) か、JSON オブジェクト内で JavaScript と HTML を構造化する (おそらく保守が難しい) ことによって行われます。
次に例を示します。
<script>
function load_content(){
var req = new XMLHttpRequest();
req.open("GET", "ajax.json", true);
req.onreadystatechange = function (e){
if (req.readyState === 4){
if (req.status === 200){
// these three lines inject your JavaScript and
// HTML content into the DOM
var json = JSON.parse(req.responseText);
document.getElementById("target").innerHTML = json.html;
eval(json.js);
} else {
console.log("Error", req.statusText);
}
}
};
req.send(null);
}
</script>
<a href="#" onclick="load_content()">Load more stuff</a>
<div id="target"></div>
サーバー上のドキュメントajax.json
は次のようになります。
{
"js": "window.bar = function (){ console.log(\"bar\"); return false; }",
"html": "<p><a href=\"#\" onclick=\"bar();\">Log a message</a></p>"
}
このルートを選択した場合は、次のいずれかを行う必要があります。
- 関数の名前空間:
MyApp.foo = function (){ ... };
、または
- 関数を明示的にグローバル名前空間に追加します:
window.foo = function (){ ... };
.
これはeval
、現在のスコープで実行されるため、関数定義はそのスコープを継承し、グローバルに使用できないためです。私の例では、後者のオプションを選択しましたが、これは些細な例にすぎませんが、なぜこれが必要なのかを認識しておく必要があります。
JavaScript の eval() が悪ではないのはいつですか?を必ずお読みください。これを自分で実装することにした場合。