如何让浏览器等待显示页面,直到它完全加载?

Bea*_*red 74 javascript css web

我讨厌你如何实际看到网页加载.我认为等待页面完全加载并准备好显示(包括所有脚本和图像)然后让浏览器显示它会更有吸引力.所以我有两个问题......

  1. 我怎样才能做到这一点?
  2. 我是网络开发的总菜鸟,但这是常见做法吗?如果没有,为什么?

提前感谢您的智慧!

Gra*_*ner 30

对于给出的所有原因,这是一个非常糟糕的主意,甚至更多.也就是说,这是你如何使用jQuery做到的:

<body>
<div id="msg" style="font-size:largest;">
<!-- you can set whatever style you want on this -->
Loading, please wait...
</div>
<div id="body" style="display:none;">
<!-- everything else -->
</div>
<script type="text/javascript">
$(document).ready(function() {
    $('#body').show();
    $('#msg').hide();
});
</script>
</body>
Run Code Online (Sandbox Code Playgroud)

如果用户禁用了JavaScript,则他们永远不会看到该页面.如果页面永远不会完成加载,他们永远不会看到页面.如果页面加载时间太长,他们可能会假设出现问题而只是去其他地方而不是*请等待......*ing.

  • 解决这个解决方案的无javascript问题的一种方法是利用`<noscript>`标签来"撤销"`display:none`效果. (10认同)

Rob*_*ner 20

我认为这是一个非常糟糕的主意.用户喜欢看到进步,简单明了.将页面保持在一个状态几秒钟,然后立即显示加载的页面将使用户感觉没有任何事情发生,您可能会失去访问.

一个选项是在后台处理内容时显示页面上的加载状态,但这通常是在网站实际处理用户输入时保留的.

http://www.webdeveloper.com/forum/showthread.php?t=180958

最重要的是,你至少需要在页面加载时显示一些视觉活动,而且我认为一次加载一小部分页面并不是那么糟糕(假设你没有做一些严重减慢页面的事情)加载时间).

  • 我认为这样概括是不公平的。如果您正在构建一个非常快速和活泼的网站,那么浏览器决定通过显示未完成的渲染网站的几个帧来破坏体验,这很烦人。我认为我们应该争取更好的网站和更好的用户体验。我并不是说这个修复是一个好的修复,我宁愿让浏览器等到它完成处理。然后由网站来确保他们的东西得到了很好的优化并且加载速度很快。我们不应该构建系统,以便程序员可以摆脱懒惰和不良行为。 (2认同)

Kei*_*ler 10

肯定有一个有效的用途.一种是阻止人们点击链接/导致JavaScript事件发生,直到加载了所有页面元素和JavaScript.

IE中,您可以使用页面转换,这意味着页面在完全加载之前不会显示:

<meta http-equiv="Page-Enter" content="blendTrans(Duration=.01)" />
<meta http-equiv="Page-Exit" content="blendTrans(Duration=.01)" />
Run Code Online (Sandbox Code Playgroud)

注意持续时间短.这足以确保页面在完全加载之前不会显示.

FireFox和其他浏览器中,我使用的解决方案是创建一个页面大小和白色的DIV,然后在页面的最末端放入隐藏它的JavaScript.另一种方法是使用jQuery并隐藏它.不像IE解决方案那样轻松,但两者都运行良好.

  • @ChristopheD答:世界上那些关闭javascript的10个人将无法看到该页面. (6认同)
  • @ChristopheD 似乎很多事情都依赖于 JS,所以 [至少对于我的网站] 无论如何它都无法正常运行。 (2认同)

Tre*_*ham 10

这是使用jQuery的解决方案:

<script type="text/javascript">
$('#container').css('opacity', 0);
$(window).load(function() {
  $('#container').css('opacity', 1);
});
</script>
Run Code Online (Sandbox Code Playgroud)

我把这个脚本放在我的</body>标签之后.只需将"#container"替换为要隐藏的DOM元素的选择器即可.我尝试了几种变体(包括.hide()/ .show().fadeOut()/ .fadeIn()),只是设置不透明度似乎有最少的不良影响(闪烁,改变页面高度等).您也可以替换css('opacity', 0)fadeTo(100, 1)一个平滑的过渡.(不,fadeIn()不会起作用,至少不是在jQuery 1.3.2下.)

现在注意事项:我实现了上面的原因,因为我正在使用TypeKit,当你刷新页面并且字体需要几百毫秒才能加载时会出现恼人的闪烁.因此,在TypeKit加载之前,我不希望任何文本出现在屏幕上.但是,如果您使用上面的代码并且页面上的某些内容无法加载,那么显然您遇到了大麻烦.有两种明显的方法可以改进:

  1. 最大时间限制(例如,1秒),无论页面是否加载,都会显示所有内容
  2. 某种加载指示器(比如来自http://www.ajaxload.info/的东西)

我不打算在这里实施加载指示器,但时间限制很容易.只需将其添加到上面的脚本:

$(document).ready(function() {
  setTimeout('$("#container").css("opacity", 1)', 1000);
});
Run Code Online (Sandbox Code Playgroud)

所以现在,在最糟糕的情况下,您的页面将需要额外的秒才能显示.


小智 5

紧跟在您的 <body> 标签之后添加如下内容...

 <style> body  {opacity:0;}</style>
Run Code Online (Sandbox Code Playgroud)

对于 <head> 中的第一件事,添加类似...

 <script>
  window.onload = function() {setTimeout(function(){document.body.style.opacity="100";},500);};
 </script>
Run Code Online (Sandbox Code Playgroud)

至于这是好的做法还是不好的做法取决于您的访客以及等待所需的时间。

仍然悬而未决且我在这里没有看到任何答案的问题是如何确保页面已经稳定。例如,如果您正在加载字体,页面可能会回流一点,直到所有字体都加载并显示出来。我想知道是否有一个事件告诉我页面已完成渲染。