• 締切済み

javascriptによるプログレスバーの表示制御

javascriptで任意の処理を実行中に、HTMLのプログレスバーの表示を制御する方法をご教示ください。 ただし、JQueryなどのライブラリは使わないものとします。 実現したい処理は以下です。 (1):処理開始時にプログレスバーを表示  (HTMLに定義されている<progress>を表示) (2):処理A実行 (3):プログレスバーの進捗を50%に更新 (4):処理B実行 (5):プログレスバーの進捗を100%に更新 (6):処理終了時にプログレスバーを非表示 上記を実現するために、例えば以下のようなコードを書いても、(1)~(6)の全処理が終わった結果が画面に反映されるため、画面上はプログレスバーは表示されません。 <progress id="prog" max="100" value="0" style="display:none">Loading...</progress> <script> //(1):処理開始時にプログレスバーを表示 document.getElementById("prog").style.display = 'block'; //(2):処理A実行(仮の処理としてsleep) Sleep(3); //(3):プログレスバーの進捗を50%に更新 document.getElementById("prog").value = '50'; //(4):処理B実行(仮の処理としてsleep) Sleep(3); //(5):プログレスバーの進捗を100%に更新 document.getElementById("prog").value = '100'; //(6):処理終了時にプログレスバーを非表示 document.getElementById("prog").style.display = 'none'; //Sleepメソッド(テスト用) function Sleep(T){ var d1 = new Date().getTime(); var d2 = new Date().getTime(); while( d2 < d1+1000*T ){ d2=new Date().getTime(); } return; }; </script> プログレスバーの進捗を更新する度に、画面にその内容を反映するにはどのようにしたらよいのでしょうか。

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5081/13277)
回答No.2

while でループを回している間ブラウザは待っているだけで描画処理をしませんので、非同期処理にしてブラウザに一旦制御を返してあげないと描画されません。 ----- document.getElementById("prog").style.display = 'block'; setTimeout(function(){ document.getElementById("prog").value = '50'; setTimeout(function(){ document.getElementById("prog").value = '100'; setTimeout(function(){ document.getElementById("prog").style.display = 'none'; },1000) },3000) },3000)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

確認する環境がないので提案だけ setTimeoutで呼び出すとかどお? setTimeoutで呼び出した関数は別スレッドで動くから やりたい結果になるんじゃないかなーと推測するわ 調整は難しそうだけど

