欢迎来到[自学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

俄媒称俄军苏57战机配环视四周雷达 可探测美军F22 牛汇:港币屡触弱方兑换区间 香港金管局能否力挽狂澜 富士康IPO三亿承销费花落中金 大投行洗牌加剧 第七届衢州烂柯杯开幕 林建超:在多背景下举行 “金砖国家”概念提出者:美国发动贸易战 非常愚蠢 航空业迎来空中上网时代 WiFi是盈利点还是负担? 央视:惨败让索萨认清亚洲足球 权健防守出大问题 深圳拟立法:海域使用权或可公开拍卖出让取得 美法官:美商务部指责华裔女子为间谍系无中生有 皇马新星不满被齐达内换下 替补席怒扔外套|图 特斯拉财报前夕 空头已经吹响集结号 “三鼻孔”女孩16年来靠嘴呼吸 手术切除一个鼻孔
阿里将全资收购饿了么 外卖市场已变成美团对决阿里 韩美开启自贸谈判 美以重课钢税施压 中国核潜咋突破第一岛链?专家:提升潜射导弹射程 拉美“银三角”制毒链条调查:面积20万平方公里 比利时淘汰赛8强出炉 皮特斯出局考赛茨成本土希望 多米尼加2-3韩国 主帅:不满意 表现不如昨天 外媒:俄美互抓间谍或将引发新一轮军备竞赛 EIA原油库存超预期大降615万桶 美油短线拉升近1美… 21+8!勇士一逆风球就给他 核武器平时不乱使 年内落实 政府工作报告布置的8项任务有时间表了 NBA历史纪录又被刷新!本季是不是该给他发个奖 分众传媒江南春:独角兽做第一需要打赢消费者认知战
太原检察院原检察长周茂玉被降为正处非领导职务 美参院通过削减1700项产品关税草案 近半产自中国 台湾彰化一家工厂发生火灾 已扑灭无人员伤亡 悦跑圈宣布完成C轮1亿元融资 创世伙伴资本领投 香港沙田发生疑似袭警抢枪案 两名警察受伤(图) 受降雪影响 北京4日晚高峰严重拥堵 医生给患者注射过期药 称“能用5年”被暂停执业 中美经贸只是暂时停战? 外交部:不希望出现反复 跳水世青赛中国队夺走14冠 练俊杰男子十米台折桂 白手起家什么意思 养20头牛一年赚多少钱 笨蛋也能年赚100万 养20头牛一年赚多少钱 AG亚游集团