Html5 - 跨浏览器iframe postmessage - 孩子到父母?

Dan*_*cer 63 javascript jquery html5 jquery-mobile

我一直在关注这个教程 - http://www.youtube.com/watch?v=R2hOvZ7bwXU,它基本上解释了如何使用postmessage在iframe和父级之间安全地传递消息 - 你基本上最终会得到这样的东西 - http://html5demos.com/postmessage2

我的问题是我需要它以相反的方式工作(子到父)并且不知道如何定位父窗口.

这是我的接收者代码(在父母中) -

function handlingMsg(e)
{alert("works")
    if(e.origin == "http://uc.dialogue.net")
        {
                var blah = e.data;
                alert(blah);    
        }
        else{alert("error");}
}
addEventListener("message",handlingMsg, true);
Run Code Online (Sandbox Code Playgroud)

这是由简单表格(在孩子中)触发的发件人功能 -

   var text=$('.srchInput').val();
   window.parent.postMessage(text, "http://uc.dialogue.net");   
Run Code Online (Sandbox Code Playgroud)

我应该以不同的方式定位父母吗?

干杯保罗

Dan*_*cer 103

var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen to message from child window
eventer(messageEvent,function(e) {
    var key = e.message ? "message" : "data";
    var data = e[key];
    //run function//
},false);
Run Code Online (Sandbox Code Playgroud)

在父页面和子页面中的以下内容中使用它 -    

parent.postMessage("loadMyOrders","*");  //  `*` on any domain         
Run Code Online (Sandbox Code Playgroud)

代码从这里复制.

  • 仅仅因为代码是从[David Walsh的博客](http://davidwalsh.name/window-iframe)获得的,而不是至少引用它作为源代码而被低估了. (23认同)
  • 有时你需要使用window.opener.postMessage(); 例如,如果子窗口有一些重定向. (8认同)
  • 对于将来阅读此答案的任何人,请不要包含所有样板垃圾,只有在<= 8时才需要.只需直接使用`addEventListener`即可.http://caniuse.com/#feat=addeventlistener谢谢:) (8认同)
  • 真棒!请注意,在eventer侦听器中,`e.message =="loadMyOrders"` (3认同)
  • 感谢那.虽然在Chrome中我有`e.data =="loadMyOrders"`. (3认同)
  • 作为参考,这是我拒绝的修改,该修改在当今的环境中可以正常工作:http://stackoverflow.com/review/suggested-edits/12256467很好奇看到它由于“与原始意图背离”而被拒绝...我在关于IE8支持的问题中什么都没看到。 (2认同)

Avi*_*ran 25

接受答案的现代简化版本(删除了遗留的ie8支持,使代码更具可读性):

window.addEventListener('message',function(e) {
    var key = e.message ? 'message' : 'data';
    var data = e[key];
    //run function//
},false);
Run Code Online (Sandbox Code Playgroud)

请参阅: