跨域库herryPostMessage.js的一些优化,多iframe跨域
旧库见文章:https://www.cnblogs.com/wuhairui/p/14595893.html
新版库主要做了下多个iframe和父页面交互的优化。主要使用构造函数的方式将多个iframe的交互使用多个对象进行区分,这样多个交互就可以互相独立了。
并可子页面主动调用传值给父页面。
新版代码:
/**
* iframeId iframe的id
* parentName 父窗口名,一般不改
* childName 子窗口名 多个iframe时需要使用
* postMessage 父窗口调用 需要子页面加载完成后才能执行到
* returnData 子窗口主动回应
* callback 父窗口调用后子窗口判断
*/
(function (w) {
function HerryPostMessage(iframeId = 'iframe') {
this.iframeId = iframeId;
this.parentName = '父窗口';
this.childName = '子窗口';
//跨域对象
this.messageObj = {}; /**
* 监听父页面发送的数据
*/
w.addEventListener(
"message",
async (event) => {
const { data } = event;
if (data && typeof data === "object" && data.name === this.parentName) {
if (this.callback) {
this.callback(data)
}
}
},
false
); /**
* 监听子页面返回的数据
*/
w.addEventListener(
"message",
(event) => {
const { data } = event;
if (data && typeof data === "object" && data.name === this.childName) {
if(this.messageObj[data.action]) {
this.messageObj[data.action](data);
}
}
},
false
);
} //父页面
/**
* 发送给子页面数据
*/
HerryPostMessage.prototype.postMessage = function(data, fn = null) {
const iframe = document.getElementById(this.iframeId)
iframe.contentWindow.postMessage(
{
name: this.parentName, //父页面名字
...data,
},
"*"
);
this.messageObj[data.action] = fn;
}; //子页面
/**
* 返回数据给父页面 参1=当前action 参2=返回的数据
*/
HerryPostMessage.prototype.returnData = function(action, data) {
top.postMessage(
{
name: this.childName, //子页面名字
action,
data,
},
"*"
);
}; //抛出
w.HerryPostMessage = HerryPostMessage;
})(window);
使用方法:
父子页面均引入herryPostMessage.js。
父页面:
引入子页面b1,设置一个id
<iframe id="b1" src="//localhost:8081/b1.html" frameborder="0"></iframe>
创建对象,参数传参为iframe的id,设置对象的childName也同名。
父子页面均加载后,调用对象的postMessage方法,传入action,data可传可不传。第二个参数为子页面的回调。
const b1 = new HerryPostMessage('b1')
b1.childName = 'b1';
//此处需要延迟 因为到登录子页面加载完毕
setTimeout(() => {
b1.postMessage({action:'geta',data: '父页面传给子页面的数据'},(res) => {
console.log('父页面打印',res.data)
})
},500)
子页面:
创建该页面的对象(一般和父页面创建的同名)
创建callback函数,做判断,父页面调用后,会进入到这里。处理后可以使用对象的returnData方法将数据传回给父页面的回调函数中。
const b1 = new HerryPostMessage('b1');
b1.childName = 'b1';
b1.callback = (data) => {
if(data.action === 'geta') {
//获取到父页面传来的数据
console.log('子页面打印',data.data)
//子页面回传给父页面数据
b1.returnData('geta','子页面回传给父页面数据')
}
}
另外,在子页面中直接调用returnData也可以主动传回给父页面数据
setTimeout(() => {
b1.returnData('geta','子页面主动传给父页面数据')
},1000)
效果:

跨域库herryPostMessage.js的一些优化,多iframe跨域的更多相关文章
- 封装一个postMessage库,进行iframe跨域交互
这是近期个人在开发chrome插件时的其中一个小总结.还有很多没有总结出来.因为目前插件还在迭代中,(herry菌插件,用于B站C站),属于个人业余的一个小项目.还有很多功能没有实现,以及还需要再看能 ...
- iframe跨域访问
js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决 ...
- js中几种实用的跨域方法原理详解(转)
今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...
- js中几种实用的跨域方法原理详解
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- JS、JQuery和ExtJs的跨域处理
1.什么是跨域?跨域,JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a. ...
- JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 【转】JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- js iframe跨域访问
1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...
随机推荐
- py 使用win32 api
http://timgolden.me.uk/pywin32-docs/contents.html https://docs.python.org/3/library/ctypes.html#ctyp ...
- Flutter: AnimatedList 一个滚动容器,可在插入或移除项目时为其设置动画
Flutter Widget of the Week import 'dart:math'; import 'package:flutter/material.dart'; void main() = ...
- 「NGK每日快讯」2021.1.25日NGK公链第83期官方快讯!
- java的单例模式小知识点
单例模式 目的 为了让一个类有且仅有一个实例 优点 只允许一个,节省空间 不用频繁创建删除,提高性能 缺点 不容易扩展 长期不使用会被系统当作垃圾回收,造成系统状态的丢失 实现 要点 防止外界随意的创 ...
- webpack + ts 配置路径别名无死角方法总结
webpack + ts 配置路径别名总结 自我体验加总结:在配置脚手架时,定制别名很有必要,可以使得代码更优雅,可读性更强.但在使用ts的时候,即便项目能够运行,vscode 确时长会提示 can' ...
- .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...
- sql where 1=1 的详细解释
原文来自:https://blog.csdn.net/zc474235918/article/details/50544484 看一下这两个句子: select * from user select ...
- CentOS7安装Kafka2.6.0
1:下载 wget https://mirror.bit.edu.cn/apache/kafka/2.6.0/kafka_2.12-2.6.0.tgz 点击前往官网 2:解压 tar -zxvf ka ...
- SpringBoot(二): SpringBoot属性配置文件 SpringBoot多环境配置文件 SpringBoot自定义配置文件
1.属性配置文件 一共分为两种,一种是键值对的properties属性配置文件,一种是yaml格式的配置文件 properties配置: 2.多环境配置文件 当我们的项目中有多套配置文件 比如开发的配 ...
- Python3.x 基础练习题100例(31-40)
练习31: 题目: 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. 分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. 程序 ...