2011-10-30 48 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