2011-09-08 26 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