Facebook如何在AJAX页面加载过程中显示浏览器加载进度

How does Facebook show browser loading progress during AJAX Page Loads?

本文关键字:加载 过程中 显示 浏览器 AJAX Facebook      更新时间:2023-09-26

为了让IM客户端始终登录,Facebook在将页面插入文档之前使用AJAX加载页面,从而避免了完整页面加载。

然而,在Facebook AJAX请求期间,浏览器似乎正在加载;重新加载按钮变为X,浏览器中内置的进度指示器指示加载/等待等)

我已经能够成功地实现基于AJAX的导航,但我的浏览器没有显示任何加载指示(因为请求是异步的)Facebook是如何做到的?

当文档中有一个元素正在加载时,浏览器会显示加载状态。Ajax请求完全来自JavaScript;文档不受影响,因此不会触发加载状态。

另一方面,Facebook的大多数请求都是通过在文档中插入<script>标签来完成的,该标签指向包含他们想要的数据的JavaScript文件。(本质上是JSONP,只是它们使用不同的格式。)浏览器将显示其加载状态,因为<script>标记是文档中的一个卸载元素。

如果您不小心,这种技术/JSONP可能会使您的站点面临安全风险,因为允许跨站点请求。Facebook通过为每个资源生成随机URL来处理这一问题,这些URL在初始页面加载时发送到浏览器。

Facebook使用他们开发的名为Big Pipe的工具,基本上将他们的网站分块流式传输到客户端。他们向客户端发送一个带有裸DOM的初始脚本标记,脚本异步地将模块加载到页面上——其想法是客户端呈现模块1,而服务器获取模块2,从而缩短加载时间。

除此之外,他们还使用了一种名为长轮询的技术。使用HTTP1.1,他们可以利用持久连接,而不必担心超时。当页面被呈现时,客户端脚本向Facebook发出AJAX请求,本质上是"监听"一个事件。它会坐在那里听,直到事件发生。与此同时,浏览器将显示为正在"加载"数据。

当Facebook端触发一个事件(比如有人对你的墙帖发表了评论)时,FB会将该响应发送回客户端,以启动相应的回调(比如弹出一个小工具提示,让你知道评论),并立即向FB发送另一个请求,以收听下一个事件。

Facebook在希望浏览器显示"繁忙"状态时使用iframe进行通信。您可以通过在父窗口中具有iframe调用函数来使用iframe进行跨域ajax。

相关文章: