怜惜月110 2015-01-09 06:27 采纳率: 100%
浏览 2779
已采纳

JS HTML5跨域跨窗口通信postMessage问题求帮助

 this.exportUnits = d;
                 var g = "status=no,resizable=no,scrollbars=yes,personalbar=no,directories=no,location=no,toolbar=no,menubar=no,width=760,height=530,left=60,top=80";

                 this.popupWindow = b.open(a.settings.multiPopupUrl, "", g);
                 if (this.exportUnits && this.exportUnits.length) {
                     var bs = JSON.stringify(this.exportUnits);
                     this.popupWindow.postMessage(bs, a.settings.multiPopupUrl)
                 }


上述代码是打开一个新窗口同时postMessage一段消息到弹出的新窗口,但是弹出的新窗口有时收到有时收不到,收到的几率很少,求大神帮助

下面是新窗口接收的代码

 function loadImg() {
     window.addEventListener("message", receiveMessage, false);
 }
 function receiveMessage(event) {
     alert(event.origin);
     alert(event.data);
     alert(event.source);
 } 
  • 写回答

4条回答 默认 最新

  • Go 旅城通票 2015-01-09 07:23
    关注

    你哪时注调用loadImg()这个放在注册onmessage事件的?不会是在body的onload事件中吧。。这样注册事件太晚了,你是打开窗口后就直接发信息了,你打开的窗口可能都还没注册onmessage事件先

    注册onmessage事件不要放到onload中,script直接放到head标签中进行注册

     <head>
     function receiveMessage(event) {
         alert(event.origin);
         alert(event.data);
         alert(event.source);
     } 
    window.addEventListener("message", receiveMessage, false);
    </head>
    

    延时发送信息。这个延时时间不好确定,应为打开的页面依赖于网速,要是很慢,10多s才打开延时也无效了。。最好是发送信息的页面也注册onmessage事件,然后被打开的页面注册好事件后发送信息过来通知说我注册号事件了,你再发送信息过去。。这个逻辑你自己实现了,也不难~

      if (this.exportUnits && this.exportUnits.length) {
                    var me=this;
                    setTimeout(function(){
                  var bs = JSON.stringify(me.exportUnits);
                  me.popupWindow.postMessage(bs, a.settings.multiPopupUrl)
                    },1000);//延时1秒发送信息
     }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥15 如何修改pca中的feature函数
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况