浏览器什么时候开始呈现部分传输的HTML?

Dav*_*rns 7 html browser jquery flush spinner

我有一个长期运行的报告,并希望在生成时向用户显示等待微调器.我已经完成了这项工作,但我不确定我是以最好还是正确的方式做到这一点.

这是使用ColdFusion,但它可以是我猜的任何语言.在页面的顶部,我有一些Javascript(jQuery),它显示了一个等待微调器,还有一个documentReady处理程序,我将spinner放下.我刷新输出(如果重要),然后其余代码适用于报告内容.这并不是渲染微调器,我理论上说,即使我在服务器上冲洗东西,一些缓冲也在发生,浏览器从来没有看过微调器代码,直到为时已晚.所以,在我刷新数百行HTML注释之前,我添加了一个循环.在微调线条数量之后,就可以了.我当时认为其他网站也是这样做的.

但是:今天,在观看我的另一个页面时,一个长线作业的逐行状态,我突然想到该页面在每一行之后刷新,浏览器会根据需要逐步呈现.这与我上面的结论不符,现在我不知道规则是什么.有可预测的方法吗?它是否因浏览器而异?

澄清:我很欣赏那些尝试解释等待微调器的正确方法的答案,但我只是用一个等待微调器作为例子来说明我的真实问题:是否有可靠的方法来预测浏览器何时开始渲染HTML是通过网络流式传输给他们的吗?通过观察显而易见,浏览器不会等待/ html标记开始工作.这个问题不一定与Javascript有任何关系.例如,我描述的显示状态的第二页是纯HTML.

E-m*_*man 1

--- 澄清后回答 ---

我原来的答案应该对某人有用(我希望),但这不是对问题的直接回答,所以我会发布另一个答案

您重述的问题的答案是“否”。在FF的情况下,有一个预定义的初始渲染延迟,但其他浏览器会有所不同。FF 渲染延迟也可以调整。

以 FF 为例,最初的 250 毫秒是 FF在尝试第一次渲染之前至少找出一些有用信息的时间。然后,当它了解更多信息时,它会定期进行额外的渲染。

您无法确定浏览器何时开始呈现 HTML 文档。

--- 原答案 ---

为了直接回答你的问题,我相信 Firefox 在处理收到的第一个数据之前会等待 250 毫秒,但这可以改变。至于其他浏览器,我不知道。

但是,您不想走那条路。

当 jQuery 准备好发挥其魔力时,它会通过 fire 通知您$(document).ready()。在此之前,任何使用 jQuery 的尝试都将失败。换句话说,您的微调器没有显示,因为 jQuery 尚未准备好处理该请求。

考虑以下示例,其中屏幕上显示两个占位符,我们将使用 jQuery 隐藏它们。

<html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
        <script>

            // We're not ready yet.  This will fail.
            $(".placeholder").hide();

            $(document).ready(function(){
                // This won't fail
                $("#one").hide();
            });

        </script>
    </head>
    <body>
        <div id="one" class="placeholder">Placeholder One</div>
        <div id="two" class="placeholder">Placeholder Two</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

乍一看这似乎$("#one").hide();是多余的,但事实并非如此。 $(".placeholder").hide();在 jQuery 准备好之前调用,因此它没有任何效果,这就是为什么如果您在 Web 浏览器中运行上面的标记,您会看到显示“占位符二”(而不是“占位符一”)。

既然我们已经解决了这个问题,那么更大问题(“正确的方法”)的解决方案就是 AJAX。

  1. 加载包含微调器代码的基页。确保加载微调器的代码作为$(document).ready().
  2. 使用jQuery 的 AJAX 功能来获取您想要的报告。
  3. 当它返回时,隐藏微调器,将报告插入到您的基页中。

祝你好运!

  • 这是错误的,在调用 `.ready()` 之前你不能使用 jQuery。在 .ready() 触发之前进行调用时,您不能保证文档中的每个元素都可用,但可能存在许多元素。特别是,如果您将 script 标签放入 HTML 正文中,则即使 .ready() 尚未触发,脚本标签之前的所有元素都可以安全使用。 (2认同)