gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:53:08 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com