我試圖儘快將iframe
元素添加到document.body
中。爲什麼document.body與我的readyState邏輯?
錯誤報告會在所有4級主要的瀏覽器(Chrome瀏覽器,Safari瀏覽器,FF,IE├57類版本)進來,我們看到的是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
狀態下看到document.body
是undefined
。
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()
}
}
我現在質疑的行....
- 是問題的
default
情況?我應該在那裏添加事件監聽器嗎?我可以修改案例的順序,以便事件偵聽器是默認的? - 是否有可能
body
是null
上DOMContentLoaded
事件? - 是否有可能有其他值
document.readyState
正在通過?
添加幾個參考。我相信DOMContentLoaded是當身體是保證被定義最早的時間正確的事件:https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded 同時,認識到並不是所有的瀏覽器使用所有5個readStates。最新的標準只有3個:https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState – theUtherSide
這裏是具有「未初始化」和「加載」狀態爲IE設計的參考。對我來說,這表明body在「已加載」狀態下不可用,因爲解析不完整。 https://msdn.microsoft.com/zh-cn/library/ms534359(v=vs.85).aspx – theUtherSide