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

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

ただいまの
回答率

89.99%

【JavaScript】プログレスバーでダウンロード状況を表示 → 完了後実行する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 5,280

phiilo_

score -5

ダウンロードの進捗状況を表示する、よく見かけるプログレスバーをブラウザで実現したいと思います。

  1. JavaScriptでサーバーにあるデータ(動画、写真等指定なし)をダウンロード
  2. ダウンロード状況をパーセント表示し、ダウンロード完了(100%)
  3. alert("ダウンロード完了");

下記URLでは、まだJSのコードが不十分で、うまく動作しません。
緑のバーがテテーン♪と進んで欲しいです。
https://jsfiddle.net/7u586411/2/

具体的な質問内容が書けず申し訳ありませんが、
ご指摘いただければ、解決に近づけるかもしれません。

頑張ります。よろしくお願いいたします。

<div id="meter">
<p id="bar"><span></span></p>
<p id="now">now loading...</p><p id="percent"></p>
</div>
#meter {

    position: absolute;
    margin: auto;

    top: 0;
    right: 0;
    bottom: 0;
    left: 0;

    width: 200px;
    height: 30px;

    z-index: 20;


}


#now {

    position: absolute;
    margin: auto;

    top: 25px;
    right: 0;
    bottom: 0;
    left: -40;

    text-align: center;
    font-size: 15px;

        font-family: arial;
        font-weight: bold;

    color: #ffffff;

    z-index: 20;

}

#percent {

    position: absolute;
    margin: auto;

    top: 25px;
    right: 0;
    bottom: 0;
    left: 95;

    text-align: center;
    font-size: 15px;

        font-family: arial;
        font-weight: bold;

    color: #ffffff;

    z-index: 20;

}


#bar {

    position: absolute;
    margin: 0 0 0 0;

    width: 200px;
    height: 15px;

    text-align: center;

    border:2px solid #ffffff;
    background: #00FF00;

        -webkit-border-radius: 20px;
        -ms-border-radius: 20px;

    z-index: 20;

}

#bar span{

    position: absolute;
    margin: auto;
    float: left;

    top: 0;

    bottom: 0;
    left: 0;

    background: #00FF00;
    display: block;
    height: 15px;


        -webkit-border-radius: 20px;
        -ms-border-radius: 20px;
    z-index: 20;

}
$(document).ready(function() {

    var xhr = new XMLHttpRequest
    xhr.open('GET', 'index.html');
    xhr.onprogress = function (evt) {

    var load = (100*evt.loaded/evt.total|0);
    $('#percent').html(load + '%');
    $('#bar span').css({'width': load*2});
    };

    xhr.send();

});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

onreadystatechange を追加すれば完了のイベントは取れます。

$(document).ready(function() {
    var xhr = new XMLHttpRequest
    xhr.open('GET', 'index.html');
    xhr.onprogress = function (evt) {
      var load = (100*evt.loaded/evt.total|0);
      $('#percent').html(load + '%');
      $('#bar span').css({'width': load*2});
    };
    xhr.onreadystatechange = function (evt) {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          alert('ダウンロード完了');
        }
      }
    }
    xhr.send();
});


テテーン♪と表示されないのはダウンロードしているコンテンツが小さいのかと思います。

追記

大きいファイルで試した結果を置いておきます。

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 12:40

    ご回答ありがとうございます。
    データが軽いから読み込みが一瞬で終わるんでしょうね。
    頂いたコードですと0%となってしまうままのようです...
    頑張ってみます。ありがとうございました。

    キャンセル

  • 2017/07/05 12:43

    0 の次が 100 でしょうから、完了時に 100 を表示する様にした方がいいかもですね。

    キャンセル

  • 2017/07/05 13:51

    キャプチャを貼りました。ちなみに450MBのファイルです。

    キャンセル

  • 2017/07/05 20:52

    お返事が遅くなり申し訳ありませんでした。
    確かに重たいデータを指定したら0%から値がインクリメントされ
    100%あたりでテテーン♪となりました。
    現状ではプログレッシブバーがデフォルトでマックスパワーゲージとなってしまい、mattnさんの.gifのようにピロピロピロ♪となりません。

    HTMLでは<progress>というタグがあり関心しました。
    色々見てみます。ありがとうございました。

    キャンセル

check解決した方法

-2

CSSが間違っており、軽いデータだったため、値がインクリメントしていくのを
視認できなかったようです。

<html>


    <head>

    <script>

        $(document).ready(function() {

            var client = new XMLHttpRequest();

            client.open('POST', './----.mov');
            client.onprogress = function(event) {

                var load = (100*event.loaded/event.total|0);
                $('#percent').html(load + '%');
                $('#bar span').css({'width': load + '%'});
            };

            client.send();
        });

    </script>

    <style>


        #percent {

            position: absolute;
            margin: auto;

            top: 25px;
            right: 0;
            bottom: 0;
            left: 95;

            text-align: center;
            font-size: 15px;

                font-family: arial;
                font-weight: bold;

            color: #ffffff;

            z-index: 20;

        }


        #bar {

            position: absolute;
            margin: 0 0 0 0;

            width: 200px;
            height: 15px;

            text-align: center;

            border:2px solid #ffffff;


                -webkit-border-radius: 20px;
                -ms-border-radius: 20px;

            z-index: 20;

        }

        #bar span{

            position: absolute;
            margin: auto;
            float: left;

            width: 200PX;
            top: 0;

            bottom: 0;
            left: 0;

            background: gray;
            display: block;
            height: 15px;


                -webkit-border-radius: 20px;
                -ms-border-radius: 20px;
            z-index: 20;

        }
    </style>
    </head>
<body>

<p id="bar"><span></span></p>
<p id="percent"></p>

</body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる