HTML5里实现父子窗体通讯的解决方案

同域名下的例子:

父窗体:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML5通讯API</title>
</head>
<body>
    <h1>通讯示例,相同域名下</h1>
    <iframe width="500" src="http://localhost:63342/socketprj/sub.html" onload="test()"></iframe>
    <div id="showcontent"></div>
</body>
</html>
<script type="text/javascript">
    window.addEventListener("message",function(evt){
        document.getElementById("showcontent").innerHTML = evt.data;
    },false);

    function test(){
        var frm = window.frames[0];
        frm.postMessage("你好,我是父页面访问地址是http://localhost:63342/socketprj/main.html","http://localhost:63342/socketprj/sub.html");
    }
</script>

子窗体:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子页面</title>
</head>
<body>
子页面
</body>
</html>
<script type="text/javascript">
    window.addEventListener("message",function(evt){
        console.log(evt);
        document.body.innerHTML = "父页面过来的数据:" + evt.data;
        evt.source.postMessage("子页面回传过来的信息地址是" + this.location + ",父页面的地址是" + evt.origin,evt.origin);
    },false);
</script>

这种跨域通讯方式其实就是一个事件,这个事件就是message事件,它是window对象下的一个事件,接收信息就是给window对象绑定message事件,event对象的data属性可以获取发送过来的信息,发送信息则是使用postMessage方法了。
如果是跨域,子窗体的代码不变同上,父窗体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML5通讯API</title>
</head>
<body>
    <h1>通讯示例,不相同域名下</h1>
    <iframe width="500" src="http://localhost:8080/sub.html" onload="test()"></iframe>
    <div id="showcontent"></div>
</body>
</html>
<script type="text/javascript">
    window.addEventListener("message",function(evt){
        document.getElementById("showcontent").innerHTML = evt.data;
    },false);

    function test(){
        var frm = window.frames[0];
        frm.postMessage("你好,我是父页面访问地址是http://localhost:63342/socketprj/main.html","http://localhost:8080/sub.html");
    }
</script>
posted @ 2018-04-10 11:51  FE-神鸟  阅读(753)  评论(0编辑  收藏  举报