用postMessage解决跨域通信和跨域调用js问题

本文转自:https://bbs.implug.cn/?thread-3.htm
平时做web开发的时候关于消息传递,除了客户端与服务器传值,还有几个经常会遇到的问题:

  • 多窗口之间消息传递(newWin = window.open(…));
  • 页面与嵌套的iframe消息传递。
  • 同域名下可以通过parent调用父级页面的js跨域时如何调用。

这里介绍的方法是用运用postMessage方式解决
发消息方调用postMessage方法发送消息 postMessage是html5引入的API可以更方便、有效、安全的解决这些问题。postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。
收消息方用MessageEvent监听消息。

postMessage(data,origin)方法接受两个参数

  • data:要传递的数据, html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果。
  • origin:字符串参数,指明目标窗口的源, 协议+主机+端口号[+URL],URL会被忽略,所以可以不写,这个参数是为了安全考虑,someWindow.postMessage()方法只会在someWindow所在的源(url的protocol, host, port)和指定源一致时才会成功触发message
  • event,当然如果愿意也可以将参数设置为"*",someWindow可以在任意源,如果要指定和当前窗口同源的话设置为"/"。

MessageEvent的属性

  • data:顾名思义,是传递来的message
  • source:发送消息的窗口对象
  • origin:发送消息窗口的源(协议+主机+端口号)。

同域父子页面间通讯

代码示例:

父页面a.html:

    // localhost:9011/a.html
    

page A

子页面b.html

    //> localhost:9011/b.html
    

page B

跨域父子页面间通讯

父页面a.html:

   //> localhost:9011/a.html
   

page A

子页面b.html

    //> localhost:9022/b.html(两个页面端口号不同.为跨域的一种)
    

page B

通过上面的两个例子我们已经解决了,传递消息和跨域传递消息,那么怎么跨域调用JS呢。 原理很简单,就是把需要在另一个页面执行的js代码写成字符串用postMessage方法传递过去,然后另一个页面接收到后用eval()直接执行这段代码。

示例跨域情况下子页面让父页面alert(“hello!”);:

父页面a.html:

 //> localhost:9011/a.html
 

page A

子页面b.html

    //> localhost:9022/b.html(两个页面端口号不同.为跨域的一种)
    

page B

本文转自:https://bbs.implug.cn/?thread-3.htm

你可能感兴趣的:(web)