postMessage()
这是H5引入的一个API,可以实现跨文档、多窗口、跨域消息的传递。
postMessage(data,origin)方法
- data:要传递的数据
- origin:字符串参数,只目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写
- 如果要传递给所有窗口,值可以为"*"
- 如果传给当前窗口同源的话,值可以为"/"
message
当使用postMessage传递数据的时候,目标源可以使用message方法来接受传递过来的数据
message方法
window.addEventListener('message',function(e){
console.log(e.data);
})
- 该方法的参数e中有几个属性必须了解:
- e.data 指的是传递过来的数据
- e.origin 指的是发射源的域
实战举例
向同源发射信息(非跨域)
window.postMessage('nihao','/');
window.onmessage = function(e){
console.log(e.origin);//当前源的域
console.log(e.data);//传递过来的数据'nihao'
}
跨域发送信息
- 先起两个服务,a.html起在localhost:3000上,b.html起在localhost:4000上
//a.html
<body>
<iframe src="http://localhost:4000/b.html" frameborder="0" id="frame" "load()"></iframe>
<script type="text/javascript">
function load(){
let frame = document.querySelector('#frame');
console.log(frame);
frame.contentWindow.postMessage('我叫俞华','http://localhost:4000')//向端口为4000的域发送内容"我叫俞华"
}
window.onmessage = function(e){
console.log(e.data)
}
</script>
</body>
//b.html
<body>
aaa
<script type="text/javascript">
window.onmessage = function(e){
console.log('eeeeeeeee',e)
console.log(e.data);
//向父级(发射源)发送消息
e.source.postMessage('你好','http://localhost:3000');
}
</script>
</body>
实现跨域的9种方法
- jsonp
- cors
- postMessage
- document.domain
- window.name
- location.hash
- http-proxy 后续会有详细文章阐述
- nginx 后续会有详细版块阐述
- websocket