它看起來像這可能是一個問題,在發送信號時未加載子iframe,因此iframe.src沒有正確的值。
我做了一些測試,並得到了與您相同的錯誤,但是當我在setTimeout中包裝postMessage調用並等待100ms時,則沒有錯誤,這告訴我這是一個初始化競爭條件。
下面是如何實現的,而不setTimeout的一個清潔的解決方案:
家長:
window.addEventListener("DOMContentLoaded", function() {
var iframe = document.querySelector("iframe")
, _window = iframe.contentWindow
window.addEventListener("message", function(e) {
// wait for child to signal that it's loaded.
if (e.data === "loaded" && e.origin === iframe.src.split("/").splice(0, 3).join("/")) {
// send the child a message.
_window.postMessage("Test", iframe.src)
}
})
}, false)
兒童:
window.addEventListener("DOMContentLoaded", function() {
// signal the parent that we're loaded.
window.parent.postMessage("loaded", "*")
// listen for messages from the parent.
window.addEventListener("message", function(e) {
var message = document.createElement("h1")
message.innerHTML = e.data
document.body.appendChild(message)
}, false)
}, false)
這是一個簡單的解決方案,其中,孩子會發信號給任何人它被加載(使用「*」,這是可以的,因爲沒有敏感的被髮送。)父母監聽一個加載的事件並檢查它是它的孩子在這發射它。
父母然後發送消息給準備接收它的孩子。當孩子得到消息時,它將數據放入<h1>並將其附加到<主體>。
我在Chrome中使用實際的子域名測試了此解決方案,該解決方案適用於我。
只是爲了澄清,在你的實際代碼中,你使用的是真實的網站嗎? –