2011-09-08 15 views
1

我使用這種結構中的iframe其高度發送到父窗口:HTML 5 PostMessage的歌劇11.x的

<body onload="parent.postMessage(document.body.scrollHeight, '*');"> 
    ... 
</body> 

存在父窗口的監聽器:

function resizeCrossDomainIframe(id) 
{ 
    var iframe = document.getElementById(id); 
    window.addEventListener('message', function (event) 
    { 
     if (isNaN(event.data)) return; 
     var height = parseInt(event.data); 
     iframe.height = height + "px"; 
    }, false); 
} 

<iframe id="voice-iframe" scrolling="no" frameborder="0" onload="resizeCrossDomainIframe('voice-iframe');" src="http://localhost:2040/VoiceApi/Base"> 
</iframe> 

此代碼工作在ff,chrome,safari中,ie9,可能在ie8中,但不在歌劇11中(儘管蜻蜓中沒有顯示錯誤)。 我認爲會有一些問題,但不是與最後版本的歌劇。 或者我正在做錯誤?

+0

問題在於opera中的postmessage是文檔的方法,而不是window的。 – donRumatta

+0

這是不正確的(再) - 最初的實現是在文檔上,但它已更改爲window.postMessage()很久以前 – hallvors

回答

0

我想的onload火災的IFRAME第一,的postMessage(),那麼就會造成一個消息事件發生,最後在IFRAME在onload 屬性將觸發。如果您從IFRAME標籤的加載處理程序中添加事件偵聽器,您可能會在開始偵聽郵件發送後收到,因此您將不會收到任何內容。

+0

我明白,但一切工作在ff,鉻和ie,所以我認爲這條消息被放入一個隊列不知何故,並由父窗口後來處理,但在歌劇它丟失。 – donRumatta

+0

如果您依賴於跨幀事件處理的特定時間,那麼您幾乎可以在不同瀏覽器,網絡條件等方面詢問競爭條件和難以調試的問題。嘗試避免競爭條件和對時序敏感的代碼JavaScript,最終你會減少灰色頭髮:) – hallvors

+0

(也就是說,Opera *應該*嘗試將它的事件處理順序與其他瀏覽器的做法一致,並且我會報告一個錯誤。在JavaScript中很少被大多數開發人員所理解,因此也是一個值得注意的有趣話題。) – hallvors