封装一个postMessage库,进行iframe跨域交互
这是近期个人在开发chrome插件时的其中一个小总结。还有很多没有总结出来。因为目前插件还在迭代中,(herry菌插件,用于B站C站),属于个人业余的一个小项目。还有很多功能没有实现,以及还需要再看能加上什么功能。
封装的postMessage库 herryPostMessage.js
- (function (w) {
- //herry对象
- w.herry = {};
- //iframe的id
- if(!herry.iframeId) {
- herry.iframeId = 'iframe'
- }
- //父窗口名字
- if(!herry.parentName) {
- herry.parentName = '父窗口'
- }
- //子窗口名字
- if(!herry.childName) {
- herry.childName = '子窗口'
- }
- //跨域对象
- const messageObj = {};
- //父页面
- /**
- * 发送给子页面数据
- */
- const postMessage = (data, fn = null) => {
- const iframe = document.getElementById(herry.iframeId)
- iframe.contentWindow.postMessage(
- {
- name: herry.parentName, //父页面名字
- ...data,
- },
- "*"
- );
- messageObj[data.action] = fn;
- };
- /**
- * 监听子页面返回的数据
- */
- w.addEventListener(
- "message",
- (event) => {
- const { data } = event;
- if (data && typeof data === "object" && data.name === herry.childName) {
- messageObj[data.action](data);
- }
- },
- false
- );
- //子页面
- /**
- * 返回数据给父页面 参1=当前action 参2=返回的数据
- */
- const returnData = (action, data) => {
- top.postMessage(
- {
- name: herry.childName, //子页面名字
- action,
- data,
- },
- "*"
- );
- };
- /**
- * 监听父页面发送的数据
- */
- w.addEventListener(
- "message",
- async (event) => {
- const { data } = event;
- if (data && typeof data === "object" && data.name === herry.parentName) {
- if (herry.callback) {
- herry.callback(data)
- }
- }
- },
- false
- );
- herry.postMessage = postMessage;
- herry.returnData = returnData;
- })(window);
使用这个库让a域名下获取b域名下的数据,即a发出请求,b返回给a数据。a是父页面,b是子页面
使用:
域名a和b的页面上都需要引入herryPostMessage.js
a页面处理(父页面):
加入iframe(src是b域名的页面,需要设置一个id,一般也可以将iframe使用样式隐藏掉)。
- <iframe
- src="//b.com/xxx.html"
- id="ifr"
- frameborder="0"
- ></iframe>
设置iframeId=上面的这个id:
- herry.iframeId = "ifr";
发起请求(action是设置的一个请求名,在b页面中进行匹配用。后面的数据是携带给b页面用的参数。后面的res是b页面执行后的回调函数,可进行处理b返回的数据):
- herry.postMessage({ action:'geta1', x: 1 }, (res) => {
- console.log(res.data);
- });
b页面处理(子页面):
b页面的herry.callback通过action匹配执行,并做处理,通过herry.returnData将数据返回给a的回调函数。即实现了交互。
- herry.callback = async (data) => {
- if (data.action === "geta1") {
- //...
- herry.returnData(data.action, { x: 2 });
- }
- //...
- };
不过这种封装方式也不是特别好,有局限性,比如b(子页面)像a(父页面)发起请求还是比较麻烦。欢迎各位提出意见或建议。
封装一个postMessage库,进行iframe跨域交互的更多相关文章
- 解决Iframe跨域高度自适应,利用window.postMessage()实现跨域消息传递页面高度(JavaScript)
在iframe跨域引用高度自适应这块写的js方式都试了不管用,最终使用的是window.postMessage() 跨域获取高度 传递信息 1.首先,在主页面上使用iframe引入子页面:也就是A.h ...
- JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 利用window.name+iframe跨域获取数据详解
详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...
- js iframe跨域访问
1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...
- iframe跨域通信实战
"长时间不写文章,开头的方式总是那么出奇的相似",最近很忙,好久没写博客了啊(是不是?). 更换工作已经有三个月有余,这段三个月把过去三年没加过的班都加了一次.收获挺多,发现的问题 ...
- 关于iframe跨域实践
提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...
- 子页面iframe跨域执行父页面定义的JS方法
问题需求:父页面与子页面iframe跨域嵌套,子页面要触发父页面所定义的js方法.父子页面的数据传递. 下文中会用到一些文件:父页面: parent.html嵌在父页面的子iframe页面:child ...
- iframe 跨域问题解决方案 利用window.name+iframe跨域获取数据详解
详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...
- iFrame跨域的方式
4种通过iframe跨域与其他页面通信的方式 不同域下的iframe不能进行操作. 1.location.hash: 在url中,http://www.baidu.com#helloword的#hel ...
随机推荐
- event duplication bind bug & h5 dataset flag solution
event duplication bind bug & h5 dataset flag solution https://codepen.io/xgqfrms/full/PaRBEy/ OK ...
- Raspberry Pi 电路图模拟器
Raspberry Pi 电路图模拟器 Circuit Diagram / Circuit Graph https://fritzing.org/learning/tutorials/building ...
- gitLab的使用 和 git 、 github、gitlab的区别
一.git . github.gitlab的区别 (百度相关内容得到的理解) 二.git最基本作用:版本控制 三.有集成了git的GIT安装包 github和gitlab都使用git该版 ...
- Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...
- kvm-PLE代码分析
Linux源码版本: 5.3.0 相关数据结构 #define KVM_DEFAULT_PLE_GAP 128 // ple_gap #define KVM_VMX_DEFAULT_PLE_WINDO ...
- OAuth2.0安全设计之Authorization Code
OAuth 2.0 有 4 种认证流程: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentia ...
- Qt+opencv亲自配置教程
了别人的配置,总是无法配置成功,自己慢慢摸索配置成功.我失败的原因是在于自己本机的环境变量和他们不同,特此记下,分享给有相同问题的朋友. 一.需要软件 1.cmake 3.11.3(版本无所谓) 2. ...
- AVR单片机教程——第三期导语
背景(一) 寒假里做了一个灯带控制器: 理想情况下我应该在一个星期内完成这个项目,但实际上它耗费了我几乎一整个寒假,因为涉及到很多未曾尝试的方案.在这种不是很赶时间的.可以自定目标.自由发挥的项目中, ...
- nc替代ping
linux nc介绍: 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...
- Java语言的魅力
Java语言的简介 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面 ...