旧库见文章: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跨域的更多相关文章

  1. 封装一个postMessage库,进行iframe跨域交互

    这是近期个人在开发chrome插件时的其中一个小总结.还有很多没有总结出来.因为目前插件还在迭代中,(herry菌插件,用于B站C站),属于个人业余的一个小项目.还有很多功能没有实现,以及还需要再看能 ...

  2. iframe跨域访问

    js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决 ...

  3. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  4. js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  5. JS、JQuery和ExtJs的跨域处理

    1.什么是跨域?跨域,JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a. ...

  6. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  7. 【转】JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  8. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

  9. js iframe跨域访问

    1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...

随机推荐

  1. 看超额担保免信任的NGK DeFi 乐高如何打造下一个千倍币?

    2020年中,DeFi的高收益率吸引了大量热钱涌入,DeFi总锁仓量破百亿美金.如今,流动性挖矿的热潮暂时停歇,但对于 NGK DeFi项目来说,它背后的演变进化从未停止. 免信任是 NGK DeFi ...

  2. 知名金融媒体采访行业大咖,多方推动BGV茁壮成长

    近来,多家知名金融媒体如纽约金融时报.伦敦金融时报等采访NGK官方代表洛索斯夫,以及美国当地行业大咖马库斯等人. 受访的NGK官方代币洛索斯夫回答道,近期官方将会推出NGK的书籍<NGK公链底层 ...

  3. Python算法_递归:汉诺塔

    游戏链接:https://zhangxiaoleiv.github.io/app/TowerOfHanoi/Hanoi.html 汉诺塔游戏算法: 1 def hanoi(n,x,y,z): 2 if ...

  4. JUC并发编程学习笔记

    JUC并发编程学习笔记 狂神JUC并发编程 总的来说还可以,学到一些新知识,但很多是学过的了,深入的部分不多. 线程与进程 进程:一个程序,程序的集合,比如一个音乐播发器,QQ程序等.一个进程往往包含 ...

  5. Mybatis注解开发之@CacheNamespace:实现注解二级缓存的使用

    MyBatis二级缓存使用: 官方建议在service使用缓存,但是你也可以直接在mapper层缓存,这里的二级缓存就是直接在Mapper层进行缓存操作 Mybatis的二级缓存实现也十分简单,只要在 ...

  6. 水墨屏开发设备,旧 Kindle 改造而成

    原文地址:Turning an old Amazon Kindle into a eink development platform 原文作者:adq 译者 & 校正:HelloGitHub- ...

  7. es6 快速入门 系列 —— 变量声明:let和const

    其他章节请看: es6 快速入门 系列 变量声明:let和const 试图解决的问题 经典的 var 声明让人迷惑 function demo1(v){ if(v){ var color='red' ...

  8. pytorch(16)损失函数(二)

    5和6是在数据回归中用的较多的损失函数 5. nn.L1Loss 功能:计算inputs与target之差的绝对值 代码: nn.L1Loss(reduction='mean') 公式: \[l_n ...

  9. Docker系列——InfluxDB+Grafana+Jmeter性能监控平台搭建(一)

    在做性能测试的时候,重点关注点是各项性能指标,用Jmeter工具,查看指标数据,就是借助于聚合报告,但查看时也并不方便.那如何能更直观的查看各项数据呢?可以通过InfluxDB+Grafana+Jme ...

  10. python3 批量处理域名解析

    域名批量解析,快速确认域名的存活性及IP地址,脚本中包含了具体的用法和简要说明 #!/usr/bin/env python # -*- coding:utf-8 -*- # python3.6 fro ...