【问题标题】:How can I include all JavaScript files in a directory via JavaScript file?如何通过 JavaScript 文件将所有 JavaScript 文件包含在目录中?
【发布时间】:2011-05-09 16:02:29
【问题描述】:

我有一堆 JavaScript 文件想要包含在页面中,但我不想一直写下去

<script type="text/javascript" src="js/file.js"></script>

那么有没有办法将所有文件包含在一个目录中(大小未知)?我可以做类似...

$.getScript("js/*.js");

... 获取“js”目录中的所有 JavaScript 文件?如何使用 jQuery 做到这一点?

【问题讨论】:

    标签: javascript jquery getscript


    【解决方案1】:

    一般来说,这可能不是一个好主意,因为您的 html 文件应该只加载它们实际使用的 JS 文件。无论如何,这对于任何服务器端脚本语言来说都是微不足道的。只需在将页面提供给客户端之前插入脚本标签。

    如果你想在不使用服务器端脚本的情况下做到这一点,你可以将你的 JS 文件放到一个允许列出目录内容的目录中,然后使用 XMLHttpRequest 读取目录的内容,并解析出文件名并加载它们。

    选项 #3 是有一个“加载器”JS 文件,它使用 getScript() 来加载所有其他文件。将其放在所有 html 文件中的脚本标记中,然后您只需在上传新脚本时更新加载程序文件。

    【讨论】:

    • 我认为这是在没有服务器端脚本的情况下完成 OP 想要的唯一方法。但我同意,最好避免。
    • 我喜欢选项#3,并且我同意这不是一个好的选项。但是,我想先让它工作:) 那么我将如何使用.getScript() 来获取目录中的 all 文件?你能提供一些代码吗?
    • Hristo,我的意思是您可以为目录中的每个 JavaScript 文件调用一次 getScrip(),然后在每次向目录中添加新文件时添加一个新条目。
    • jellyfishtree,我不认为你理解我在说什么 - 例如,如果 OP 将所有 JS 文件放在“脚本”目录中,那么 javascript 在他们的 HTML page 可以只为“example.com/scripts”执行 XmlHttpRequest,这将返回服务器上的目录列表。然后他们可以只解析响应的文本,并加载每个单独的文件。
    • 这样做会很酷,即使只是为了好玩。它将允许开发人员将 js 文件拖放到 js 文件夹中,并像应用程序一样部署它们的功能。无需编写代码。如果它可以工作,我可以看到它的一些neato应用程序。
    【解决方案2】:

    使用服务器端脚本生成脚本标记行怎么样?粗略地说,像这样的东西(PHP)-

    $handle = opendir("scripts/");
    
    while (($file = readdir($handle))!== false) {
        echo '<script type="text/javascript" src="' . $file . '"></script>';
    }
    
    closedir($handle);
    

    【讨论】:

    • eh...我想将此作为最后的手段。我现在更喜欢不使用 PHP。
    • 我只是认为这在 Javascript 中是不可能的,因为它无法访问任何文件系统。也许是一个 ActiveX 对象,但用户可能不会喜欢这个。
    【解决方案3】:

    鉴于您想要一个 100% 的客户端解决方案,理论上您可以这样做:

    通过 XmlHttpRequest,获取该目录的目录列表页面(如果目录中没有 index.html 文件,大多数 Web 服务器会返回文件列表)。

    使用 javascript 解析该文件,提取所有 .js 文件。这当然会对您的网络服务器/网络主机上的目录列表格式敏感。

    动态添加脚本标签,如下所示:

    function loadScript (dir, file) {
     var scr = document.createElement("script");
     scr.src = dir + file;
     document.body.appendChild(scr);
     }
    

    【讨论】:

    【解决方案4】:

    你不能在 JavaScript 中这样做,因为 JS 是在 浏览器 中执行的,而不是在服务器中,所以它对目录或其他服务器资源一无所知。

    最好的选择是使用像 jellyfishtree 发布的那样的服务器端脚本。

    【讨论】:

    • 嗯,getScript 需要脚本的路径,对吧?没有魔法。
    • 除非与某些服务器端脚本一起使用,否则您无法从 JS 访问私有服务器资源。它们在不同的地方执行(一个在客户端,另一个在服务器)。
    【解决方案5】:

    @jellyfishtree 如果您创建一个包含目录中所有 js 文件的 php 文件,然后仅通过脚本标记包含此 php 文件,那会更好。这具有更好的性能,因为浏览器对服务器的请求更少。看到这个:

    javascripts.php:

    <?php
       //sets the content type to javascript 
       header('Content-type: text/javascript');
    
       // includes all js files of the directory
       foreach(glob("packages/*.js") as $file) {
          readfile($file);
       }
    ?>
    


    index.php:

    <script type="text/javascript" src="javascripts.php"></script>
    

    就是这样!
    玩得开心! :)

    【讨论】:

      【解决方案6】:

      完全可以在客户端完成,但必须指定所有 javascript 文件名。 例如,作为数组项:

      function loadScripts(){
         var directory = 'script/';
         var extension = '.js';
         var files = ['model', 'view', 'controller'];  
         for (var file of files){ 
             var path = directory + file + extension; 
             var script = document.createElement("script");
             script.src = path;
             document.body.appendChild(script);
         } 
       }
      

      【讨论】:

      • 喜欢你的快速回答,并在下面稍微调整了一下,我认为你需要将脚本添加到头部而不是正文,谢谢
      【解决方案7】:

      您可以使用 Grunt Include Source 之类的内容。它为您提供了一个很好的语法来预处理您的 HTML,然后包含您想要的任何内容。这也意味着,如果您正确设置构建任务,您可以在开发模式下包含所有这些内容,但不能在生产模式下,这非常酷。

      如果您的项目没有使用 Grunt,那么 Gulp 或其他任务运行器可能有类似的工具。

      【讨论】:

      • 如果今天提出这个问题,这将是公认的答案
      【解决方案8】:

      您不能在浏览器中使用 Javascript 执行此操作...如果我是您,我会使用 browserify 之类的东西。使用 commonjs 模块编写代码,然后将 javascript 文件编译为一个。

      在您的 html 中加载您编译的 javascript 文件。

      【讨论】:

        【解决方案9】:

        另一个很短的选项:

        <script type="text/javascript">
        $.ajax({
          url: "/js/partials",
          success: function(data){
             $(data).find('a:contains(.js)').each(function(){
                // will loop through 
                var partial= $(this).attr("href");
                $.getScript( "/js/partials/" + partial, function( data, textStatus, jqxhr ) {});
             });
          }
        });
        </script>
        

        【讨论】:

          【解决方案10】:

          我一直在寻找这个问题的答案并且遇到了自己的问题。我在不同的地方找到了几个解决方案,并将它们组合成我自己喜欢的答案。

          function exploreFolder(folderURL,options){
          /* options:                 type            explaination
          
              **REQUIRED** callback:  FUNCTION        function to be called on each file. passed the complete filepath
              then:                   FUNCTION        function to be called after loading all files in folder. passed the number of files loaded
              recursive:              BOOLEAN         specifies wether or not to travel deep into folders
              ignore:                 REGEX           file names matching this regular expression will not be operated on
              accept:                 REGEX           if this is present it overrides the `ignore` and only accepts files matching the regex
          */
          $.ajax({
              url: folderURL,
              success: function(data){
                  var filesLoaded = 0,
                  fileName = '';
          
                  $(data).find("td > a").each(function(){
                      fileName = $(this).attr("href");
          
                      if(fileName === '/')
                          return;  //to account for the (go up a level) link
          
                      if(/\/\//.test(folderURL + fileName))
                          return; //if the url has two consecutive slashes '//'
          
                      if(options.accept){
                          if(!options.accept.test(fileName))
                              //if accept is present and the href fails, dont callback
                              return;
                      }else if(options.ignore)
                          if(options.ignore.test(fileName))
                              //if ignore is present and the href passes, dont callback
                              return;
          
                      if(fileName.length > 1 && fileName.substr(fileName.length-1) === "/")
                          if(options.recursive)
                              //only recurse if we are told to
                              exploreFolder(folderURL + fileName, options);
                          else
                              return;
          
                      filesLoaded++;
                      options.callback(folderURL + fileName);
                      //pass the full URL into the callback function
                  });
                  if(options.then && filesLoaded > 0) options.then(filesLoaded);
              }
          });
          }
          

          那么你可以这样称呼它:

          var loadingConfig = {
              callback: function(file) { console.log("Loaded file: " + file); },
              then: function(numFiles) { console.log("Finished loading " + numFiles + " files"); },
              recursive: true,
              ignore: /^NOLOAD/,
          };
          exploreFolder('/someFolderURL/', loadingConfig);
          

          此示例将对指定文件夹中的每个文件/文件夹调用该回调除了,对于以NOLOAD 开头的文件/文件夹。如果您想实际将文件加载到页面中,那么您可以使用我开发的其他辅助函数。

          function getFileExtension(fname){
              if(fname)
                  return fname.substr((~-fname.lastIndexOf(".") >>> 0) + 2);
              console.warn("No file name provided");
          }
          var loadFile = (function(filename){
              var img = new Image();
          
              return function(){
                  var fileref,
                      filename = arguments[0],
                      filetype = getFileExtension(filename).toLowerCase();
          
                  switch (filetype) {
                      case '':
                          return;
                      case 'js':
                          fileref=document.createElement('script');
                          fileref.setAttribute("type","text/javascript");
                          fileref.setAttribute("src", filename);
                          break;
                      case "css":
                          fileref=document.createElement("link");
                          fileref.setAttribute("rel", "stylesheet");
                          fileref.setAttribute("type", "text/css");
                          fileref.setAttribute("href", filename);
                          break;
                      case "jpg":
                      case "jpeg":
                      case 'png':
                      case 'gif':
                          img.src = filename;
                          break;
                      default:
                          console.warn("This file type is not supported: "+filetype);
                          return;
                  }
                  if (typeof fileref !== undefined){
                      $("head").append(fileref);
                      console.log('Loaded file: ' + filename);
                  }
              }
          })();
          

          这个函数接受一个 JS | CSS | (普通图像)文件并加载它。它还将执行 JS 文件。 需要在脚本中运行以加载所有图像和*样式表其他脚本的完整调用可能如下所示:

          loadingConfig = {
              callback: loadfile,
              then: function(numFiles) { console.log("Finished loading " + numFiles + " files"); },
              recursive: true,
              ignore: /^NOLOAD/,
          };
          exploreFolder('/someFolderURL/', loadingConfig);
          

          效果惊人!

          【讨论】:

          • 对此的一个警告是它需要服务器发布其目录中的文件列表。您的服务器设置中有一个设置允许这样做,如果它被禁用,没有服务器端代码实际上是不可能得到你想要的。
          • 同样依赖jQuery加载文件列表(exploreFolder内),然后加载文件(loadFile内)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-23
          • 2011-03-04
          • 2021-04-18
          • 2010-10-10
          相关资源
          最近更新 更多