【问题标题】:Load javascript before rendering page?在渲染页面之前加载javascript?
【发布时间】:2017-08-24 19:12:53
【问题描述】:

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

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

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

    这很容易做到;这很有趣,因为很多时候,人们都在尝试反其道而行之。

    当浏览器遇到script 标记时,除非您使用一些特殊属性(以及支持它们的浏览器),否则页面的所有处理都会突然停止,并且浏览器会将脚本交给 JavaScript 引擎。只有当脚本完成时,页面的处理才会继续。

    因此,如果您在页面的head 部分中有script 标记,则可以通过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>
    

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

    Live example(刷新几次,一半是红色,一半是蓝色)。它不使用 jQuery,但你明白了。

    【讨论】:

    • 我应该补充一点:您没有提到导致您需要这样做的设计约束,我敢肯定在某些情况下它是不可避免的。但我倾向于认为 10 次中有 9 次,退后一步重新审视实际的设计问题可能会产生一个不依赖于运行 JavaScript 来定制 CSS 的解决方案。也许不是第十次,但肯定是前九次......
    • 谢谢,还有一个很好的例子 :) 我用另一种方式做了,就像上面提到的一些人一样: display: none on my page, do the jquery stuff -> display: block on这页纸。这样做可以吗,还是你的sulition更好? :)
    • @fille:“更好”是一个非常主观的术语。您选择哪种解决方案取决于您要完成的工作。如果您使用display: none 并允许在页面显示给用户之前构建所有元素,那么您的优势是能够直接对这些元素进行操作,但缺点是会导致页面加载延迟(浏览器显示页面 as 他们正在被解析)。因此,如果您可以避免这种情况,我会这样做,但几乎可以肯定的是,有时它是您想要的——不是针对整个页面,而是针对其中的一部分,当然。
    • @fille:不抱怨,但如果您认为@Lior 的解决方案是解决您的问题的最佳方法,那么将其标记为已接受的答案而不是我的答案可能是合适的。这完全是你的决定,只是,你确实说过你要走另一条路。 :-)
    • 没错,没错,但您的回复仍然是对 imo 的最佳回答。谢谢你的时间:)
    【解决方案2】:

    基本上这是一个与实现加载器/微调器类似的问题。您向用户显示动画 gif,当页面完成加载时,您将其删除。
    在这种情况下,我们不显示 gif,而是显示空白。

    有多种方法可以实现这一结果。以下是一些在易用性和性能方面的排序。

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

      body { display:none; }
      

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

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

      Demo

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

      div#page_loader {
         position: absolute;
         top: 0;
         bottom: 0;
         left: 0;
         right: 0;
         background-color: white;
         z-index: 100;
      }
      

      Demo

    3. JavaScript sn-p
      在页面呈现之前隐藏body:

      <body onload="document.body.style.display='none';">
      

      Demo

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

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

    【讨论】:

    • 对于渐进增强问题,您可以设置此规则:.no-js body { display: block !important; }。这样,如果未激活 JavaScript,页面仍会显示。
    【解决方案3】:

    假设您已经在 body 上使用 onLoad 事件或使用 jQuery 就绪回调,您可以从 style="display:none;" 开始在你的根 div 上,做你的 JS 东西,当你准备好公开内容时,最后在那个 div 上设置“display:block”。瞧?

    【讨论】:

    • 是的,那么这将在脚本执行时创建一个跳转。
    • 跳跃,先生?你能详细说明一下吗?
    • 是否会使用 visibility:hidden 实际上会使其更快,因为当 display 属性设置为 inline 或 block 时,必须重新创建 DOM 树?我知道这是不必要的优化,但只是出于好奇。
    • 我会说 display:none 应该更快。隐藏的可见性仍然要渲染事物,无论它们是否可见,这些元素仍然占据可见空间。在绝对必要之前这样做是没有意义的。我会坚持 display:none/block;为此。
    • 这是一个非常有趣的解决方案,我要试试!
    【解决方案4】:

    在渲染页面之前移除一个css:

    (我用它来从表格中删除 Css 突出显示,并且工作!)

    <script type="text/javascript">
    
        function removeHighlight(){
            var elm = $("#form_show\\:tbl_items tr");
            elm.removeClass('ui-state-highlight');
        }
    
        $(document).ready(function(){
            removeHighlight();
        });
    
    </script>
    

    【讨论】:

    • 在文档准备好之前不会运行。提问者希望代码在页面开始显示之前运行。
    【解决方案5】:

    将您的代码放入准备好的文档中。它里面的所有东西都会在 DOM 被加载并且页面内容被加载之前加载

    $(function(){
     your code goes here...
    });
    

    或者

    $(document).ready(function(){
     your code goes here..
    });
    

    【讨论】:

    • 实际上,这会等到整个页面被渲染,因此会延迟更改相关元素。
    • 没错,它会给 OP 他想要的东西
    • 我完全以另一种方式阅读了这个问题。 “我想在页面加载之前 运行一些 jquery 代码”
    • 我认为你误解了这个问题,如果你还没有 DOM 中的任何元素,你怎么能运行任何代码。我相信 Document ready 是他正在寻找的东西
    • 您可以运行代码来完全按照他所说的去做,将类添加到页面使用的 CSS 中。同样,“之前”这个词很清楚。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多