2011-04-09 69 views
0

浏览器向服务器发送静态网页的GET请求。服务器用HTTP正文中的HTML页面发回HTTP OK响应。通过查看Content-Length字段或查找终止块或其他一些其他分隔符,浏览器可以知道它是否已收到网页以及随后的所有嵌入对象(图像等)。在这种情况下,浏览器总是知道网页何时完全加载,并且它不会再看到网络流量,这是否正确?说网页浏览器总是知道网页何时完全加载是否正确?

现在,如果页面是动态的(让我们说Facebook或Gmail),您可能会收到通知或页面部分使用AJAX或JavaScript在后台运行更新,这里浏览器也应该知道页面何时加载。如果服务器正在向客户端推送一些更新,该怎么办?在这种情况下浏览器是否有可能知道它何时收到完整更新?

那么,有什么情况下浏览器不知道它何时完全接收到它从Web服务器请求的数据(静态或动态)或基于推送的更新服务器正在转发给它的数据?

回答

1

我只能想象(对于静态情况)未设置Content-Length的情况。它不是强制性的发送给服务器。当然,在一个包含脚本的页面中,也可能会有其他场景,其中脚本逐个加载一些点点滴滴(包括您提到的AJAX场景)。这样浏览器也不会提前知道。在这种情况下,它会知道“暂时”页面已完全加载,但脚本的下一个动作会再次使该断言无效。

+0

你是对的内容长度字段不是强制性的。就像在HTTP/1.1中一样,你有分块编码(未定义数量的块,其中每个块包含一个长度字段,而最后一个块的长度为零)。但浏览器仍然可以知道网页何时完全加载并向用户显示“完成”消息。你知道浏览器无法做到的任何网页吗? – Bruce 2011-04-09 12:35:05

+0

@布鲁斯:我不知道这样的页面。在动态的情况下,它会暂时知道它已经完成,并且在静态情况下,一旦数据流完成(即使不知道长度),它就会知道它。不过,我已经看到了这个问题的症状(即,浏览器似乎从未完全加载页面)。大多数情况下,当某些内容(广告,跟踪像素)包含在实际页面所在的其他服务器中时,会发生这种情况。 – 0xC0000022L 2011-04-09 12:42:27

0

您不需要AJAX即使在加载页面本身之后,也不需要加载页面中的所有元素。一些JavaScript是所有你需要(被自从我上次跟JS工作了一段时间,可能有一些语法错误)

< IMG ID = “dyn_image” SRC = “/ not_clicked.gif” >

< INPUT TYPE = “按钮” 的onclick = “javascrit:document.get(” dyn_image “)。SRC =”/ clicked.gif” >

0

存在这样的情况时,该服务器使用某种推技术,例如Comets。在这种情况下,会发送一个请求(通常是Ajax请求),而不会收到任何响应(也可能没有HTTP头),但是会打开TCP连接。这可能需要很长时间,但仍可以被视为Ajax调用的子情况。

另一种情况是HTML5的WebSocket技术。在WebSocket中,服务器端可以将数据推送到客户端,而不需要客户端的明确请求

这两个可以结合使用,所以您的问题的答案是:是的,有些情况下您无法预测网络流量是否过剩。常见的(在所有情况下)是客户端必须将一个通道打开到服务器。

相关问题