javascript - 如何等到 iframe 中的 React 呈现它的内容

标签 javascript reactjs iframe

我在 iframe 中嵌入了一个 React 应用程序。该应用程序在与 iframe 父级相同的域中运行。我可以使用 iframe 的 onload 事件等待 iframe 加载,如下所示:

<body>
<iframe id="frame" src="http://some/react/app"></iframe>

<script>
const frame = document.getElementById("frame");
frame.onload = () => {
  frame.querySelector("...");
}
</script>
</body>

然而,如果尝试查询由 React 自身创建的 #reactRoot div 下的任何元素,则 querySelector 返回 null,这可能是因为 React 尚未完成对内容的渲染应用程序。

使用 console.logonload 函数中记录 iframe 的主体,在控制台中显示 React 应用程序的完整主体和所有小部件。我认为发生这种情况是因为记录的 body 元素只是一个引用,当我在控制台中看到它时,React 渲染已经完成。

当像这样使用 setTimeout 时,我也可以访问 React 应用程序的完整主体,因为 React 渲染将在超时函数执行之前完成:

<body>
<iframe id="frame" src="http://some/react/app"></iframe>

<script>
const frame = document.getElementById("frame");
frame.onload = () => {
  setTimeout(() => console.log(frame.querySelector("...")), 1000);
}
</script>
</body>

是否有更可靠的方法来等待 iframe 中的 React 应用程序完成渲染,或者等待任意时间才能访问 iframe 文档是唯一的方法?我不太喜欢这个解决方案,因为一旦慢速设备需要超过一秒的时间来呈现 React 应用程序,这个解决方案就会崩溃。

最佳答案

加载框架后,您可以轮询是否存在预期元素。

const startPolling = () => {
   if (frame.querySelector("...")) {
      console.log('react is ready')
      return 
   }
   setTimeout(startPolling, 1000)
}
frame.onload = () => {
   startPolling()
}

关于javascript - 如何等到 iframe 中的 React 呈现它的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71203295/

相关文章:

reactjs - 单击页面上任意位置时禁用覆盖

javascript - 对 iframe 高度变化使用react

javascript - 如何将带有视频的 iframe 拉伸(stretch)到其父级?

javascript - FabricJS 支持哪些类型的 SVG 文件?

javascript - 如何使用 setTimeout() 使元素在动画后重新出现

javascript - 如何使 Node 导出正常工作?

javascript if语句条件替换变量值

ReactJS 如何从获取请求到后端设置 Cookie

javascript - 使用 ReactJS 动态页面标题

javascript - iframe 内容不显示