使 postMessage() 和 addEventListener() 与 IE8 兼容

Making postMessage() and addEventListener() compatible with IE8

我正在做一个需要同时使用 postMessage()addEventListener() 的项目,但我们希望应用程序与主要浏览器兼容。因为仍然有人(是的,他们存在,是的,他们应该被烧毁)使用 Internet Explorer 8,我们需要使以上两种方法兼容。

我编写了下面的代码,它通过使用 attachEvent() 而不是 this answer. However, postMessage() is still not working and therefore I added in a timeout, as suggested on this website 中的建议来使 addEventListener() 兼容。这是行不通的,我真的很难使应用程序兼容。它不会抛出任何错误,我还可以看到我的应用程序已将消息发送到 iframe 源,但该消息从未得到处理。

<script type="text/javascript">
    function ready()
    {
        window.setTimeout(function() {
            document.getElementById("editor").contentWindow.postMessage("A", "domain here");
        }, 0);
    }

    function receiveMessage(event)
    {
        if (event.origin !== "domain here")
            return;
    }

    window.setTimeout(function() {
        if (window.addEventListener) {
            window.addEventListener("message", receiveMessage, false);
        }
        else {
            window.attachEvent("message", receiveMessage);
        }
    }, 0);
</script>

我的第二个页面(正在 iframe 中加载)上有一个类似的脚本,它接收消息并发回消息。所有主流浏览器都可以发送和接收这两条消息,所以问题是:如何使上述脚本与 Internet Explorer 8 兼容?

再一次:我同意我们不应该关心使用 Internet Explorer 8 的人,而应该烧掉他们仍在使用它:然而,这将意味着我们将不得不烧掉我们的客户,这是我们做不到的。所以是的,我真的需要让它兼容。

如果您想知道:getElementById("editor") 捕获定义如下的 iframe:

<iframe src="frameListener.html" class="editor" id="editor" onload="ready()"></iframe>

您缺少 "on"

window.attachEvent("onmessage", receiveMessage);