明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 321万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Javascript 使用postMessage对iframe跨域传值或通信

Posted on   且行且思  阅读(1567)  评论(0编辑  收藏  举报

实现目标:两个网站页面实现跨域相互通信
当前例子依赖于 jQuery 3.0

父页面代码:www.a.com/a.html

复制代码
<iframe id="myIframe" src="http://www.b.com/b.html"></iframe> <script>
var $myIframe = $('#myIframe');
// 注意:必须是在框架内容加载完成后才能触发 message 事件哦
$myIframe.on('load', function(){
    var data = {
        act: 'article',  // 自定义的消息类型、行为,用于switch条件判断等。。
        msg: {
            subject: '跨域通信消息收到了有木有~', 
            author: 'abcdefg'
        }
    };
    // 不限制域名则填写 * 星号, 否则请填写对应域名如 http://www.b.com
    $myIframe[0].contentWindow.postMessage(data, '*');
});

// 注册消息事件监听,对来自 myIframe 框架的消息进行处理
window.addEventListener('message', function(e){
    if (e.data.act == 'response') {
        alert(e.data.msg.answer);
    } else {
        alert('未定义的消息: '+ e.data.act);
    }
}, false);
</script>
复制代码

子页面代码:www.b.com/b.html

复制代码
<script>
// 注册消息事件监听,对来自 myIframe 框架的消息进行处理
window.addEventListener('message', function(e){
    if (e.data.act == 'article') {
        alert(e.data.msg.subject);
        // 向父窗框返回响应结果
        window.parent.postMessage({ 
            act: 'response', 
            msg: {
                answer: '我接收到啦!'
            }
        }, '*');
    } else {
        alert('未定义的消息: '+ e.data.act);
    }
}, false);
</script>
复制代码

或子页面的 按钮直接触发: 

//向父窗框返回结果
window.parent.postMessage({ act: 'response', msg: { answer: '我接收到啦3321!'} }, '*');  

 

 

 

//********************************************************************************************************************************

方案二:

        <script src="../js/layui/layui.js?v=12" charset="utf-8"></script>

   <iframe id="myIframe" src="http://localhost:8633/WebForm2.aspx"></iframe>
    <script>
        layui.use(['form', 'layedit', 'laydate', 'upload', 'element'], function () {
            var form = layui.form,
            layer = layui.layer,
            layedit = layui.layedit,
            laydate = layui.laydate;

            // 注册消息事件监听,对来自 myIframe 框架的消息进行处理
            window.addEventListener('message', function(e){
                if (e.data.act == 'response') {
                    alert(e.data.msg.answer);
                    
                    parent.$('#series_name').val('我被改变了');
                    parent.layer.closeAll(); //疯狂模式,关闭所有层
                      
                } else {
                    alert('未定义的消息: '+ e.data.act);
                }
            }, false);

        });
</script>

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2009-10-18 数据源改变后,BarChart组件的运动效果.
点击右上角即可分享
微信分享提示