(2011/3/29追記:Firefox4の実行結果を追加)
JavaScriptによって動的にscript要素を追加する場合の、追加方法の違いによるブラウザごとの挙動を調べた。
調査に使ったJavaScript(HTML5なのでtype属性は省略してある。)
<script>
function test(value) {
document.getElementById("test").value += value + ",";
}
window.onload = function() {
// innerHTMLに外部JSの読み込みを突っ込む
try {
var div1 = document.createElement("div");
div1.innerHTML = '<script src="test1.js"><' + '/script>';
document.body.appendChild(div1);
} catch(e) {
}
// createElementでscript要素を生成して外部JSを読み込む
try {
var script2 = document.createElement("script");
script2.src = "test2.js";
document.body.appendChild(script2);
} catch(e) {
}
// innerHTMLに生のJSを突っ込む
try {
var div3 = document.createElement("div");
div3.innerHTML = '<script>test(3);<' + '/script>';
document.body.appendChild(div3);
} catch(e) {
}
// createElementで生のJSを追加する
try {
var script4 = document.createElement("script");
script4.innerHTML = "test(4);";
document.body.appendChild(script4);
} catch(e) {
}
};
</script>
test1.js
test(1);
test2.js
test(2);
処理が実行されたら、表示用のテキストボックス(id="test")に番号が表示される。
結果は下記の通り。
ブラウザ | 1 | 2 | 3 | 4 | 表示順 |
IE 6/8 | X | O | X | X | 2 |
Firefox 3.6 | O | O | O | O | 1→2→3→4 |
Firefox 4.0 | X | O | X | O | 4→2 |
Chrome 4 | X | O | X | O | 4→2 |
Safari 4 | X | O | X | O | 4→2 |
Opera 10.53 | X | O | X | O | 2→4 |
innerHTMLにscript要素を入れるのはFirefox3.6以外では動かない。(セキュリティ的な施策?)
Firefoxでしか動作確認していないと嵌りそうだ。(というか嵌った。)
IEのことを考えると、生のcreateElementで生成したscript要素に生のJavaScriptを書くやり方も使えない。
(そんなことが必要になるケースは無いかもしれないが。)
素直にcreateElementで外部JSを読み込むのが良いようだ。
(2011/3/29 追記)
innerHTMLに生のJavaScriptを入れる方法としてinnerHTMLでscriptする - Thousand Yearsの方法があったようだ。
しかし現在のブラウザでは、IE8では動作したが、Firefox4、Chrome10、Safari5、Opera11では動作しなかった。
0 件のコメント:
コメントを投稿