'data'为null或不是对象IE8

时间:2013-07-12 07:15:10

标签: javascript jquery internet-explorer javascript-events

我使用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或不是对象。

如何解决?提前谢谢。

2 个答案:

答案 0 :(得分: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.event会将window.event分配给e。在IE9 +和所有其他浏览器上,它只是将e赋予自身(无操作)。

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

答案 1 :(得分:1)

旧版本的IE不支持

console.log。尝试删除该行

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