跨域库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 ...
随机推荐
- django中间件介绍
在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...
- 11_MySQL如何让数据分页显示
-- 数据分页 SELECT empno,sal FROM t_emp LIMIT 5;
- ViewPager 高度自适应
public class ContentViewPager extends ViewPager { public ContentViewPager(Context context) { super(c ...
- 第50天学习打卡(JavaScript)
前端三要素 HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容. CSS(表现):层叠样式表(Cascading Style Sheets) ...
- HDOJ-1358(字符串压缩+KMP)
Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...
- C语言中字符串详解
C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...
- [源码分析] 消息队列 Kombu 之 Consumer
[源码分析] 消息队列 Kombu 之 Consumer 目录 [源码分析] 消息队列 Kombu 之 Consumer 0x00 摘要 0x01 综述功能 0x02 示例代码 0x03 定义 3.1 ...
- WS1008网络损伤测试仪
WS1008网络损伤测试仪具备高性能的网络损伤仿真功能.冗余链路测试功能和线速流量生成功能,提供了综合性的网络系统测试方案,可充分测试.验证网络系统的抗损伤能力.链路切换能力及数据转发能力.为高可靠性 ...
- flex布局个人总结
<html> <div class="box1"> <span>1</span> <span>2</span> ...
- TensorFlow学习(1)
初识TensorFlow 一.术语潜知 深度学习:深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法. 深度学 ...