2012-02-07 76 views
0

我與HTML郵件通道的問題5 一方面我的代碼:頻道消息使用Javascript

<iframe id="ifr" src="receive.html" onLoad="initMessaging()" ></iframe> 
<button onClick="postMsg()">Wyslij</button> 

<script type="text/javascript"> 
var channel = new MessageChannel(); 

channel.port1.onmessage = function (evt) { 
    alert(evt.origin + ": " + evt.data); 
}; 

function initMessaging() { 
    var child = document.getElementById("ifr"); 
    child.contentWindow.postMessage('hello', 'http://localhost:85', [channel.port2]); 
} 

function postMsg() { 
    channel.port1.postMessage('Message sent from ' + location.host); 
} 

而在第二現場:

 <input type="button" value="Post Message" onClick="postMsg();" /> 


<script type="text/javascript"> 
var port = null; 
window.addEventListener("message", function (e) { 
    port = e.ports[0]; 
    port.onmessage = function (e){ 
    port.addEventListener("message", function (evt) {alert("Received message \"" + evt.data + "\" from domain: " + evt.origin); 
    }, false); 
} 
}, false); 


function postMsg() { 
if(port) { 
    port.postMessage("Data sent from " + location.host); 
} 

爲什麼它不工作?我做錯了什麼?

Thx很多幫助!

+0

什麼是您正在實例化的MessageChannel對象?我看到的演示不需要這些。另外,我只注意到根據W3規範,你的port.postMessage調用應該被認爲是port.source.postMessage? – 2012-02-07 13:10:05

+0

我是根據 中的信息創建此代碼的時候,在postMessage。('hello','http:// localhost:85',[channel。 )給postMessage('hello','http:// localhost:85'),所以這是一個關於頻道問題的問題。 – Jimmusiek 2012-02-07 17:15:32

+0

是的,我挖了一點,看到了。我期待看到我能找到的東西。這是一個有趣的問題,因爲我可能必須將其用於項目。 – 2012-02-07 19:33:37

回答

0

我認爲你需要使用一個表單來調用postMessage函數併發送消息。 Here's a tutorial顯示了一個更簡單的方法來完成這項工作。

0

HTML5 postMessage界面不好。我建議一個直觀的。你可以從我的站點下載: http://www.jackiszhp.info/tech/postMSG.html

window.MSG.post(msgname,MSGDATA,arrayOfDomainTarget,arrayOfWindowIDTarget)

這個 '窗口' 可以省略,而不是類似於HTML5 有指定的你需要一個窗口對象。 在這裏,你沒有。這個'窗口'只是表明味精是在全球空間。

msgname是消息類別的名稱。 msgdata是一個JSON對象。它將在發佈之前被串接 arrayOfDomainTarget,arrayOfWindowIDTarget 我使用邏輯AND。最初它是OR 後來我將它改爲AND。更合適。我猜。 ,我讓「*」作爲所有windowID的通配符。

由於瀏覽器知道所有信息,因此調用者的信息在所有參數中都不存在 。 所以我們可以看到這種方法不允許發送者欺騙接收者。

發件人只是打電話如下。

window.name="myWindowID"; 
MSG.post("cmd",{what:'do thing abc',parameter:'the value of a parameter'},["jackiszhp.info"],[*]); 

爲接收器,2件事。

//#1 define the message handler 
function messageHandler(e){ 
var obj=JSON.parse(e.detail); 
obj.name is the msgname = 'cmd' 
obj.data is the msgdata = {what:'fuck',who:'not to tell'}; 
obj.source is the sender 
obj.source.href is the sender's window.location.href 
obj.source.WID is the sender's window.name="myWindowID"; 
obj.target is the target of this event 
obj.target.domains is the target domains of this event 
obj.target.WIDs is the target WIDs of this event 
.... 
} 
//#2 register the message handler 
window.addEventListener(msgname, messageHandler,false); 
or 
document.addEventListener(msgname, messageHandler,false); 

//to respond, 
window.name="hereMywindowID"; 
MSG.post("cmd",{what:'do thing def',parameter:'the value of a parameter'},["jackiszhp.info"],['myWindowID']); 

//clearly, we can see that this response only the original sender can receive it. 
//unless in the target domain, accidently, there are two windows with same ID "myWindowID". 

附加說明:

A.窗口可以被唯一標識。但在這裏,我沒有使用它。我使用window.name來代替。關於窗口ID,你可以查看這個鏈接:https://developer.mozilla.org/en-US/docs/Code_snippets/Windows#Uniquely_identifying_DOM_windows

B.我希望mozilla能把我的界面加入到firefox中。

相關問題