2013-07-12 115 views
2

我使用postMessage将消息从iframe传输到其父页面。这是我的代码。 在IFRAME:'data'为空或不是对象IE8

$(".history_date").click(function(event) { 
    window.top.postMessage($(this).text(), "*"); 
}); 

在父页面:

$(function(){ 
window.onmessage = function(e){ 
    if(e.data){ 
     //do something 

    } 
}; 
}); 

它运作良好,在Chrome,火狐和IE9/10,但在IE8中,错误indecates

'数据'为空或不是对象。

如何解决?提前致谢。

+2

*“**'data'**为空或不是对象”*?不是'e'?因为你的代码在尝试使用它之前已经清楚地测试了'e.data',并且如果'data'为'null',那么测试将会是'false'。 –

回答

9

IE8 仍然缺乏DOM2事件附件,仍然使用,而不是一个它传递到事件处理程序的全球event对象。你说错误是'data' is null or not an object,你确定它不是'e' is null or not an object

如果是,那么这应该修复它:

window.onmessage = function(e){ 
    e = e || window.event; 
    if (e.data) { 
     // ... 
    } 
}; 

在IE8和更早版本,没有参数传递到事件处理程序。而是查看全局变量event(全局变量也是window对象的属性)。因此,在IE8及更早版本上,e将为undefined,而在IE9 +和所有其他浏览器上,e将成为事件对象。

所以这行:

e = e || window.event; 

...使用the curiously-powerful || operator,如果这样的说法是,这将返回它的第一个参数“truthy,”或者如果第一第二个参数是“falsey。”由于undefined是错误的,在IE8及更早版本上,e = e || window.eventwindow.event指定为e。在IE9 +和所有其他浏览器上,它只是将e指定为自己(无操作)。

这是代码中的一种常见模式,必须与IE8和更早版本以及将事件对象传递到处理程序的浏览器进行交互。

+0

酷!它的答案是固定的。你能解释一下“e = e || window.event;”真的吗?我是新来的JavaScript和jQuery。非常感谢你。 – Leoest

+0

+1 Nicely说。 – Praveen

+1

@Leoest:很高兴帮助。我已经编辑了答案来解释这一行更多。 –

1

console.log在较早版本的IE中不受支持。尝试删除线

console.log("message get: "+ e.data); 
+0

@ user1900888'e'包含什么? – Praveen

+1

@ user:如果您打开开发工具,则IE8具有'console.log'。 (如果你不这样做,则不会) –

+0

没有别的。我没有指定e。 – Leoest