欢迎来到[自学php网] ①群 AG亚游集团

AG亚游集团 > 前端 > javascript >

iframe跨域如何通信?iframe跨域通信解决方案postMessage

来源:未知 ?? 时间:2019-03-29 10:25?作者:小飞侠

[导读] ?iframe跨域如何通信?iframe跨域通信解决方案postMessage? 在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com...

?iframe跨域如何通信?iframe跨域通信解决方案postMessage?

    在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com 中进行显示,或者相反。


1、postMessage

??postMessage方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。


语法:

otherWindow.postMessage(message, targetOrigin, [transfer]);


otherWindow:其他窗口的引用,如 iframe的contentWindow、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。

message:将要发送到其他window的数据。

targetOrigin:指定那些窗口能接收到消息事件,其值可以是字符串 “*” 表示无限制,或者是一个URI。

transfer:是一串和message同时传递的Transferable对象,这些对象的所有权将被转移给消息的接收方,而发送方将不再保留所有权。

postMessage方法被调用时,会在所有页面脚本执行完毕之后像目标窗口派发一个 MessageEvent 消息,该MessageEvent消息有四个属性需要注意:


type:表示该message的类型

data:为 postMessage 的第一个参数

origin:表示调用postMessage方法窗口的源

source:记录调用postMessage方法的窗口对象

2、搭建框架

/aaff4com/main.html 主页面

/baff4com/iframepage.html 嵌套页面

main.html


<!DOCTYPE html> 
<html>
<head>
<meta charset="utf-8">
<title>iframe+postMessage 跨域通信 主页面</title>
</head>
<body>
    <h1>主页面</h1>
    <iframe id="child" src="/baff4com/iframepage.html"></iframe>
    <div>
        <h2>主页面接收消息区域</h2>
        <span id="message"></span>
    </div>
</body> 
</html>


iframepage.html


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>iframe+postMessage跨域通信 子页面</title>
</head>
<body>
    <h2>子页面</h2>
    <div>
        <h3>接收消息区域</h3>
        <span id="message"></span>
    </div>
</body>
</html>


2、父向子发送消息

main.html

<script>
    window.onload = function(){
        document.getElementById('child')
         .contentWindow.postMessage("主页面消息", 
                "/baff4com/iframepage.html")
    }
</script>


注意:一定是页面加载完成后在发送消息,否则会因为 iframe 未加载完成报错。

Failed to execute ‘postMessage’ on ‘DOMWindow’


子页面接收消息: 

iframepage.html

<script>
    window.addEventListener('message',function(event){
        console.log(event);
        document.getElementById('message').innerHTML = "收到" 
            + event.origin + "消息:" + event.data;
    }, false);
</script>


此时可看到页面中,iframe的子页面中打印了

收到/aaff4com消息:主页面消息

image.png


以及控制台打印了MessageEvent对象。

image.png



3、子向父发送消息

子页收到消息后回复父页面 

iframepage.html

<script>
    window.addEventListener('message',function(event){
        console.log(event);
        document.getElementById('message').innerHTML = "收到" 
            + event.origin + "消息:" + event.data;
        top.postMessage("子页面消息收到", '/aaff4com/main.html')
    }, false);
</script>


父页面收到消息并显示:

window.addEventListener('message', function(event){
    document.getElementById('message').innerHTML = "收到" 
        + event.origin + "消息:" + event.data;
}, false);


image.png

4、完整代码


main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>iframe+postMessage 跨域通信 主页面</title>
</head>
<body>
    <h1>主页面</h1>
    <iframe id="child" src="/baff4com/iframepage.html"></iframe>
    <div>
        <h2>主页面接收消息区域</h2>
        <span id="message"></span>
    </div>
</body> 
<script>
    window.onload = function(){
        document.getElementById('child')
         .contentWindow.postMessage("主页面消息", 
            "/baff4com/iframepage.html")
    }
    window.addEventListener('message', function(event){
        document.getElementById('message').innerHTML = "收到"
         + event.origin + "消息:" + event.data;
    }, false);
</script>
</html>


iframepage.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>iframe+postMessage跨域通信 子页面</title>
</head>
<body>
    <h2>子页面</h2>
    <div>
        <h3>接收消息区域</h3>
        <span id="message"></span>
    </div>
</body>
<script>
    window.addEventListener('message',function(event){
        if(window.parent !== event.source){return}
        console.log(event);
        document.getElementById('message').innerHTML = "收到" 
            + event.origin + "消息:" + event.data;
        top.postMessage("子页面消息收到", '/aaff4com/main.html')
    }, false);
</script>
</html>



最新文章

点击排行

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有AG亚游集团

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

花莲地震19天后 最后两名遇难大陆游客遗体运出 中青在线:对沈阳非舆论审判 是20年前的舆论补偿 梅根哥哥喊话哈里王子取消婚礼未果 又改打温情牌 城围联揭幕战4轮战罢 广西4城市总体胜多负少 拼多多纳斯达克挂牌上市 创始人黄峥:七分靠运气 IPO被否企业三年内不得借壳 壳资源有望分化 在中国援建总部 美国务卿说中国坏话被非盟主席回怼 央视:金英权状态令人遗憾 卡帅临场换人十分英明 午盘:布油突破80美元 美股攀升能源股领涨 国手山脉中国年轻人担纲 廖元赫连破两韩国世冠 关于汉密尔顿,你不知道的10件事儿…… 易信金融:本周欧元波动幅度较大 投资人关注当中机会
湖南原常委张文雄受贿案一审开庭 被控受贿2300万 大团队!强外教!高目标!中国短道队再出发 上港最稳一环!胡尔克都披他球衣 惨被撑成紧身衣 农民久坐公安局长办公室被拘7日 法院判公安赔偿 产业政策人口红利助推 越南正成下个世界制造业中心 昔日NBA得分王全场2分!他上次这么惨还是6年前 妈妈凌晨见儿子房间奇怪一幕 接下来的事让她庆幸 马斯切拉诺猛吹梅西:他现在比赢5金球奖时还强 机构视点 百灵杯首轮遇北京暴雨 韩国队集体迟到被扣用时 中国货轮抵郭川最可能漂流地带 搜寻4小时无果 朝鲜代表团赴韩国参加第12届冬残奥会
印第安维尔斯赛阿扎横扫晋级 次轮将战美网冠军 沈阳的两面:课上举例“睡过了”解释语句不同含义 烂柯杯32强对阵出炉 柯洁战李钦诚聂卫平VS江维杰 日媒:中国监管机构批准东芝出售芯片业务交易 支付宝表示:争取五年内让出境游也能不带钱包 冬季两项世界杯富尔卡德因病退赛 希普林夺冠 监察委员会履行监督调查处置职责 谁来监督监察委 薄熙来孙政才苏荣王三运 在政治上有同一个特点 嫘祖杯第31届名人战开幕 林建超:助推围棋发展 适合女人做的生意 卖什么利润大不压货 2017做什么生意有前景 加盟店排行榜 AG亚游集团