iframe
要素をできるだけ早くdocument.body
に追加しようとしています。document.bodyが私のreadyStateロジックでnullになるのはなぜですか?
エラーレポートは、Chrome、Safari、FF、IE - さまざまなバージョンのすべての4つの主要ブラウザで表示されますが、document.body
はnull
です。 JSファイルがキャッシュされてすぐに読み込まれると、これが起こると思います。ここで
はiframe
を挿入するためのロジックです:
private loadIFrame(): void {
switch (document.readyState) {
case 'uninitialized':
case 'loading':
case 'loaded':
window.addEventListener('DOMContentLoaded',
this.appendIFrame.bind(this)
)
break
case 'interactive':
case 'complete':
default:
this.appendIFrame()
}
}
private appendIFrame(): void {
if (document.getElementById('iframeId')) {
return
}
let iFrame: HTMLIFrameElement = document.createElement('iframe')
iFrame.src = document.location.protocol + this.ORIGIN + '/iframe.html'
iFrame.id = 'iframeId'
// document.body is null here
document.body.appendChild(iFrame)
}
私は、これは野生で出起こるか推測する私の葉クリーンな環境で問題を再現に苦労しています。
私はもともとrreadyState
ロジックを試しましたが、loading
の状態では、はundefined
でした。問題はdefault
ケース尋問の私の現在の行
private loadIFrame(): void {
switch (document.readyState) {
case 'uninitialized':
case 'loading':
window.addEventListener('DOMContentLoaded',
this.appendIFrame.bind(this)
)
break
case 'loaded':
case 'interactive':
case 'complete':
default:
this.appendIFrame()
}
}
....
- ですか?イベントリスナーを追加する必要がありますか?イベントリスナーがデフォルトになるように、ケースの順序を変更できますか?
DOMContentLoaded
イベントでbody
はnull
ですか?document.readyState
の他の値が落ちている可能性はありますか?
いくつかの参照を追加します。私はDOMContentLoadedがbodyが定義されることが保証されている最も早い時期に正しいイベントだと考えています:https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded また、すべてのブラウザが使用するわけではないことを認識してreadStatesの5つすべて。最新の標準は3つしかありません:https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState – theUtherSide
「初期化されていない」状態と「ロードされた」状態を持つIEの参照です。私には、これは、解析が完了していないため、ボディが「ロード済み」状態で使用できないことを示しています。 https://msdn.microsoft.com/en-us/library/ms534359(v=vs.85).aspx – theUtherSide