Jquery 浏览器何时开始呈现部分传输的HTML?
我有一个长时间运行的报告,希望在它生成时向用户显示一个等待微调器。我已经做了这项工作,但不确定我做得最好或正确的方式 这是使用ColdFusion,但我想它可以是任何语言。在页面顶部,我有一些Javascript(jQuery),它显示了一个等待微调器,另外还有一个documentReady处理程序,我可以在其中取下微调器。我刷新输出(如果有必要的话),然后剩下的代码处理报告内容。这并没有呈现微调器,我的理论是,即使我在服务器上刷新东西,一些缓冲也在进行中,浏览器直到太晚才看到微调器代码。所以,我在刷新之前添加了一个循环,它会弹出几百行HTML注释。在微调了行数之后,这就成功了。我想其他网站也是这样做的 但是:今天,当看到我的另一个页面逐行显示一个长期运行作业的状态时,我突然想到,该页面在每一行之后都会刷新,并且浏览器会根据需要以增量方式呈现该页面。这与我上面的结论不符,现在我不知道规则是什么。有没有一种可预测的方法可以做到这一点?每个浏览器有不同吗Jquery 浏览器何时开始呈现部分传输的HTML?,jquery,html,browser,spinner,flush,Jquery,Html,Browser,Spinner,Flush,我有一个长时间运行的报告,希望在它生成时向用户显示一个等待微调器。我已经做了这项工作,但不确定我做得最好或正确的方式 这是使用ColdFusion,但我想它可以是任何语言。在页面顶部,我有一些Javascript(jQuery),它显示了一个等待微调器,另外还有一个documentReady处理程序,我可以在其中取下微调器。我刷新输出(如果有必要的话),然后剩下的代码处理报告内容。这并没有呈现微调器,我的理论是,即使我在服务器上刷新东西,一些缓冲也在进行中,浏览器直到太晚才看到微调器代码。所以,
澄清:我很欣赏那些试图解释如何正确使用等待微调器的答案,但我只是以等待微调器为例来说明我真正的问题:是否有可靠的方法来预测浏览器在通过网络传输HTML时何时开始呈现HTML?通过观察很明显,浏览器不会等待/html标记开始工作。这个问题不一定与Javascript有关。例如,我描述的显示状态的第二个页面是纯HTML。我希望它会因浏览器的不同而有所不同:一些页面会在完全接收到页面之前开始呈现;其他人将在开始之前等待整个html文件 我注意到HTTP响应规范提供了一个“206部分内容”头,这可能为值得研究的跨浏览器解决方案带来一些希望 几乎可以肯定有很多方法可以剪切它,但我的直接想法是交付存根页面,然后使用ajax按需提取和呈现片段。例如,许多大型网站似乎最初提供的是一个最小的视图,如果向下滚动足够多,就会触发一个ajax请求,以检索更多数据并将其附加到页面中。例如:facebook,slashdot 我无法想象这太难实现;即使是寒冷的天气。启动ajax请求时启动微调器,调用回调时停止微调器。---发布澄清答案--- 我的原始答案应该对某人有用(我希望如此),但它不是对问题的直接回答,所以我将发布另一个答案 你重申的问题的答案是“不”。在FF的情况下,有一个预定义的初始渲染延迟,但其他浏览器会有所不同。FF渲染延迟也可以调整 以FF为例,最初的250毫秒是FF在尝试第一次渲染之前至少找出一些有用信息的时间。然后,随着学习的深入,它会定期进行其他渲染 您无法确定浏览器何时开始呈现HTML文档 ---原始答案--- 为了直接回答您的问题,我相信Firefox会在收到第一个数据之前等待250毫秒,但这是可以改变的。对于其他浏览器,我不知道 但是,您不想走这条路。 当jQuery准备好发挥它的魔力时,它将通过触发
$(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>
//我们还没准备好。这将失败。
$(“.placeholder”).hide();
$(文档).ready(函数(){
//这不会失败的
$(“#一”).hide();
});
占位符一
占位符二
一开始可能会出现$(“#one”).hide()代码>是多余的,但这不是真的<代码>$(“.placeholder”).hide()代码>是在jQuery准备就绪之前调用的,因此它没有效果,这就是为什么如果在web浏览器中运行上面的标记,将显示“占位符2”(而不是“占位符1”)
既然我们已经解决了这个问题,那么更大问题的解决方案(“正确的方法”)就是AJAX
加载包含微调器代码的基本页。确保加载微调器的代码作为$(document.ready()
的一部分运行
用于获取所需的报告
当它返回时,隐藏微调器,将报告注入到您的基本页面中
祝你好运 如果我理解正确,您希望在页面仍在加载内容时显示“加载”图像
我所做的,也是我认为最好的方法是在页面顶部添加一个div标记,它最靠近保存加载图像/文本的body标记。你可以在css的帮助下把这个div放在其他地方
然后让Jquery在页面加载时删除这个div。不要使用$(文档)。准备就绪正如一些人建议的那样,我将使用$(窗口)。加载,因为它在整个页面(包括所有帧、对象和图像)完全加载时被激活。
Se链接这里
示例强>
<body>
<div id="loading" style="z-index:200; width:100%; height:40px; border-top:2px #D4D4D4 solid; background:#E8E8E8; color:#000; position:fixed; bottom:0; left:0;">
<div align="center">
<img src="load.gif" alt="Loading...">
</div>
</div>
<script type="text/javascript">
$(window).load(function() { $("#loading").remove(); });
</script>
[...]
$(窗口).load(函数(){$(“#加载”).remove();});
[...]
…除了内置的dela之外