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

封装的postMessage库 herryPostMessage.js

  1. (function (w) {
  2. //herry对象
  3. w.herry = {};
  4. //iframe的id
  5. if(!herry.iframeId) {
  6. herry.iframeId = 'iframe'
  7. }
  8. //父窗口名字
  9. if(!herry.parentName) {
  10. herry.parentName = '父窗口'
  11. }
  12. //子窗口名字
  13. if(!herry.childName) {
  14. herry.childName = '子窗口'
  15. }
  16. //跨域对象
  17. const messageObj = {};
  18. //父页面
  19. /**
  20. * 发送给子页面数据
  21. */
  22. const postMessage = (data, fn = null) => {
  23. const iframe = document.getElementById(herry.iframeId)
  24. iframe.contentWindow.postMessage(
  25. {
  26. name: herry.parentName, //父页面名字
  27. ...data,
  28. },
  29. "*"
  30. );
  31. messageObj[data.action] = fn;
  32. };
  33. /**
  34. * 监听子页面返回的数据
  35. */
  36. w.addEventListener(
  37. "message",
  38. (event) => {
  39. const { data } = event;
  40. if (data && typeof data === "object" && data.name === herry.childName) {
  41. messageObj[data.action](data);
  42. }
  43. },
  44. false
  45. );
  46. //子页面
  47. /**
  48. * 返回数据给父页面 参1=当前action 参2=返回的数据
  49. */
  50. const returnData = (action, data) => {
  51. top.postMessage(
  52. {
  53. name: herry.childName, //子页面名字
  54. action,
  55. data,
  56. },
  57. "*"
  58. );
  59. };
  60. /**
  61. * 监听父页面发送的数据
  62. */
  63. w.addEventListener(
  64. "message",
  65. async (event) => {
  66. const { data } = event;
  67. if (data && typeof data === "object" && data.name === herry.parentName) {
  68. if (herry.callback) {
  69. herry.callback(data)
  70. }
  71. }
  72. },
  73. false
  74. );
  75. herry.postMessage = postMessage;
  76. herry.returnData = returnData;
  77. })(window);

使用这个库让a域名下获取b域名下的数据,即a发出请求,b返回给a数据。a是父页面,b是子页面

使用:

域名a和b的页面上都需要引入herryPostMessage.js

a页面处理(父页面):

加入iframe(src是b域名的页面,需要设置一个id,一般也可以将iframe使用样式隐藏掉)。

  1. <iframe
  2. src="//b.com/xxx.html"
  3. id="ifr"
  4. frameborder="0"
  5. ></iframe>

设置iframeId=上面的这个id:

  1. herry.iframeId = "ifr";

发起请求(action是设置的一个请求名,在b页面中进行匹配用。后面的数据是携带给b页面用的参数。后面的res是b页面执行后的回调函数,可进行处理b返回的数据):

  1. herry.postMessage({ action:'geta1', x: 1 }, (res) => {
  2. console.log(res.data);
  3. });

b页面处理(子页面):

b页面的herry.callback通过action匹配执行,并做处理,通过herry.returnData将数据返回给a的回调函数。即实现了交互。

  1. herry.callback = async (data) => {
  2. if (data.action === "geta1") {
  3. //...
  4. herry.returnData(data.action, { x: 2 });
  5. }
  6. //...
  7. };

不过这种封装方式也不是特别好,有局限性,比如b(子页面)像a(父页面)发起请求还是比较麻烦。欢迎各位提出意见或建议。

封装一个postMessage库,进行iframe跨域交互的更多相关文章

  1. 解决Iframe跨域高度自适应,利用window.postMessage()实现跨域消息传递页面高度(JavaScript)

    在iframe跨域引用高度自适应这块写的js方式都试了不管用,最终使用的是window.postMessage() 跨域获取高度 传递信息 1.首先,在主页面上使用iframe引入子页面:也就是A.h ...

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

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

  3. 利用window.name+iframe跨域获取数据详解

    详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...

  4. js iframe跨域访问

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

  5. iframe跨域通信实战

    "长时间不写文章,开头的方式总是那么出奇的相似",最近很忙,好久没写博客了啊(是不是?). 更换工作已经有三个月有余,这段三个月把过去三年没加过的班都加了一次.收获挺多,发现的问题 ...

  6. 关于iframe跨域实践

    提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...

  7. 子页面iframe跨域执行父页面定义的JS方法

    问题需求:父页面与子页面iframe跨域嵌套,子页面要触发父页面所定义的js方法.父子页面的数据传递. 下文中会用到一些文件:父页面: parent.html嵌在父页面的子iframe页面:child ...

  8. iframe 跨域问题解决方案 利用window.name+iframe跨域获取数据详解

    详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...

  9. iFrame跨域的方式

    4种通过iframe跨域与其他页面通信的方式 不同域下的iframe不能进行操作. 1.location.hash: 在url中,http://www.baidu.com#helloword的#hel ...

随机推荐

  1. event duplication bind bug & h5 dataset flag solution

    event duplication bind bug & h5 dataset flag solution https://codepen.io/xgqfrms/full/PaRBEy/ OK ...

  2. Raspberry Pi 电路图模拟器

    Raspberry Pi 电路图模拟器 Circuit Diagram / Circuit Graph https://fritzing.org/learning/tutorials/building ...

  3. gitLab的使用 和 git 、 github、gitlab的区别

    一.git . github.gitlab的区别  (百度相关内容得到的理解) ​ ​ 二.git最基本作用:版本控制 ​ 三.有集成了git的GIT安装包 github和gitlab都使用git该版 ...

  4. Golang 实现 Redis(9): 使用GeoHash 搜索附近的人

    本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...

  5. kvm-PLE代码分析

    Linux源码版本: 5.3.0 相关数据结构 #define KVM_DEFAULT_PLE_GAP 128 // ple_gap #define KVM_VMX_DEFAULT_PLE_WINDO ...

  6. OAuth2.0安全设计之Authorization Code

    OAuth 2.0 有 4 种认证流程: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentia ...

  7. Qt+opencv亲自配置教程

    了别人的配置,总是无法配置成功,自己慢慢摸索配置成功.我失败的原因是在于自己本机的环境变量和他们不同,特此记下,分享给有相同问题的朋友. 一.需要软件 1.cmake 3.11.3(版本无所谓) 2. ...

  8. AVR单片机教程——第三期导语

    背景(一) 寒假里做了一个灯带控制器: 理想情况下我应该在一个星期内完成这个项目,但实际上它耗费了我几乎一整个寒假,因为涉及到很多未曾尝试的方案.在这种不是很赶时间的.可以自定目标.自由发挥的项目中, ...

  9. nc替代ping

    linux nc介绍: 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...

  10. Java语言的魅力

    Java语言的简介 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面 ...