javascript で src 無しの <iframe> とその中身を構築した際、はまったことがあったのでメモ。
[サンプルコード]
- 動的に追加した <iframe> の中身をいじる際は、
iframe.contentWindow.document の document.write() を使う
または
<iframe> のロード完了を待つ。(<iframe> 自身に onload イベントがある) - <iframe> に onload イベントを設置する際は、DOM への追加前に行う。
DOM に <iframe> を追加した瞬間、onload イベントが処理されるブラウザがあるため (Chrome)
[サンプルコード]
// 単純化のため、jquery 使用
// 良い例
// IE:OK / Firefox:OK / Chrome:OK
$(function(){
$('<iframe>').load(function(){
// ロード完了後、DOM を変更できる。
var ibody = this.contentWindow.document.body;
$(ibody).append('<div>ブロック要素</div>');
}).appendTo('body');
// イベント設置後に DOM へ追加
});
// 悪い例(1)
// IE:OK / Firefox:NG / Chrome:OK
// Chrome は iframe の DOM 追加後、即時ロード完了する模様
// IE は iframe のロード完了を待たなくても大丈夫っぽい??
$(function(){
var iframe = $('<iframe>').appendTo('body');
var ibody = iframe[0].contentWindow.document.body;
$(ibody).append('<div>ブロック要素</div>');
});
// 悪い例(2)
// IE:OK / Firefox:OK / Chrome:NG
// Chrome は iframe が即時ロード完了するので、DOM 追加後に load イベントを付けても無意味
$(function(){
var iframe = $('<iframe>').appendTo('body');
iframe.load(function(){
var ibody = this.contentWindow.document.body;
$(ibody).append('<div>ブロック要素</div>');
});
});
[環境]
- Windows 7 64bit
- Internet Explorer 11
- Firefox 42.0
- Chrome 48.0.2564.8
0 件のコメント:
コメントを投稿