如何从父文档中捕获 iframe 内部的刷新?

Posted

技术标签:

【中文标题】如何从父文档中捕获 iframe 内部的刷新?【英文标题】:How to capture the refresh inside of an iframe from parent document? 【发布时间】:2011-12-18 01:17:56 【问题描述】:

情况如下: 我们有一个文件上传页面。我们不想在上传完成后重新加载页面,所以我们将表单放在 iframe 中。 iframe 内部的表单发布到自身并在完成后返回 json。我们怎样才能捕捉到这种反应?上传完成后,iframe 会重新加载,也就是说,当 iframe 重新加载时,我们如何捕获?

假设这些:

我们无法打印/返回除 json 对象之外的任何内容(因此没有 js 代码来调用父文档中的函数。) 我们无法使用 ajax,因为您无法使用 ajax 发布文件 我们不能在 iframe 中附加 javascript 代码,因为一旦 iframe 中的表单被提交,页面就会重新加载,我们会丢失附加的 js 代码。

有什么想法吗?

更新 - 似乎解决方案非常简单(在网上某处找到):

<iframe onload="alert(window['upload_iframe'].document.body.innerhtml);"  ...></iframe>

这样,每当重新加载 iframe 内的页面时,它都会触发警报。现在只需将 JSON 对象与 HTML 代码区分开来,这非常简单。感谢大家的建议!

【问题讨论】:

为什么除了 JSON 对象不能返回任何东西?这似乎是你在那里给自己设置的一个非常尴尬的约束。 @glenatron json 从 java servlet 返回。据我了解(我不是后端人员),有一个通用类在其他 servlet 中使用,它“构建”并返回 json ......我们通常通过 ajax 使用这些 servlet,但在这种情况下不是..所以当页面加载时,没有地方可以发送json,所以它打印那个json......我只需要一种方法来捕获那个json而不改变一般的java类..我希望我没有让你感到困惑: ) 【参考方案1】:

您是否尝试将“onload”侦听器附加到 iframe 元素以查看 iframe 源何时更改时是否触发?那可能是一个解决方案。如果它不起作用,那么我认为您别无选择,只能从 iframe 结果中执行***函数。

更新

由于您无法控制来自 servlet 的响应,也许您可​​以构建一个与 servlet 通信并获取原始 json 的 php 中间值,然后返回执行父窗口 javscript 函数所需的内容和将 json 传递给该函数。

这样你就可以控制输出了。

【讨论】:

我可以在 iframe 中附加 onload 侦听器,但是一旦提交了表单,iframe 就会重新加载并且我将失去那个侦听器......如果有办法捕获完成的表单提交(和上传文件可能需要 x 时间),我可以直接从 iframe 内部获取 json ..【参考方案2】:

您可以通过定时检查 iFrame 文档的内部文本来检查 iFrame 的内容是否发生变化它已经改变了,您可以尝试将内容解析为 JSON 以检查它是否是预期的响应。

或者,您可以使用 AJAX 在服务器端检查上传是否已完成,一旦服务器确认已完成上传,您就可以检查 iFrame 内容。

【讨论】:

是的,我正在考虑做第一个选项,但我正在寻找更好的解决方案,因为我猜这不是最好的方法......第二个概念听起来不错,但它会使服务器端的事情变得很复杂,如果您考虑到可能有数百个用户同时上传文件,那听起来有点复杂......但我会与后端人员核实。谢谢! 这不是一个理想的解决方案,但你的情况并不理想——如果你是从下往上设计的,你可以更好地控制上传脚本的输出,但是你从哪里开始这应该提供一些有用的东西吗?您在这里所做的任何事情都可能是一种黑客行为。

以上是关于如何从父文档中捕获 iframe 内部的刷新?的主要内容,如果未能解决你的问题,请参考以下文章

刷新 iframe

node webkit- 从父窗口捕获 iframe 鼠标事件

如何在从父窗口创建的 iframe 的 onload 处理程序中获取对 iframe 窗口对象的引用

捕获 iframe 加载完成事件

从父文档/窗口调用IFrame Javascript函数

如何从 iframe 内部提交表单并将结果显示在外部