関連するQ&A

  • 重い処理中のアニメーションgifについて

    お世話になります。 javascript で重い処理中のプログレス(アニメーションgif)表示について教えてください。 やりたいことは以下です。 ==================================== 1.重い処理の前にプログレス(アニメーションgif)表示 2.重い処理開始 3.プログレス(アニメーションgif)非表示 [sample.html] <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript"> $(function() { $('#btn').click(function() { progressStart(); // プログレス(アニメーションgif)表示 func1(); // 重い処理開始 progressEnd(); // プログレス(アニメーションgif)非表示 }); }); /** * プログレス(アニメーションgif)表示 */ function progressStart() { $('#prog').show(); } /** * プログレス(アニメーションgif)非表示 */ function progressEnd() { $('#prog').hide(); } /** * 重い処理(とりあえず5秒) */ function func1() { var T = 5; //T秒待つ var d1 = new Date().getTime(); var d2 = new Date().getTime(); while( d2 < d1+1000*T ){ d2=new Date().getTime(); } return; } </script> </head> <body> <form> <input type="button" id="btn" value="開始" /> <div id="result"></div> <img id="prog" src="img/loadinfo.gif" alt="" style="display:none;" /> </form> </body> </html> ==================================== 上記コードで試したのですが、 重い処理中はプログレス(アニメーションgif)が動かず固まったままです。。。 重い処理中もプログレス(アニメーションgif)を 動いたままにすることは可能なのでしょうか? どなたかご教授いただければと思います。よろしくお願いいたします。

  • プログレスバーの表示方法

    VB6.0 SP5 WINDOWS2000 で開発しています。 処理中のフォームをEnabled=Falseにして、 プログレスバーだけを別のフォームに表示させて、 処理中はプログレスバーのValueをどんどん増やす。 終わるとプログレスバーのフォームを閉じて、 処理してたフォームをEnabled=Trueにしるのですが、 プログレスバーを表示させてるフォームが、変なんです。 プログレスバーが増えている状態の時、 そのフォームが透けてるような、後ろのフォームとまざってるような、 そんな感じになるんです。 これをきれいに表示させたいのですが、何か良い方法はないものでしょうか?

  • 探しています~プログレスバーのまき戻しについて

    何か処理中のものがあり、進捗状態がプログレスバーに表示されているのですが、キャンセルボタンを押すとその処理を中断できて、それまで進んでいたプログレスバーの進捗が徐々に減っていき、最終的にゼロに戻るという仕組みの画面というか、UIを探しています。 ソフトのインストールとかファイルのコピーとか色々探しているのですがなかなか見つかりません。 似たような動作をするプログラムを作りたいので参考にしたいのですが・・・。 どなたか知っている方がいれば教えてください!

  • javascriptで処理している間画像を表示したい。

    JavaScriptで処理をしている間、画像を表示したいのですが、 上手く表示されません。 以下、HTMLファイル <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript" src="sample_csv.js"></script> </head> <body> <form name="form1"> <input type="button" value="取込" onclick="testWait()"/> </form> <p id="test"></p> </body> </html> 以下JSファイル function testWait() { var imgWait = document.createElement('img'); imgWait.setAttribute("src","data/waiting.gif"); document.getElementById("test").appendChild(imgWait); //alert("test"); sleep_busy(5000); document.getElementById("test").innerHTML = ""; } function sleep_busy(wait) { var start = (new Date()).getTime(); while (true) { if ((new Date()).getTime() >= start + wait * 1) break; } } jsファイルのコメントしてあるアラート文を有効にすると きちんと表示されます。 どうしてalert文を有効にした場合と、コメントにした場合で 結果が違ってきてしまうのでしょうか。 上手く表示する、良い方法ありますでしょうか。 宜しくお願いします。

  • JavaScriptでループできない

    let target = document.getElementById('create_new_user'); let name = document.getElementById('i_new_uname'); let pass = document.getElementById('i_new_passwd'); let pass2 = document.getElementById('i_new_passwd2'); let sakusei = document.getElementById('b_create_user'); let a = new Event('mousedown'); let e = new Event('mouseup'); for (let step = 0; step < 10; step++) { target.dispatchEvent(a); target.dispatchEvent(e); name.value = 'らき⭐︎すた' + Math.random(); pass.value = 'bbbb2' pass2.value = 'bbbb2' sakusei.dispatchEvent(a); sakusei.dispatchEvent(e); } これでループしても一回しか繰り返えされません。なぜでしょうか? ちなみにforの処理の中に他の処理も混ぜたら他の処理はちゃんと動きました。 なぜこれだけ一回しかできないのでしょうか?

  • VBA プログレスバー

    コマンドボックスをクリックした時、複数のマクロを実行するようになっています。この時、そのマクロ処理の進捗を知るために、コントロールボックスにあるプログレスバーを使ってみようと思うのですが、その方法を教えて下さい。

  • C# or VB プログレスバー

    プログレスバーで進行状況を表示する処理を入れています。 http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトをパクってとりあえず作ってみました。きちんとできているのですが 1つだけ問題があって try { ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //1秒間待機する(本来なら何らかの処理を行う) System.Threading.Thread.Sleep(1000); } //ダイアログを閉じる pd.Close(); } catch { MessageBox.Show("error"); } こんな感じで使い、プログレスバー表示中に例外が走るとMessageBoxがモーダレスで 表示されてしまいます。プログレスバー表示前だとモーダルのままです。 色々調べたところ原因は裏でスレッドが走っているからだと思います。たぶん・・ ところが対処法となると少々困っています。モーダルでMessageBoxを表示させたいのですが どうすればよいのでしょうか?教えてください。

  • javascriptのストップウオッチのコード

    javascript初級勉強中です。 以下のコードを実行すると(1)小数点第2の動きがおかしい。  (2)一度リセットボタンを押さないとタイマーが動かない。 という2点の不具合が出ます。   どうすれば解決するでしょうか? <!DOCTYPE HTML> <head> <meta charset="utf-8"> <title>ストップウォッチ</title> </head> <body> <h1>ストップウオッチ</h1> <div id="sec" style="font-size:128px">0.00</div> <input type="button" value="Start!" onclick="run();"> <input type="button" value="Stop!" onclick="stop();"> <input type="button" value="Reset!" onclick="reset();"> <script> var statTime, stopTime, running = false, timerId; function run() { if (running)return; running = true; if (stopTime) { startTime = startTime + (new Date()).getTime() - stopTime; } if (! startTime) { startTime = (new Date()).getTime(); } timer(); //タイマー処理回していく } function timer() { document.getElementById('sec').innerHTML = (((new Date()).getTime()- startTime)/1000). toFixed(2); timerId =setTimeout(function() { timer(); //このタイマー自身を回していく }, 100); } function stop() { if (!running) return false; running = false; clearTimeout(timerId); //timerIdを渡して止める stopTime = (new Date()).getTime(); } function reset() { if (running) return;   startTime = undefined; document.getElementById('sec').innerHTML = '0.00'; } </script> </body> </html>

  • JavaScriptで時間指定をして表示を切り替え

    JavaScriptで時間指定をして表示を切り替えたいのですが safariだけうまく動作しません、下記のjsファイルを読み込んでHTML側には <div id="hoge1">切り替え前の内容</div> <div id="hoge2">切り替え後の内容</div> としています。 解決策があればご教授お願い致します。 window.onload = changeDisplay; function changeDisplay(){ var objDate = new Date(); var now = objDate.getTime();//現在のタイムスタンプ(ミリ秒)を取得 var changeTime = new Date("Jan 1, 2011 00:00:00");//切り替える日時のタイムスタンプ(ミリ秒)を取得 //切り替え前 if (now < changeTime) { document.getElementById('hoge1').style.display = "block"; document.getElementById('hoge2').style.display = "none"; setTimeout("changeDisplay()", 1000);//1秒ごとに実行(◯秒ごとの場合は、第2引数に 「◯ * 1000」 と記述) //切り替え後 } else { document.getElementById('hoge1').style.display = "none"; document.getElementById('hoge2').style.display = "block"; } }

  • innerHTMLなどの反映タイミング

    innerHTMLやinnerTextでの反映タイミングについて教えてください。 JavaScriptでsleep関数の自作テストを行なっている過程で innerHTMLやinnerTextが即時には反映されない現象に直面しました。 コードを貼り付けておきます。 ※htmlとしてIE等のブラウザで動かしてもいいですが、 htaとして実行したほうが簡易で軽くていいと思います。 このコードでは (1)innerHTML(かinnerText)で「実行中…」を表示 (2)sleep関数を呼ぶ (3)innerHTML(かinnerText)で「終了」を表示 という、(少なくとも表示部分に関しては) 極めて単純な処理をしています。しかし(1)が反映されません…。 (1)と(2)の間にalertを書いたりするときちんと(1)が表示されます。 よく他言語・フレームワークではflushとかリアルタイム描画等の コマンドやオプションで対処できるので、JavaScript(JScript)でも ないものかなぁと思い質問してみることにしました。 質問は以下です ・この現象はなぜ起こるのか。原因説明 ・これを回避する方法はあるかないか ・あるのならその方法 明示的なコマンド・オプションでも対症療法でもかまいません。 環境はとりあえずはWinXP・hta(レンダリングエンジン:IE8)で動けばOKです。 よろしくお願いします。 <html> <body> <div id="status">sleepテスト</div> <input type="button" onclick="testAjaxSleep()" value="testAjaxSleep"><br> <input type="button" onclick="testBusySleep()" value="testBusySleep"><br> <br> <script> var waittime = 3; function testAjaxSleep() { document.getElementById("status").innerHTML = "「AjaxSleep」実行中…"; ajaxSleep(waittime); document.getElementById("status").innerHTML = "AjaxSleep終了"; } function testBusySleep() { document.getElementById("status").innerText = "「BusySleep」実行中…"; document.close(); busySleep(waittime); document.getElementById("status").innerText = "BusySleep終了"; } function ajaxSleep(sec) { var stopTime = (new Date()).getTime() + Math.floor(1000 * sec); var url = "http://www.google.com/?dummy"; var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); while (stopTime > (new Date()).getTime()) { xmlHttp.open('GET', url, false); xmlHttp.send(null); } } function busySleep(sec) { var stopTime = (new Date()).getTime() + Math.floor(1000 * sec); while (stopTime > (new Date()).getTime()) {} } </script> </body> </html>

専門家に質問してみよう