2013-01-11 39 views
1

我創建了一個friendly iframe(同一個域),並用JavaScript將它添加到DOM。它在我的頁面上可見。檢查HTML看起來像:在IE中訪問友好的iframe內容

<iframe id="test_frame" frameSpacing="0" height="100" src="javascript:window['contents']" width="100" name="test_frame"> 
    <!DOCTYPE html> 
    <html> 
    <head> 
     <title>test_frame</title> 
     <base target=_top> 
    </head> 
    <body style="margin: 0px; padding: 0px"> 
     <p>Hello World</p> 
    </body> 
    </html> 
</iframe> 

然後我跑了,爲了下訪問標記中的iframe的<body>

alert(window.frames["test_frame"].document.body.innerHTML); 

其失敗的Internet Explorer 6-10因爲bodynull 。 iframe的document對象存在,但似乎沒有可讀屬性。其他瀏覽器只顯示字符串<p>Hello World</p>

但有趣的是,在IE 6-10以下工作,和所有其他瀏覽器:

window.setTimeout(function(){ 
     alert(window.frames["test_frame"].document.body.innerHTML); 
    }, 1); 

據我所知setTimeout執行在全球範圍內傳遞的功能。所以,我嘗試使用call但它工作:

(function(){ 
     alert(window.frames["test_frame"].document.body.innerHTML); 
    }).call(window); 

其中,在包裝的setTimeout代碼,我已經看到了類似的情況下,解決了IE iframe中的困難。 這個在IE中背後的機制或邏輯是什麼?有沒有適當的解決方法?

上面的測試是在標準模式下運行的,沒有發現其他錯誤。

+0

你什麼時候調用該方法?內容可能尚未加載。 –

回答

1

什麼是在IE背後的機制或邏輯?有沒有適當的解決方法?

機制非常簡單:等待一個毫秒(實際上是四個),然後嘗試訪問iFrame。

時間就是一切。如果你打電話太快,你會看到一個空的iFrame。即使src是javascript代碼,您也必須讓代碼運行。


  • 如果您訪問的iFrame它在DOM遇到剛過:最有可能是空的。它還沒有從互聯網上獲取。 即使srcjavascript:...,iFrame也將爲空

  • 如果您在頁面加載後1毫秒內完成,最有可能的是它還沒有被提取。但是,如果它位於瀏覽器緩存中(通常不應該是頁面),或者它是一個數據(或JavaScript,在你的情況下)URL,但是,這可能會起作用(雖然沒有任何理由)。此時可能已經存在document.body元素 - 即使它是空的。

  • 預期的工作流程是您等待iFrame load事件。您可以在創建iFrame或設置其src後安全地附加它。查找跨瀏覽器的事件消息這可靠是一個棘手的問題,但load應該跨瀏覽器工作。

  • 如果load事件未能足夠晚,請等待一個額外的毫秒。這不應該是必要的,但IE中可能存在一個愚蠢的錯誤(我認爲不存在)。

  • 它是你從控制檯發射它,這應該是成功的。事實上,根據我的觀察,情況一直如此。