2012-03-14 117 views
4

規範說,我應該能夠在窗口對象上使用postMessage()。 Mozilla says,我應該可以在open()的窗口上做到這一點。HTML5是否支持跨窗口消息?

但是,我已經採取了羅伯特尼曼的postMessage示例,並試圖使其工作across windows。但是,IE10和Chrome都不能爲新打開的窗口提供postMessage函數。

var target = … // original declaration 
popoutbutton.onclick = function(evt) { 
    realWin = window.open(iframeWin.frameElement.src, "window1", "width=600,height=400,status=yes,scrollbars=no,resizable=yes"); 
    target = realWin; 
    target.focus(); 
}; 

// …snip… 

target.postMessage(myMessage.value, expectorigin); // <-- fails because target.postMessage() is undefined 

我是否錯過了某些東西,或者這個功能根本不存在嗎?

- 更新如下 -

的開發者預覽版只是似乎並沒有做到這一點。我再次嘗試與消費者預覽。 IE10(build 8250)像預期的那樣。謝謝你的幫助!

+1

你舉的例子在這裏工作在Opera – Andre 2012-03-14 14:21:11

+0

您正在使用哪個版本的Opera?彈出窗口在我的安裝版本11.61上不起作用。 – 2012-03-14 14:45:04

+1

你能爲我們創建一個小的JSFiddle演示程序嗎? – Domenic 2012-03-14 15:05:19

回答

0

我可以讓它在Chrome 15.0.874.121工作,儘管你的樣品中,你在呼喚target.postMessage你已經打開了窗口前,雖然你已跳過任何代碼最初設定target

在新窗口中的內容加載之前(或至少加載足夠的事件監聽器來連接),您可能還會遇到調用postMessage的問題。所以當沒有任何事情真的在聽時,事件就會被解僱。您可能需要在此場景中添加等待以確保新加載的窗口已加載。

在Internet Explorer 10中,我收到錯誤SCRIPT16388:每當我嘗試腳本時都會中止操作 - 即使我等待10秒鐘。

+0

以前。現在它在Opera,我怎麼之前錯過?驗證和Chrome的工作了。 – 2012-03-14 20:37:03

+0

我發現這個IE10的bug太多,當打開的窗口中試圖調用父和這個人會做它發生postMessage。解決這個問題的技巧是將postMessage包裝在一個setTimeout 0ms中,我會跟進Internet Explorer,看看爲什麼會發生這種情況。 – jsgoupil 2012-12-07 21:17:35

1

有比postMessage的更好的方法,請參閱本:

http://carlosaguayo.posterous.com/html5-localstorage-events-cross-window-messag

+0

這是個好主意。然而,我不相信這實際上比直接發送消息更好。 – 2012-04-24 22:08:22

+1

因爲您不需要保留對窗口的引用,所以更好。假設用戶由於某種原因刷新窗口,彈出窗口或父窗口,那麼引用就消失了,所有的邏輯都會中斷。使用localStorage,你不需要跟蹤彈出窗口。 – 2012-07-28 03:59:15

+0

跨窗口廣播模式打開了令人頭痛的世界。想象一下,聆聽「添加聯繫人」消息。現在想象你有兩個標籤打開到同一頁面。除非你管理競爭條件,哪個標籤是「主人」,否則你會得到重複的增加。另外:朋友不要讓朋友使用Pop-Ups。 – 2013-06-17 19:19:45