使用postMessage实现跨域的前提条件是一个页面通过<iframe>调用另一个页面,示例如下所示:
在这个示例中,通过outter.html调用inner.html
这是outter.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>outter</title>
</head>
<body>
获取的信息为:
<div id="getMessage"></div>
<iframe src="http://test.inner.com:8080/test/inner.html" frameborder="1"></iframe>
<hr>
要传入内部的信息:<input type="text" id="out"><input type="button" value="点击" id="but">
<script>
var message=document.getElementById("getMessage");
var text=document.getElementById("out");
window.addEventListener("message",function(e){
if(e.data!=null){
message.innerText=e.data;
}
});
document.getElementById("but").onclick=function(){
window.frames[0].postMessage(text.value,"http://test.inner.com:8080");
text.value="";
}
</script>
</body>
</html>
这里显示inner.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>inner</title>
</head>
<body>
外面传进来的信息为:
<div id="getMessage"></div>
<hr>
要传到外面的信息为:<input type="text" id="text"><input type="button" value="传递" id="but">
<script>
var message=document.getElementById("getMessage");
var text=document.getElementById("text");
document.getElementById("but").onclick=function(){
window.parent.postMessage(text.value,"http://test.outter.com:8080");
text.value="";
}
window.addEventListener("message",function(e){
if(e.data!=null){
message.innerText=e.data;
}
});
</script>
</body>
</html>
上面的示例如果你想试用的话,
一、需要在tomcat的webapps下,新建一个test文件夹,在test文件夹下放入inner.html和outter.html。
二、在电脑的hosts文件中配置两个域名127.0.0.1 test.inner.com和127.0.0.1 test.outter.com
三、浏览器访问的URL为 http://test.outter.com:8080/test/outter.html
一、<iframe>后必须为</iframe>,而不能使用<iframe/>
二、获取子窗口对象:document.getElementById("").contentWindow==$("")[0].contentWindow==window.frames[0]
获取父窗口对象:window.parent
三、postMessage的两个参数,第一个参数为想跨域传递的值,第二个参数是作用域,包括协议、域名和端口。这里或者为对应的域名,或者为*,意为对所有域都有效。
四、postMessage的前面定义了由本窗口window向哪个窗口传值。这里是在父window向第一个子window传值。
五、方法addEventListener(type,function,useCapture)前面可为元素、document、window或XMLHttpRequest
type字符串,事件名称,不含"on",比如click,mouseover,keydown等。
message //事件,每接收到一次更新,就会发生onmessage事件。
当为postMessage时,可以用onmessage接受,但是当为sendMessage时,无法用onMessage接收。
useCapture为是否使用事件捕获,一般为false //事件捕获,从上往下,和事件冒泡相反
六、sendMessage和postMessage的区别
postMessage:只负责将消息放入消息队列,不确定何时及是否处理,异步,返回postMessage是否正确执行。
sendMessage:把消息放入消息队列,要等到消息处理完,返回消息处理的返回码(DWord类型)后才继续,同步,返回处理结果。