在渲染页面之前加载javascript?

fil*_*lle 22 javascript jquery

我想在我的页面加载之前运行一些jquery代码.我添加了一些使用javascript更改css的类,当页面加载时,我会在短时间内看到"旧"css.有任何想法吗?谢谢

T.J*_*der 35

我想在我的页面加载之前运行一些jquery代码.

这很容易做到; 这很有趣,因为很多时候,人们都试图以相反的方式去做.

当浏览器遇到script标记时,禁止使用一些特殊属性(以及支持它们的浏览器),页面的所有处理都会暂停,浏览器会将脚本交给JavaScript引擎.仅在脚本完成时才继续处理页面.

因此,如果页面部分中有script标记,则head可以通过以下document.write函数输出CSS类:

<DOCTYPE html>
<html>
<head><title>Foo</title>
<script src='jquery.js'></script>
<script>
if (some_condition) {
    document.write("<style>foo { color: blue; }</style>");
}
else {
    document.write("<style>foo { color: red; }</style>");
}
</script>
Run Code Online (Sandbox Code Playgroud)

请注意,some_condition在上面只能依赖并引用文档中它上面的项目(因为浏览器还没有对文档的其余部分做任何事情,因为它正在等待document.write脚本将要访问的内容输出).

实例(刷新几次,一半是红色,一半是蓝色).它不使用jQuery,但你明白了.

  • 我应该补充一点:你没有提到导致你需要这样做的设计限制,我确信可能存在某些不可避免的情况.但我倾向于认为10次中的9次,退后一步并再次查看实际的设计问题可能会产生一种不依赖于运行JavaScript来定制CSS的解决方案.也许不是第十次,但肯定是前九次...... (2认同)
  • @fille:“更好”是一个非常主观的术语。您选择哪种解决方案取决于您想要实现的目标。如果您使用“display: none”并允许在向用户显示页面之前构建所有元素,则您的优点是能够直接对这些元素进行操作,但缺点是会导致感知的页面加载延迟(浏览器显示正在解析的页面*)。所以,如果你能避免这种情况,我会的,但几乎可以肯定,有时候这就是你想要的——不是*整个*页面,而是其中的一部分,当然。 (2认同)

Lio*_*hen 5

假设您已在主体上使用onLoad事件或使用jQuery ready回调,则可以从style ="display:none;"开始.在你的根div上,做你的JS东西,最后在你准备公开内容时在那个div上设置"display:block".瞧?


Ori*_*iol 5

基本上,这与实现装载程序/旋转程序类似。您向用户显示动画的gif,然后在页面完成加载时将其删除。
在这种情况下,我们不显示gif,而是显示空白。

有多种方法可以实现此结果。在便利性和性能方面,这里的订购很少。

  1. 全局CSS规则
    隐藏body您的全局CSS文件。

    body { display:none; }
    
    Run Code Online (Sandbox Code Playgroud)

    文档加载完成后,切换显示:

    // Use 'load' instead of 'ready' cause the former will execute after DOM, CSS, JS, Images are done loading
    $(window).load(function(){
      $(body).show();
    });
    
    Run Code Online (Sandbox Code Playgroud)

    演示版

  2. 带有div层的封面使用div
    隐藏在页面顶部的内容,然后将其删除。

    div#page_loader {
       position: absolute;
       top: 0;
       bottom: 0;
       left: 0;
       right: 0;
       background-color: white;
       z-index: 100;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    演示版

  3. JavaScript代码段在页面呈现之前
    隐藏body

    <body onload="document.body.style.display='none';">
    
    Run Code Online (Sandbox Code Playgroud)

    演示版

如果使用Modernizr,则还可以利用其CSS类来隐藏/显示内容,具体取决于用户的设备或浏览器。

但是我不建议这样做,因为它jQuery在页面顶部运行脚本,这会增加额外的负担,甚至延迟进一步的页面渲染。

  • 对于渐进增强问题,您可以设置此规则:`.no-js body { display: block !important; }`。这样,如果 JavaScript 未激活,页面仍会显示。 (2认同)