2017-09-25 183 views
1

在此之前,它被忽略了,我只想說,我覺得我已經嘗試了一切,儘量不要改變應用程序來使用AJAX並返回響應使用JSON而不是像現在這樣渲染新的HTML頁面(使用Go的https://github.com/unrolled/render包) - 這將是很多重做所有工作的工作,所以我希望有一個解決方案不涉及AJAX + JSON響應iframe在等待新頁面加載的同時顯示空白頁面,而沒有iframe它不會

現在,無論何時執行表單POST,最後我都會渲染一個新的HTML頁面,如下所示:

render.HTML(w, http.StatusOK, "path/to/htmlfile/index", map[string]interface{}{ 
     csrf.TemplateTag: csrf.TemplateField(r), 
     "passing some data": dataFromGo}) 

This works perfectl在本地和生產中都是這樣,但是當我把它放入一個iframe中的時候,然後每當我點擊表單提交頁面變成空白(白色)1-2秒,然後在新的HTML頁面呈現之前(而當沒有iframe訪問時在等待新內容呈現時,原始HTML內容將保持顯示)。我覺得這種行爲只發生在iframe中真的很奇怪。

有沒有解決這個問題的方法?我曾嘗試設置<iframe name="my-iframe" ..>,並在我的表單集target="my-iframe"中嘗試將​​添加到iframe。我曾嘗試其他的事情,事後證明是完全不相干的解決我的問題:)

順便說一句,在IFRAME SRC是另一個領域,但這是不可避免的

+0

從您的問題中不清楚您使用iframe正在做什麼,如果您需要幫助,則需要提供更多詳細信息。另外爲什麼你不在一個帖子後重定向到一個新的頁面? –

+0

@KennyGrant iframe加載一個網站,其目的是處理產品訂單(其中包括),對於這些產品訂單,用戶將經歷幾個步驟,在此期間每個步驟都會進行表單發佈(例如'

'),則表單文章中的輸入值將由後端處理,然後使用上述'render'方法加載新的HTML頁面。我確實認爲這符合重定向到一個新的頁面,但我可能會誤解你:) – fisker

回答

1

從我的實驗,它看起來像瀏覽器打開只要響應主體的第一個字節到達,iframe就會變爲白色。我的猜測是你自己的代碼或渲染包在實際處理完成之前發送字節。你可以看到的行爲與此示例程序:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
    "time" 
) 

func main() { 
    http.DefaultServeMux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      w.Header().Set("content-type", "text/html") 
      fmt.Fprintln(w, `<iframe src="/frame"></iframe>`) 
    })) 

    http.DefaultServeMux.Handle("/frame/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      w.Header().Set("content-type", "text/html") 

      // Remove either of the following two calls and the iframe doesn't turn white. 
      fmt.Fprint(w, " ") 
      w.(http.Flusher).Flush() 

      time.Sleep(2 * time.Second) // Lots of work to do... 

      fmt.Fprint(w, ` 
       <form style="background:red" method="post"> 
        <button>submit</button> 
       </form> 
      `) 
    })) 

    log.Fatal(http.ListenAndServe(":4000", nil)) 
} 

取出沖洗或第一次寫,和IFRAME撐呈現幾乎所有的時間。爲什麼這種行爲與頂級文檔不同,超越了我。

我對github.com/unrolled/render不熟悉。查看是否有寫入可以推遲到最後,或者是否可以在發送線路之前緩存響應(正文)。

+0

這太棒了! 'unrolled/render'使用默認的'html/template'軟件包,所以我猜這個問題與此無關,但我使用'github.com/gorilla/sessions'來調用'sessions.Save(r,w )'..希望刪除該行將足以解決這些問題..非常感謝:)! – fisker