1

サーバー側に、ファイル名が 0.txt、1.txt、2.txt、3.txt などのテキスト ファイルがたくさんあります。すべてのファイルのコンテンツを読み取り、それらを配列 A に格納したい。A[0] には 0.txt のコンテンツがあり、A[1] には 1.txt のコンテンツがある...

Javascript / jqueryでどうすればいいですか?

もともと、jQuery で $.ajax({}) を使用してこれらのテキスト ファイルをロードしていました。しかし、ajax の非同期性のため、うまくいきませんでした。$.ajax({...async=false...}) を設定しようとしましたが、非常に遅くなりました。合計で 10KB のファイルを 1000 個まで読み取る必要があります。

4

3 に答える 3

1

あなたが探しているのは、HTML5 で導入されたFile API (作業草案) です。

この記事の例は、正しい方向を示しています。エンド ユーザーがアクションを開始して手動でファイルを選択する必要があることに注意してください。

アップデート:

(またしても) mozilla docosの方が読みやすいことがわかりました! クイック HTML モックアップ:

<input type="file" id="files" name="files[]" onchange="loadTextFile();" multiple/>
<button id="test"onclick="test();">What have we read?</button>

...そして JavaScript:

var testArray = []; //your array

function loadTextFile() {
  //this would be tidier with jQuery, but whatever
  var _filesContainer = document.getElementById("files");
  //check how many files have been selected and iterate over them
  var _filesCount = _filesContainer.files.length;
  for (var i = 0; i < _filesCount; i++) {
    //create new FileReader instance; I have to read more into it
    //but I was unable to just recycle one
    var oFReader = new FileReader();

    //when the file has been "read" by the FileReader locally
    //log its contents and push them into an array
    oFReader.onload = function(oFREvent) {
      console.log(oFREvent.target.result);
      testArray.push(oFREvent.target.result);
    };

    //actually initiate the read
    oFReader.readAsText(_filesContainer.files[i]);
  }
}

//sanity check
function test() {
  for (var i = 0; i < testArray.length; i++) {
    console.warn(testArray[i]);
  }
}​

いじられた

于 2012-09-16T01:51:58.323 に答える
1

あなたの質問から、サーバーからローカルにtxtファイルをロードしたい:

var done = 0, resultArr = [], numberOfFiles = 1000;

function getHandler(idx) {
    return function(data) {
        resultArr[idx] = data;
        done++;
        if (done === numberOfFiles) {
            // tell your other part all files are loaded
        }
    }
}

for (var i = 0; i < numberOfFiles; i++) {
    $.ajax(i + ".txt").done(getHandler(i));
}

jsFiddle: http://jsfiddle.net/LtQYF/1/

于 2012-09-16T02:48:06.667 に答える
-1

特定の答えを与えるための多くの情報を提供しません。ただし、「ajax の非同期性のために動作しない」というのは正しくないというのが私の意見です。正しいサイズの配列を割り当て、各ファイルにコールバックを使用できるはずです。サーバー上でファイルをバンドルし、クライアント上でそれらをアンバンドルするなど、他のオプションを試すことができます。問題にうまく対処する設計は、提供していない詳細に依存します。

于 2012-09-16T02:09:56.677 に答える