【问题标题】:Why call $.getScript instead of using the <script> tag directly?为什么调用 $.getScript 而不是直接使用 <script> 标签?
【发布时间】:2011-05-22 12:41:56
【问题描述】:

我不明白更换这个的原因:

<script src="js/example.js"></script>

用这个:

$.getScript('js/example.js', function() {
  alert('Load was performed.');
});

使用 jQuery 版本有什么特别的原因吗?

【问题讨论】:

    标签: javascript jquery script-tag getscript


    【解决方案1】:

    我能想到的唯一原因是您在加载脚本时收到回调。但是您也可以使用script 标记来获取该回调,方法是使用load 事件(或在真正旧的IE 上,onreadystatechange)。

    相比之下,这样做有几个否定,尤其是getScript 受制于Same Origin Policy,而script 则不受。

    即使您需要动态加载脚本(您可能需要这样做的原因有很多),坦率地说,除非您真的需要回调,否则我会说您最好通过添加一个来加载脚本script标签:

    $('head:first').append("<script type='text/javascript' src='js/examplejs'><\/script>");
    

    (注意:如果它位于内联脚本标签中,您需要在上面的结束标签中使用其他不必要的 \ 以避免过早结束此代码所在的脚本标签。)

    script 以这种方式添加的标签受同源策略的约束。如果你想要load 回调,那么:

    $("<script type='text/javascript' src='js/examplejs'><\/script>")
        .on("load", function() {
            // loaded
        })
        .appendTo('head:first');
    

    (正如我所说,对于真正旧的 IE,你必须做的不止这些,但现在你不应该需要处理它们。)

    【讨论】:

      【解决方案2】:

      我能想到您可能会使用 jQuery 表单的三个原因:

      1. 您希望将所有脚本声明放在文档的顶部,但您也知道将脚本声明放在那里会强制浏览器在继续进行页面呈现过程之前完整下载它们。这会引入可测量的延迟。 jQuery 表单将调度脚本加载,直到文档下载完成,类似于将所有 &lt;script&gt; 标签放在文档的 end 的效果,只是没有语法上的怪异。
      2. &lt;script&gt; 机制不适用于不在 HTML 文档本身中的脚本;也就是说,如果包含在带有&lt;script&gt; 的页面中的脚本要加载脚本,则只能使用基于JavaScript 的方法,例如调用jQuery 函数。
      3. jQuery 表单允许以提供的回调函数的形式通知脚本成功执行。

      【讨论】:

      • 很好的答案,虽然 #1 和 #2 都是动态加载脚本的参数,而不是 getScript,具体来说,这是(正如我所指出的)受到 script 标签没有的限制。
      • @T.J.:注意。我并不是在提倡 $.getScript() 而不是任何其他特定的基于脚本的方法,只是指出为什么人们可能会使用它而不是 &lt;script&gt;。为您指出同源政策差异的答案+1。
      • 从 jQuery 1.2 开始,您可以使用 $.getScript 来动态加载跨域脚本。来源:blog.jquery.com/2007/09/10/jquery-1-2-released
      【解决方案3】:

      没有必要这样做..

      如果您想动态加载脚本(在需要时,而不是从头开始),您可以这样做

      【讨论】:

        【解决方案4】:

        该脚本可能依赖于 jQuery,因此如果浏览器尚未加载 jQuery,这将是一种防止浏览器尝试加载它的方法。

        jQuery 无法加载的原因有很多,从简单的网络故障到 CDN 未被NoScript 用户列入白名单。

        【讨论】:

          【解决方案5】:

          也许可以控制何时加载脚本?在 javascript 繁重的页面上,可能值得等待加载一些非必要的内容,直到加载必要的内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-21
            • 2013-07-09
            • 2012-08-04
            • 2023-01-18
            • 2014-07-08
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            相关资源
            最近更新 更多