2

私のページでドラッグドロップファイルを処理する関数があります:

function createDropHandlers() {
  var target = document;
  if (target === null) {
    return false;
  }

  // attach the 'dragover' event to the container
  target.addEventListener('dragover', function(event) {
    event.preventDefault();
  }, true);

  // attach the 'drop' event to the container
  target.addEventListener('drop', function(event) {
    event.preventDefault();
    var files = event.dataTransfer.files;

    // if (files.length > 3)
    // do something like
    // files.slice(files.length-3, files.length);

    for (var i = 0; i < files.length; i++) {
        processFile(files[i]);
        // ...
    }
  }, true);
}

私がやりたいのは、forループの前 (および何らかの方法でファイルを「処理」する前) に、3 つ以上のファイルがドラッグされたかどうかを確認することです。ドラッグされた場合は、「配列」を最後の 3 つの要素にスライスします。私はそれFileListが読み取り専用であることを知っているので、これを達成するためのオプションが何であるかわかりません...
ファイルをアップロードせず、それらを「処理」した後、Fileオブジェクトはまったく必要ありません。私がする必要があるのは、ファイルがオーディオ ファイルであるかどうかを確認し、それらからいくつかのメタデータを読み取り、ページにメタデータを表示することだけです。

4

1 に答える 1

2

slice() は Array のプロトタイプからのメソッドです。新しい配列を返しますが、FileList プロトタイプには含まれていない可能性があります。Array.prototype.slice メソッドを使用して、ファイルリストに適用できます。

Array.prototype.slice.call( fileList ); //will return an array-copy of the filelist
Array.prototype.slice.call( fileList, 0, 3 ); //Then simply use the slice arguments at your convenience

このトリックは、引数にも使用できます (js-libraries コードでよく見られます)。splice() のように、slice は元のオブジェクトを変更しないことに注意してください。

MDN の説明については、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice#Array-likeを参照してください。

于 2013-02-28T13:25:05.043 に答える