iframe在等待新页面加载时显示空白页面而没有iframe它不会

时间:2017-09-25 07:43:18

标签: iframe go

在此之前被遗忘,我只是想说,我觉得我已经尝试了一切,只需更改应用程序即可使用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是另一个域,但这是不可避免的

1 个答案:

答案 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。查看是否有可以推迟到最后的写入,或者如果您可以在将响应发送到线路之前缓冲响应(正文)。