2016-04-18 16 views
0

ファイルをアップロードしていて、ロードごとにプログレスバーを表示していますが、1つのプログレスバーにのみ適用されます。 HTMLで進行状況バーがファイルアップロードの幅を更新しない

、JavaScriptでは

<input type="file" id="file-input" multiple> 
    <div id="file-list"> 
    </div> 

$('#file-input').change(function(e) { 

for (var i = 0, f; f = files[i]; i++) { 

    var reader = new FileReader(); 
    reader.readAsBinaryString(f); 

    reader.onloadstart = function (e) { 
     var text = '<div><div id="progress_bar" class="loading"><div class="percent">0%</div></div></div>'; 
     $('#file-list').append(text); 
    } 

    reader.onload = function(e) { 
     var progress = document.querySelector('.percent'); 
     progress.style.width = '100%'; // replacing with percentage 
     progress.textContent = '100%'; 
    } 
} 

})。

3つのファイルを同時にアップロードすると、100%の進行状況バーと0%の2つのバーが表示されます。これには何が問題なのですか?

+0

は、各 'File'オブジェクトの進行状況を表示するための要件ですか? http://stackoverflow.com/questions/19871627/javascript-for-loop-scope-takes-last-variableも参照してください。 'FileReader'は非同期です。 2回目のファイルアップロードは、最初のファイルアップロードが完了するまで待つことはありません。 – guest271314

+0

はい、アップロードする各ファイルの進捗状況を表示したいと思います。ありがとう。 – user2307087

答えて

1

forの外側にfを定義すると、forループに条件i < f.lengthを含めるように調整できます。 FileReaderへの呼び出しごとに別のスコープを作成するには、iをIIFEに渡します。

$("#file-input").change(function(e) { 
 
    var f = e.target.files; 
 
    for (var i = 0; i < f.length; i++) { 
 
    (function(n) { 
 
     var reader = new FileReader(); 
 
     reader.readAsBinaryString(f[n]); 
 

 
     reader.onloadstart = function(e) { 
 
     var text = "<div><div class=loading><div class=percent-" 
 
        + n + ">0%</div></div></div>"; 
 
     $("#file-list").append(text + "<br>"); 
 
     } 
 

 
     reader.onload = function(e) { 
 
     var progress = $(".percent-" + n); 
 
     progress.css("width", "100%"); // replacing with percentage 
 
     progress.text("100%"); 
 
     } 
 
    }(i)) 
 
    } 
 
});
[class^="percent"] { 
 
    width: 1%; 
 
    height: 24px; 
 
    background: green; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<input type="file" id="file-input" multiple> 
 
<div id="file-list"> 
 
</div>

も参照してくださいUpload multiple image using AJAX, PHP and jQuery

+0

それは動作します。ありがとう。 – user2307087

+0

もう1つ質問があります。それはIE上で動作していません。それは普遍的ではありませんか? – user2307087

+0

@ user2307087 http://caniuse.com/#feat=filereader、https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString、https://developer.mozilla.orgを参照してください。/en-US/docs/Web/API/FileReader/readAsArrayBuffer – guest271314

関連する問題