首页 > 其他分享 >关于iframe通过postMessage获取不到参数的问题

关于iframe通过postMessage获取不到参数的问题

时间:2023-04-26 10:12:55浏览次数:31  
标签:postMessage 渲染 发送 window 参数 iframe 页面

问题

将百度的地图按需求简单封装一下,通过 iframe 嵌入到其他网页中,根据 postMessage 传入的参数进行一定程度的交互。但是父页面传入的参数子 iframe 获取不到参数

问题所在

用了一下 chatGPT 查询一下也一无所获,都没用。通过不断排查后发现 在 iframe 中的网页还没有完全渲染完成在父页面中就触发了 iframe 的 onl oad 函数,iframe 中的监听接收函数还没有创建时父页面就直接发送了消息导致接收不到。

解决办法

子页面的地图还未完全渲染完成时父页面就发送了消息,就在子页面添加一个 postMessage 函数,子 iframe 渲染完成后发送消息给父页面,父页面再向子页面通信。

父页面

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
 </head>

 <body style="width:100vw;height:100vh;">
  <iframe id="child" style="width:100%;height:100%;" src="子页面网址"></iframe>
 </body>
</html>
<script>
 let dom = document.getElementById('child')
 dom.onload = function () {
   window.addEventListener("message", handleLoad, false)
 }

 function handleLoad(val) {
   if (val.data === 'loaded') {
     // iframe渲染完成后发送初始化参数
    // ...params
   }
 }

 // 测试-延迟8s,模拟等待iframe渲染完成后发送消息触发联动
 setTimeout(() => {
   dom.contentWindow.postMessage({

     "*")
 }, 8000)

 // 测试-延迟15s,模拟等待iframe渲染完成后发送消息触发联动
 setTimeout(() => {
   dom.contentWindow.postMessage({
    // ...params
   },
     "*")
 }, 15000)
</script>

子页面

window.addEventListener("message", handleMessage, false);
window.parent.postMessage("loaded", "*"); // 在iframe的监听函数开始监听后发送 加载完成 消息给父页面接收
onUnmounted(() => {
 window.removeEventListener("message", handleMessage);
});

标签:postMessage,渲染,发送,window,参数,iframe,页面
From: https://www.cnblogs.com/GoodMemoryBlog/p/17354801.html

相关文章

  • 你不太熟悉的JVM命令配置参数
    导读JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器,然而我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码,等等。不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会......
  • dolphinscheduler3.1.5-全局参数使用注意事项
    1.每个工作流都应配置本身需要的全局参数,即使是作为sub_process因为工作流的全局变量只能作用到当前工作流中的任务节点及下一级的子工作流的任务节点,再嵌套子工作流,就获取不到最上级工作流的全局变量了。2.SQL任务类型,动态表名如何通过全局变量来获取在SQL任务节点配置本......
  • PHP 中的默认(缺省)参数的函数
    前言在PHP中有一种函数,在调用的时候某些参数是可以缺省的,也就是说,在调用函数的时候可以传值,也可以不传值,如果在调用函数的时候传入具体的值就会使用传入的值,否则就会使用默认的值,默认的值在函数定义的时候就已经设置好,默认(缺省)参数的函数格式如下所示:mixedfunName(stringname,[,str......
  • JUnit 5 参数化测试
    JUnit5参数化测试目录设置我们的第一个参数化测试参数来源@ValueSource@NullSource&@EmptySource@MethodSource@CsvSource@CsvFileSource@EnumSource@ArgumentsSource参数转换参数聚合奖励总结如果您正在阅读这篇文章,说明您已经熟悉了JUnit。......
  • Solr学习之五:Solr查询参数及语法
    一.查询参数1.CoreQueryParam查询的参数1)q:查询字符串,必须的。2)q.op:覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。3)df:默认的查询字段,一般默认指定。4)qt:querytype,指定查询使用的QueryHandler,默认为“standard”。5)wt:write......
  • hello world(参数可以这样写)
    packagetest;importjava.io.ByteArrayOutputStream;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;publicclassTest{publicstaticvoidmain(String[]args)throw......
  • 《c#高级编程》第4章C#4.0中的更改(七)——命名参数和可选参数
    一、概念C#中的命名参数和可选参数是两种函数参数的特殊形式,它们可以提高代码的可读性和灵活性。命名参数命名参数允许我们在调用函数时指定参数名称,从而不必按照函数定义时的参数顺序进行传参。这样做可以使代码更加易读易懂,同时也可以提高代码的灵活性,因为我们可以只传递某些......
  • axios传递参数的使用
    今天在学习elasticsearch时,遇到一个问题:项目中前端采用的是Vue2+axios,后端的接口采用Restful风格来接收:关于Resultful风格:1.GET(SELECT):从服务器取出资源(一项或多项);2.POST(CREATE):在服务器新建一个资源;3.PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源);......
  • 抖音x-bogs参数
    目标//从varx_bogus='DFSzswVVUyXANrqJSkdAml9WX7jG';//还原出varx_array=[64,0.00390625,1,28,7,22,69,63,0,186,99,164,90,214,32,0,190,144,201];正向梳理主要加密函数function_0x2f2740(a,c,e,b,d,f,t,n,o,i,r,_,x,u,s,l,......
  • 【C/C++】 可变参数函数
    #include<stdio.h>#include<stdarg.h>/***按自定义格式符解析数据*/voidprocess(constchar*fmt,va_listargs){for(;*fmt;fmt++){if(*fmt=='%'){continue;}switch(*fmt){ca......