window.postMessage() 方法可以安全的进行跨域、跨页面通信。
window.postMessage() 需要在页面加载完毕后才能进行跨域通信,但是我们无法检测目标页面的onload事件,所以只能使用setTimeout和setInterval来处理。
发送消息
otherWindow.postMessage(message, targetOrigin, [transfer])
其中otherWindow是其他窗口的一个引用,而不是当前窗口。
获得其他窗口的引用:
- iframe的contentWindow属性
- 执行window.open返回的窗口对象
- 命名过或数值索引的window.frames。
接受三个参数:
- message 要发送的信息(字符串和对象都可以)
- targetOrigin 你要发送信息的目标域名
- transfer 可选参数
接收消息
其他窗口可以监听派遣的message:
window.addEventListener("message", receiveMessage, false);
收到的MessageEvent有以下几个属性:
- data:从其他window中传递过来的对象
- origin:调用 postMessage 时消息发送方窗口的 origin
- source:对发送消息的窗口对象的引用; 您可以使用此来在具有不同origin的两个窗口之间建立双向通信。
安全问题
- 如果您不希望从其他网站接收message,请不要为message事件添加任何事件侦听器。
- 如果您确实希望从其他网站接收message,请始终使用origin和source属性验证发件人的身份。
- 当您使用postMessage将数据发送到其他窗口时,始终指定精确的目标origin,而不是*。