html5关于外链嵌入页面通信问题(postMessage解决跨域通信)


Posted in HTML / CSS onJuly 20, 2020

说起来挺简单的,可以直接去查询postMessage推送和window.addEventListener接收使用方式,能自己搞明白是最好的,本文章也只是记录一下自己的使用方式
使用postMessage推送和window.addEventListener接收
原理:

发送方使用postMessage方法向接收方推送消息,第一个参数为推送的内容,第二个参数是允许被访问的域名;

接收方通过监听message的方法接收数据。

实现跨域就需要有两个不同源的服务器咯

开始

iframe引入页面(我也是使用这样方式)

父页面(发送方)

<script>
//这里是发送监听
        function btnClick(params) {
            console.log(1111)
            var iframe = document.getElementById("childframe")
            iframe.contentWindow.postMessage({
                text:'你收到了没有呀(白天)',
                action : 'light'  // action : 自定义动作参数,用于接受收消息是的判断
             }, 'http://localhost:8000/#/');
           
        }
   
        function btnClick2(params) {
            console.log(2222)
            var iframe = document.getElementById("childframe")
            iframe.contentWindow.postMessage({
                text:'你收到了没有呀(黑夜)',
                action : 'dark'  // action : 自定义动作参数,用于接受收消息是的判断
             }, 'http://localhost:8000/#/');
             
    //这是接收子页面返回的监听(当时也是被各种文章搞的很懵圈呀,如果只父页面发送消息不需要在接收子页面的反馈可以不用写这些)
     window.addEventListener('message', function (e) {
            alert(e.data)
            const data = e.data;
            console.log(data,'接到你的页面了data')
        }) 
            //下面这些都是踩过的坑
            // var iwindow = iframe.contentWindow;
            // var idoc = iwindow.document;
            //  console.log("window",iwindow);//获取iframe的window对象
            //  console.log("document",idoc); //获取iframe的document
            //  console.log("html",idoc.documentElement);//获取iframe的html
            //  console.log("head",idoc.head); //获取head
            //  console.log("body",idoc.body); //获取body
            // console.log(window.frames['myframe'].window)
        }
    </script>
<body>
    <button onclick="btnClick()">点击</button>
    <br/>
    <button onclick="btnClick2()">点击</button>
 
    <iframe name="myframe" src ="http://localhost:8000/#/home1?type=light" id="childframe" width="1400px" height="800px">
</body>

关于发送简单解释一波:

<iframe name="myframe" src ="http://localhost:8000/#/home1?type=light" id="childframe" width="1400px" height="800px">

这里里面的src是子页面的地址(这里是根据你自己写的路由或者那个页面要监听写的地址)。

postMessage({ text:'你收到了没有呀(黑夜)', action : 'dark' }, 'http://localhost:8000/#/')

第一个参数是内容,第二是子页面的地址,这里可以只写项目地址就可以还有写的(例如:postMessage(‘内容’, '')),我是没试过但应该也可以。

子页面(接收方+反馈)

我这边接收是直接在我但react项目里写的

componentWillMount() {
    window.addEventListener('message', (e) => {
      console.log(e)
      let data= e.data //这就是接收到的数据
                       //e.origin这是发送数据的地址
   })
   
   ...
   ...
   ...
   //关于反馈我是在我项目里写了一个点击动作发送的如下
   goCustomerDetail=(data)=>{
    let url = data.url
            // window.top.postMessage({
            //     text:'返回Url',
            //     url:url
            // }, 'http://XXX:8083/ceshi/ceshi.html')
            
            window.top.postMessage('{"name":"客户详情","path":"'+url+'"}', '*')
    }

关于上面接收反馈解释一波:
1、 接收 window.addEventListener('message', (e) => {console.log(e) })
其中e是整个接收到的消息体里面有很多内容,自己拿使用的数据,注意这里应该加判断符合条件后在进行一些操作
2、发送方式,我自己实验两种反馈,父页面都能收到
注意是用 window.top.postMessage反馈

结束

总结:这个方式还是很好用的,可以不同技术栈通信外链,但是安全方面不是很好,而且需要会出现跨域问题数据请求不到或者接口被拦截,需要自己打开接口设置一波继续访问。

附赠:还有其它方式的引入我自己没用过,参考链接分享

https://www.jianshu.com/p/fb579be635b2
https://www.cnblogs.com/Jry666/p/8418643.html
https://blog.csdn.net/monkindey/article/details/23659387

到此这篇关于html5关于外链嵌入页面通信问题(postMessage解决跨域通信)的文章就介绍到这了,更多相关html5外链嵌入通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
CSS3转换功能transform主要属性值分析及实现分享
May 06 HTML / CSS
基于CSS3实现的黑色个性导航菜单效果
Sep 14 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
May 05 HTML / CSS
纯CSS3单页切换导航菜单界面设计的简单实现
Aug 16 HTML / CSS
HTML5移动开发图片压缩上传功能
Nov 09 HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
Mar 14 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
Jan 30 HTML / CSS
html5 worker 实例(一) 为什么测试不到效果
Jun 24 HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 HTML / CSS
Html5新增了哪些功能
Apr 16 HTML / CSS
浅谈由position属性引申的css进阶讨论
May 25 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 HTML / CSS
HTML5跳转小程序wx-open-launch-weapp的示例代码
Jul 16 #HTML / CSS
uniapp+Html5端实现PC端适配
Jul 15 #HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
Jul 10 #HTML / CSS
HTML5 背景的显示区域实现
Jul 09 #HTML / CSS
HTML5图片层叠的实现示例
Jul 07 #HTML / CSS
HTML5 层的叠加的实现
Jul 07 #HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
Jul 03 #HTML / CSS
You might like
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
vue实例的选项总结
2020/06/09 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
python3注册全局热键的实现
2020/03/22 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
新闻学专业应届生求职信
2013/11/08 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
学生期末评语大全
2014/04/30 职场文书
学校四群教育实施方案
2014/06/12 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
公积金接收函格式
2015/01/30 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
任命书标准格式
2015/03/02 职场文书
Django实现翻页的示例代码
2021/05/24 Python
Java常用函数式接口总结
2021/06/29 Java/Android