【问题标题】:Including a .js file within a .js file [duplicate]在 .js 文件中包含 .js 文件 [重复]
【发布时间】:2011-01-09 21:29:29
【问题描述】:

我想知道是否可以在另一个 .js 文件中包含一个 .js 文件?

我想要这样做的原因是为了将客户包含的内容保持在最低限度。我有几个.js 文件已经编写了客户端所需的功能。客户将拥有一个 html 文件,他/她使用 .js 文件包括(我的 .js 文件)来管理该文件。

我可以重新编写一个包含所有函数的新 .js 文件,或者为了避免重复工作,想办法编写一个包含其他 .js 文件的 .js 文件。

【问题讨论】:

标签: javascript


【解决方案1】:

我基本上是这样做的,创建新元素并将其附加到<head>

var x = document.createElement('script');
x.src = 'http://example.com/test.js';
document.getElementsByTagName("head")[0].appendChild(x);

您也可以对附加的每个脚本使用onload 事件,但请测试一下,我不确定它是否可以跨浏览器工作。

x.onload=callback_function;

【讨论】:

  • 由于它是异步的,我不确定它们是否会按照您期望的顺序到达
【解决方案2】:

浏览器加载时间的最佳解决方案是使用服务器端脚本将它们全部连接到一个大的 .js 文件中。确保 gzip/minify 最终版本。单一请求 - 美观紧凑。

或者,您可以使用 DOM 创建一个 <script> 标记并在其上设置 src 属性,然后将其附加到 <head>。如果您需要等待该功能加载,您可以通过该脚本标记上的 load 事件调用其余的 javascript 文件。

这个函数是基于jQuery$.getScript()的功能实现的

function loadScript(src, f) {
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.src = src;
  var done = false;
  script.onload = script.onreadystatechange = function() { 
    // attach to both events for cross browser finish detection:
    if ( !done && (!this.readyState ||
      this.readyState == "loaded" || this.readyState == "complete") ) {
      done = true;
      if (typeof f == 'function') f();
      // cleans up a little memory:
      script.onload = script.onreadystatechange = null;
      head.removeChild(script);
    }
  };
  head.appendChild(script);
}

// example:
loadScript('/some-other-script.js', function() { 
   alert('finished loading');
   finishSetup();
 });

【讨论】:

    【解决方案3】:

    没有直接的方法可以做到这一点。

    您可以做的是按需加载脚本。 (再次使用类似于 Ignacio 提到的内容,但更简洁)。

    查看此链接以了解执行此操作的多种方法: http://ajaxpatterns.org/On-Demand_Javascript

    我最喜欢的是(并不总是适用):

    <script src="dojo.js" type="text/javascript">
    dojo.require("dojo.aDojoPackage");
    

    Google 的闭包也提供了类似的功能。

    【讨论】:

    • 链接同时失效。
    【解决方案4】:

    解决从 HTML 文件中减少 JavaScript 引用的问题的一种流行方法是使用像 Sprockets 这样的连接工具,它可以将 JavaScript 源文件预处理和连接在一起。

    除了减少来自 HTML 文件的引用数量外,这还将减少对服务器的访问次数。

    然后,您可能希望通过jsmin 之类的缩小工具运行生成的串联以将其缩小。

    【讨论】:

      【解决方案5】:

      我使用@gnarf 的方法,尽管我使用document.writeln IE<script> 标记,因为我无法让DOM 创建在IE6 中可靠地工作(而且TBH 并不在意放置付出了很多努力)。我的代码的核心是:

      if (horus.script.broken) {
          document.writeln('<script type="text/javascript" src="'+script+'"></script>');   
          horus.script.loaded(script);
      } else {
          var s=document.createElement('script');
          s.type='text/javascript';
          s.src=script;
          s.async=true;
      
          if (horus.brokenDOM){
              s.onreadystatechange=
                  function () {
                      if (this.readyState=='loaded' || this.readyState=='complete'){
                          horus.script.loaded(script);
                      }
              }
          }else{
              s.onload=function () { horus.script.loaded(script) };
          }
      
          document.head.appendChild(s);
      }
      

      其中horus.script.loaded() 指出 javascript 文件已加载,并调用任何待处理的未调用例程(由自动加载器代码保存)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 2012-07-14
        • 2013-03-24
        • 1970-01-01
        相关资源
        最近更新 更多