代码之家  ›  专栏  ›  技术社区  ›  Hristo

如何通过JavaScript文件包含目录中的所有JavaScript文件?

  •  39
  • Hristo  · 技术社区  · 14 年前

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

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

    那么有没有一种方法可以包含目录中的所有文件(未知大小)?我能做点像。。。

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

    ... 要获取“js”目录中的所有JavaScript文件?如何使用jQuery完成此操作?

    10 回复  |  直到 9 年前
        1
  •  25
  •   Mark Bessey    14 年前

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

    如果不想使用服务器端脚本,可以将JS文件放入允许列出目录内容的目录中,然后使用XMLHttpRequest读取目录内容,并解析出文件名并加载它们。

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

        2
  •  23
  •   jellyfishtree    14 年前

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

    $handle=opendir("scripts/");
    
    while (($file = readdir($handle))!==false) {
    echo '<script type="text/javascript" src="$file"></script>';
    }
    
    closedir($handle);
    
        3
  •  14
  •   rob    14 年前

    考虑到你想要一个100%的客户端解决方案,理论上你可以这样做:

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

    用javascript解析这个文件,取出所有的.js文件。这当然会对web服务器/web主机上目录列表的格式敏感。

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

    function loadScript (dir, file) {
     var scr = document.createElement("script");
     scr.src = dir + file;
     document.body.appendChild(scr);
     }
    
        4
  •  3
  •   bwest87    10 年前

    你可以用一些像 Grunt Include Source . 它提供了一个很好的语法,可以对HTML进行预处理,然后包含您想要的任何内容。这也意味着,如果您正确地设置了构建任务,那么您可以将所有这些包括在dev模式下,而不是prod模式下,这非常酷。

    如果你的项目没有使用Grunt,那么可能有类似的工具用于Gulp或其他任务管理器。

        5
  •  2
  •   Alberto Martinez    14 年前

    在JavaScript中不能这样做,因为JS在 浏览器 ,不在服务器中,因此它对目录或其他服务器资源一无所知。

    最好的选择是使用服务器端脚本,比如jellyfishtree发布的脚本。

        6
  •  2
  •   Yuriy N.    10 年前

    它可以完全在客户端完成,但必须指定所有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
  •  1
  •   Pascal    10 年前

    @jellyfishtree如果您创建一个php文件,其中包含目录中的所有js文件,然后只通过脚本标记包含此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>
    

    就这样!
    玩得高兴!:)

        8
  •  1
  •   Loïc Faure-Lacroix    10 年前

    你不能在浏览器的Javascript中这样做。。。如果我是你,我会用 browserify . 使用commonjs模块编写代码,然后将javascript文件编译为一个。

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

        9
  •  0
  •   Frozenfrank    9 年前

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

    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 . 如果您真的想将文件加载到页面中,那么可以使用我开发的另一个helper函数。

    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);
    

    它的工作令人惊讶!

        10
  •  0
  •   Alan    8 年前

    另一个很短的选项是:

    <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>