48

ページに含めたいJavaScriptファイルがたくさんありますが、書き続ける必要はありません。

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

それで、ディレクトリ(不明なサイズ)にすべてのファイルを含める方法はありますか?私は次のようなことをすることができますか...

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

...「js」ディレクトリ内のすべてのJavaScriptファイルを取得するには?jQueryを使用してこれを行うにはどうすればよいですか?

4

10 に答える 10

29

一般に、これはおそらく良い考えではありません。htmlファイルは実際に使用するJSファイルのみをロードする必要があるためです。とにかく、これはサーバー側のスクリプト言語で行うのは簡単です。クライアントにページを提供する前に、スクリプトタグを挿入するだけです。

サーバーサイドスクリプトを使用せずにこれを実行する場合は、JSファイルをディレクトリの内容を一覧表示できるディレクトリにドロップし、XMLHttpRequestを使用してディレクトリの内容を読み取り、ファイル名を解析してロードします。 。

オプション#3は、getScript()を使用して他のすべてのファイルをロードする「ローダー」JSファイルを用意することです。これをすべてのhtmlファイルのスクリプトタグに入れてください。そうすれば、新しいスクリプトをアップロードするたびにローダーファイルを更新する必要があります。

于 2010-11-13T22:27:15.227 に答える
24

サーバーサイドスクリプトを使用してスクリプトタグ行を生成するのはどうですか?大雑把に言って、このようなもの(PHP)-

$handle = opendir("scripts/");

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

closedir($handle);
于 2010-11-13T22:19:35.963 に答える
16

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);
 }
于 2010-11-13T22:42:53.860 に答える
3

JSはサーバーではなくブラウザで実行されるため、JavaScriptでそれを行うことはできません。そのため、JavaScriptはディレクトリやその他のサーバーリソースについて何も知りませんでした。

最良のオプションは、jellyfishtreeによって投稿されたようなサーバーサイドスクリプトを使用することです。

于 2010-11-13T22:25:27.470 に答える
3

@jellyfishtreeディレクトリからすべてのjsファイルを含む1つの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>

それでおしまい!
楽しむ!:)

于 2014-09-04T20:10:52.187 に答える
3

これは完全にクライアント側で実行できますが、すべての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);
   } 
 }
于 2015-03-15T15:03:49.520 に答える
3

GruntIncludeSourceのようなものを使用できます。HTMLを前処理し、必要なものをすべて含める優れた構文を提供します。これは、ビルドタスクを正しく設定した場合、これらすべてのインクルードをdevモードで使用できるが、prodモードでは使用できないことを意味します。これは非常に便利です。

プロジェクトにGruntを使用していない場合は、Gulpやその他のタスクランナー用の同様のツールがおそらくあります。

于 2015-08-08T23:58:06.513 に答える
1

ブラウザからJavascriptでそれを行うことはできません...私があなたなら、browserifyのようなものを使用します。commonjsモジュールを使用してコードを記述し、javascriptファイルを1つにコンパイルします。

HTMLに、コンパイルしたjavascriptファイルをロードします。

于 2015-03-15T15:18:58.903 に答える
1

かなり短い別のオプション:

<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>
于 2017-02-13T22:35:24.540 に答える
0

私はこの質問に対する答えを探していましたが、私自身の問題がありました。私はさまざまな場所でいくつかの解決策を見つけ、それらをまとめて自分の好みの答えにしました。

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

それは驚くほどうまくいきます!

于 2016-05-16T04:56:24.853 に答える