2017-09-25 185 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