在此之前被遗忘,我只是想说,我觉得我已经尝试了一切,只需更改应用程序即可使用AJAX并使用JSON返回响应,而不是像现在一样呈现新的HTML页面(使用Go' s https://github.com/unrolled/render包) - 重做所有内容将会有很多工作,所以我希望有一个不涉及AJAX + JSON响应的解决方案
现在,每当我进行表单POST时,最后我会渲染一个新的HTML页面:
render.HTML(w, http.StatusOK, "path/to/htmlfile/index", map[string]interface{}{
csrf.TemplateTag: csrf.TemplateField(r),
"passing some data": dataFromGo})
这在本地和生产中都很完美,但是当我把它放在iframe中时,然后每当我点击表单提交时,页面变为空白(白色)1-2秒,然后呈现新的HTML页面(而在没有iframe的情况下访问时,原始HTML内容将在等待呈现新内容时保持显示。我觉得这种行为只发生在iframe中真的很奇怪。
这有什么解决方案吗?我尝试设置<iframe name="my-iframe" ..>
并在我的表单集target="my-iframe"
中尝试将sandbox
添加到iframe。我已经尝试过事后的其他事情与解决我的问题完全无关:)
顺便说一句,iframe src是另一个域,但这是不可避免的
答案 0 :(得分: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))
}
删除flush或第一次写入,iframe几乎一直保持渲染状态。为什么这种行为与顶级文档的不同之处超出了我的范围。
我不熟悉github.com/unrolled/render。查看是否有可以推迟到最后的写入,或者如果您可以在将响应发送到线路之前缓冲响应(正文)。