2

我正在使用 postMessage 将消息从 iframe 传输到其父页面。这是我的代码。在 iframe 中:

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

在父页面中:

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

    }
};
});

它在 chrome、firefox 和 IE9/10 中运行良好,但在 IE8 中,错误提示

'data' 为 null 或不是对象。

如何解决?提前致谢。

4

2 回答 2

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;

...使用奇怪强大的||运算符,如果该参数是“真”,它将返回它的第一个参数,如果第一个参数是“假”,它将返回它的第二个参数。由于undefined是假的,在 IE8 和更早版本上,e = e || window.event分配window.evente. 在 IE9+ 和所有其他浏览器上,它只是分配e回自身(无操作)。

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

于 2013-07-12T07:28:10.543 回答
1

console.log旧版本的 IE 不支持。尝试删除线

console.log("message get: "+ e.data);
于 2013-07-12T07:18:48.490 回答