2011-10-30 46 views
1

这里是案例: 我们有一个文件上传页面。我们不希望在上传完成后重新加载页面,因此我们将表单放入iframe中。 iframe内部的表单发布到自身,并在完成时返回json。我们如何捕捉到这种回应?上传完成后,iframe会重新加载,所以换句话说,当iframe重新加载时我们如何捕获?如何从父文档捕获iframe中的刷新内容?

承担这些:

  • 我们不能打印/除了JSON对象返回任何
  • 我们不能使用AJAX,因为你不能发布文件(所以没有js代码调用父文档的功能。)使用ajax
  • 我们不能在iframe中追加javascript代码,因为一旦iframe中的表单被提交,页面就会被重新加载,我们将失去附加的js代码。

任何想法?

UPDATE - 似乎是一个解决办法是超级简单(在网上找到的地方):

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

通过这种方式,它会触发警报,每当一个iframe内部页面重新加载。现在只需要将JSON对象与HTML代码区分开来,这非常简单。感谢大家的一个伟大的建议!

+1

为什么你不能返回任何东西,除了一个JSON对象?这似乎是你在那里设置的一个非常尴尬的限制。 – glenatron

+0

@glenatron json是从java servlet返回的。据我所知(我不是后端人),有一个通用类在其他servlet中使用,它“构建”并返回json ...我们通常通过ajax使用这些servlet,但在这种情况下不会..所以,因为当页面加载时,没有地方发送json,所以它打印该json ...我只需要一种方法来捕获该json而不更改一般的java类..我希望我没有把你搞糊涂:) – Sherzod

回答

1

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

更新

既然你没有对从servlet响应控制,也许你可以建立一个PHP中位数与该servlet进行通信,并采取原始JSON它得到,然后返回它所需要的执行父窗口javscript函数并将json传递给该函数。

这样你可以控制输出。

+0

我可以在iframe中追加onload监听器,但是一旦表单被提交,iframe就会重新加载,并且我将失去该监听器...如果有一种方法可以捕获已完成的表单提交(并且可能需要x时间因为它正在上传一个文件),我可以直接从iframe中获取json。 – Sherzod

0

您可以检查iFrame的内容是否发生了变化,方法是对上一次检查的内容(如果文档很大时对其进行散列检查)对iFrame文档的内部文本执行定时检查,然后一旦它改变了,你可以尝试解析JSON的内容来检查它是否是预期的响应。

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

+0

是的,我正在考虑做第一个选择,但我正在寻找更好的解决方案,因为这不是我猜的最佳方式......第二个概念听起来不错,但它会使服务器端的事情变得复杂,如果你认为有数百个用户可能同时上传文件,这听起来有点复杂......但是我会用back-最后的家伙。谢谢! – Sherzod

+0

这不是一个理想的解决方案,但是你并不处于理想状态 - 如果你从底层开始设计,你可以更好地控制上传脚本的输出,但是从你的位置开始应该提供一些可行的方法。无论你在这里做什么都可能是一种黑客行为。 – glenatron