スクリプト ブロックをドキュメントに動的に追加しようとしています。これを行うと、スクリプト ブロックが実行されません。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
elem.innerHTML = tmpStr;
hello("World");
</script>
</body>
上記のコードは機能しません。別の投稿 (動的にロードされた JavaScript ブロックをどのように実行しますか? ) で、innerHTML にスクリプトを追加すると実行されないという回答を見ました。innerHTML を直接使用する代わりに、この innerHTML で div を作成し、appendChild を使用してスクリプトを追加します。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
hello("World");
</script>
</body>
しかし、この解決策も私にはうまくいきませんでした。
別の返信で、スクリプト要素を取得し、eval を使用して実行する必要があることを再度確認しました。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
var scripts = newdiv.getElementsByTagName('script');
for (var ix = 0; ix < scripts.length; ix++) {
eval(scripts[ix].text);
}
hello("World");
</script>
</body>
このソリューションは私にとってはうまくいきます。
しかし、これを関数で行うと、機能しません。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
function createFunction(){
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
var scripts = newdiv.getElementsByTagName('script');
for (var ix = 0; ix < scripts.length; ix++) {
eval(scripts[ix].text);
}
hello("World 1");
}
createFunction();
hello("World 2");
</script>
</body>
スクリプトが評価された後、関数が使用可能であることがわかります。関数 createFunction で使用できます。createFunction() スコープ外では、hello() は使用できません。
私は何を間違っていますか?非常に基本的なものが欠けていますか?確認して助けてください。
ありがとう、ポール
PS私はjQueryを使用していません。これをテストするためにクロムを使用しています。