質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3705閲覧

進捗バーの動きを,複数ファイルの内容読み込み・表示に合わせたい

hachii

総合スコア12

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2018/01/09 12:15

編集2018/01/10 09:14

###現在できること
複数のファイルを読み込み,進捗状況をバーに表示.
###起こっている問題
大容量(※)のファイルを読み込んだとき,表示が終わる前にバーが100%になってしまう.
(※大容量ファイルとは1MB以上の,Shift_JISで書かれたテキストファイルです.)
###完成させたいもの
読み込み状況+表示状況を進捗バーに表示する。
=> **表示が完了したときにバーが100%**になるようにしたい。

HTML

1<input type = "file" id = "targetfile" muliple = "multiple"><br> 2<progress value = "0" max = "100" id = "progress"></progress>

JavaScript

1var prg = document.getElementById("progress"); 2document.getElementById("targetfile").addEventListener('change',function(e){ 3 var result = e.target.files; //複数のファイルデータ 4 var end = e.target.files.length; //ファイル数 5 6 for(var i=0 ; i<end ; i++){ //すべてのファイルを読み込む 7 var reader = new FileReader(); //ファイルリーダーの作成 8 reader.readAsText(result[i]); //textで読み込み 9 reader.onprogress = evt => { 10 prg.value = (evt.loaded / evt.total)*100; //進捗状況 11 }; 12 reader.addEventListener('load',function(e){ 13 str = e.target.result; 14 console.log(str); //取得したファイル内容を表示 15 }); 16 }; 17 });

###環境
Windows10 ⇒ Windows7
GoogleChrome バージョン:63.0.3239.132(Official Build)(64 ビット)
言語 JavaScript

以上,追記するべき箇所等ありましたら,ご指摘の程よろしくお願いいたします.

###追記・修正
2018/01/10 環境をWindows7に変更

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1ntegrale9

2018/01/09 12:26

タイトルが問題と解決したいことを明確に示すようにしてください
hachii

2018/01/09 12:55 編集

ご指摘いただいたタイトルを修正いたしました.このような感じで良いでしょうか.よろしくお願いいたします.
defghi1977

2018/01/09 23:19

コードの内容を見るに「複数のファイル読み込み」が要であるにも関わらず、その部分がタイトルに含まれていないということでは?
hachii

2018/01/10 08:57

遅くなりました.ご指摘いただいた通り大事な部分が抜けていましたので修正いたしました.
1ntegrale9

2018/01/10 09:08

「JavaScript 進捗バー②」だとJavaScriptで進捗バーを実装したいのか、実装した進捗バーに問題があるのかがよく分かりませんし、②が付いていると①を見ていないと回答できないのかと思われてしまうので良くない、という意図でした。今のタイトルであれば大丈夫だと思います。
hachii

2018/01/10 09:11

タイトルの付け方、勉強させていただきました.今後は意識して質問します.ありがとうございました.
guest

回答1

0

ベストアンサー

FileReaderオブジェクトから得られた個別の進捗値を配列として保持しておき, 全体としての進捗値をprogress要素に書き込むようにすればよいでしょう.

但し幾つかの注意点があります.

  • for構文内でFileReaderオブジェクトに直接リスナ関数を登録すると, (varで宣言している)変数iが共有されてしまうため, 変数i内の値を(何らかの方法で)固定する必要があります. (ここではアロー関数を使っています)
  • 進捗値の更新処理はload(もしくはloadend)イベントにも必要です. さもないと見た目の進捗値が100%となりません.

JavaScript

1"use strict"; 2var prg = document.getElementById("progress"); 3document.getElementById("targetfile").addEventListener('change',function(e){ 4 //複数のファイルデータ 5 var result = e.target.files; 6 //ファイル数 7 var end = e.target.files.length; 8 //個別の進捗 9 var progresses = new Array(end); 10 progresses.fill(0); 11 //全体の進捗を表示する 12 const displayProgress = () => 13 prg.value = progresses.reduce((prev, curr) => prev + curr, 0)/end; 14 //すべてのファイルを読み込む 15 for(var i=0 ; i<end ; i++){ 16 //ファイルリーダーの作成 17 var reader = new FileReader(); 18 //NOTE:変数iの値をリスナ関数毎に固定 19 (i => { 20 reader.onprogress = evt => { 21 //個別の進捗値 22 progresses[i] = evt.loaded / evt.total * 100; 23 //全体としての進捗値 24 displayProgress(); 25 }; 26 reader.addEventListener('load', function(e){ 27 const str = e.target.result; 28 console.log(str); //取得したファイル内容を表示 29 //処理が完了してから進捗値を更新する 30 //個別の進捗値 31 progresses[i] = 100; 32 //全体としての進捗値 33 //NOTE:ここで進捗値を更新しないと100%とならない 34 displayProgress(); 35 }); 36 })(i); 37 reader.readAsText(result[i]); //textで読み込み 38 } 39}); 40

更新履歴:
displayProgressメソッドの実行タイミングを調整しました

投稿2018/01/10 00:05

編集2018/01/10 09:21
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hachii

2018/01/10 09:09

遅くなってしまい申し訳ございません.いただいたコードを使い,動作を確認しました.やはり大容量のファイルとなると進捗バーが振り切ってからしばのですが,そちらが問題でしょうか?らくしてログが表示されました.諸事情で動作確認にWindows7を使用した(本来は7で使いたいのに質問分で10と間違ってしまいました.申し訳ないです.)
defghi1977

2018/01/10 09:18

でしたら, console.logの後にdisplayProgressを実行すればよかろうと
hachii

2018/01/10 09:33

やはり表示より先にバーが振り切ってしまいます.やはり大容量すぎると対応不可なのでしょうかね・・・.
defghi1977

2018/01/10 09:57

ああ, Chromeだとそういう動作になるっぽいですね. FireFoxでは意図したとおりの動作となるため, Chromeにおけるconsole.logの実装の問題と考えられます. おそらくスクリプトの動作完了を優先しているのでしょう. 従って(これは予想ですが)console.log以外の(同期的な)処理であれば問題は出ないと思います.
hachii

2018/01/10 11:13

Chrome特有のものなのですね><どうしてもChromeで動作させなくてはいけないため,このまま進めることにします.機会がありましたら,console.log以外の処理でも試してみたいと思います.ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問