jQueryを使用して「お待ちください、ロードしています...」アニメーションを作成するにはどうすればよいですか?


585

「お待ちください、読み込み中」の回転する円のアニメーションをサイトに配置したいと思います。jQueryを使用してこれをどのように達成すべきですか?

回答:


1211

これにはさまざまな方法があります。「読み込み中...」と表示されたページの小さなステータスのように、または新しいデータの読み込み中に要素全体がページをグレー表示するように騒々しいかもしれません。以下のアプローチでは、両方の方法を実行する方法を示します。

セットアップ

まずは、 使用するhttp://ajaxload.infoから素敵な「読み込み」アニメーションを取得してみましょう。ここに画像の説明を入力してください

ajaxリクエストを行うときにいつでも表示/非表示できる要素を作成しましょう:

<div class="modal"><!-- Place at bottom of page --></div>

CSS

次に、いくつかの才能を与えましょう:

/* Start by setting display:none to make this hidden.
   Then we position it in relation to the viewport window
   with position:fixed. Width, height, top and left speak
   for themselves. Background we set to 80% white with
   our animation centered, and no-repeating */
.modal {
    display:    none;
    position:   fixed;
    z-index:    1000;
    top:        0;
    left:       0;
    height:     100%;
    width:      100%;
    background: rgba( 255, 255, 255, .8 ) 
                url('http://i.stack.imgur.com/FhHRx.gif') 
                50% 50% 
                no-repeat;
}

/* When the body has the loading class, we turn
   the scrollbar off with overflow:hidden */
body.loading .modal {
    overflow: hidden;   
}

/* Anytime the body has the loading class, our
   modal element will be visible */
body.loading .modal {
    display: block;
}

そして最後に、jQuery

では、jQueryに移りましょう。この次の部分は実際には本当に簡単です:

$body = $("body");

$(document).on({
    ajaxStart: function() { $body.addClass("loading");    },
     ajaxStop: function() { $body.removeClass("loading"); }    
});

それでおしまい!ajaxStartor ajaxStopイベントが発生するたびに、body要素にいくつかのイベントをアタッチします。ajaxイベントが開始されると、「loading」クラスを本体に追加します。イベントが完了すると、「読み込み」クラスが本体から削除されます。

実際に見る:http : //jsfiddle.net/VpDUG/4952/


8
これは最も詳細なソリューションですが、ページ要素(つまり、body、#element、または.element)の周りにプリローダーを中央に配置する中央配置プラグインを使用することをお勧めします
Corey Ballou

2
それは素晴らしい追加だろう、cballou。私は単に情報を最小限に抑えるように努めていましたが、ご指摘のとおり、確かに改善することができます。
サンプソン

9
jQuery 1.5.1を使用しているため、.on()ではなく.bind()を使用する必要がありました。
renegadeMind 2012

38
私は、プラグインのプラグインがで彼らがすべて詰まっている作るというプラグインを使用してお勧めします。
contactmatt

15
注: jQuery 1.8以降、.ajaxStop()and .ajaxStart()メソッドはドキュメントにのみ添付する必要があります。 docs
balexandre 2013年

215

実際のロード画像に関しては、このサイトで多数のオプションを確認してください

リクエストの開始時にこの画像でDIVを表示する限り、いくつかの選択肢があります。

A)画像を手動で表示および非表示にする:

$('#form').submit(function() {
    $('#wait').show();
    $.post('/whatever.php', function() {
        $('#wait').hide();
    });
    return false;
});

B)ajaxStartajaxCompleteを使用します

$('#wait').ajaxStart(function() {
    $(this).show();
}).ajaxComplete(function() {
    $(this).hide();
});

これを使用すると、要素はすべての要求に対して表示/非表示になります。必要に応じて、良い場合も悪い場合もあります。

C)特定のリクエストに対して個別のコールバックを使用します。

$('#form').submit(function() {
    $.ajax({
        url: '/whatever.php',
        beforeSend: function() { $('#wait').show(); },
        complete: function() { $('#wait').hide(); }
    });
    return false;
});

4
注意点:HTMLを変更して読み込みimg要素を追加できない場合は、CSSを使用してボタンの背景画像として行うことができます(例:input.loading-gif {background:url( 'images / loading.gif') ;}次に、jQueryを使用してクラスを適用します。例:$( '#mybutton')。addClass( 'loading-gif'); 唯一の落とし穴は、送信ボタンがクリックされたときにのみgifを要求することです。これは通常手遅れなので、jQueryで簡単にプリキャッシュする必要があります。例:(new Image())。src = "images /loading.gif ";
jackocnr

4
このサイトでは、より大きく、よりカスタマイズオプションとローダーの私の意見をよりよい選択でありpreloaders.net
rorypicko


素晴らしい解決策ですが、hide()の後にshow()を呼び出すと機能しません。show()とhide()をtoggle()に切り替えるソリューションを見つけました。それが誰かが私と同じ問題を抱えることを助けることができることを願っています。また、ソリューションC)を試してみたところ、beforeSendが非同期で動作しないことがわかりました。したがって、私は$ .ajaxの上でshow()を呼び出して正しく動作するように提案しました。
劉鎮瑲

@Paoloありがとうございます。個人的には、ほとんどのユーザーが受け入れているよりもあなたの答えが好きでした。したがって、私の側からあなたに+1します。
Ashok kumar

113

JonathanとSamirが提案したもの(両方とも素晴らしい答えです!)に加えて、jQueryには、ajaxリクエストを行うときに起動する組み込みイベントがいくつかあります。

ajaxStartイベントがあります

AJAXリクエストが開始されたとき(そしてまだアクティブになっているものがないとき)は常にロードメッセージを表示します。

...そしてそれは兄弟、ajaxStopイベントです

すべてのAJAXリクエストが終了したときに実行される関数をアタッチします。これはAjaxイベントです。

一緒に使用すると、ページ上の任意の場所でAjaxアクティビティが発生しているときに、進行状況メッセージを表示するための優れた方法を提供します。

HTML:

<div id="loading">
  <p><img src="loading.gif" /> Please Wait</p>
</div>

脚本:

$(document).ajaxStart(function(){
    $('#loading').show();
 }).ajaxStop(function(){
    $('#loading').hide();
 });

これは1.8.0の時点で古くなっており、.ajaxStartドキュメントにのみ添付できます。$(document).ajaxStart(function(){}).
Jonno_FTW 2014

2
@Jonno_FTWを修正しました。た。ジョナサンサンプソンによる彼の質問の編集に取って代わられた古い質問と回答ですが、とにかく最新の状態に保つのは良いことです
ダンF

3
ジョナサンの答えは非常に精通していましたが、私にとってこれはその単純さのために最高でした。
Ojonugwa Jude Ochalifu 2014年

19

Ajaxloadから回転する円のアニメーションGIFを取得できます。これをWebサイトのファイル階層のどこかに貼り付けてください。次に、正しいコードを含むHTML要素を追加し、完了したら削除する必要があります。これはかなり簡単です:

function showLoadingImage() {
    $('#yourParentElement').append('<div id="loading-image"><img src="path/to/loading.gif" alt="Loading..." /></div>');
}

function hideLoadingImage() {
    $('#loading-image').remove();
}

次に、AJAX呼び出しでこれらのメソッドを使用する必要があります。

$.load(
     'http://example.com/myurl',
     { 'random': 'data': 1: 2, 'dwarfs': 7},
     function (responseText, textStatus, XMLHttpRequest) {
         hideLoadingImage();
     }
);

// this will be run immediately after the AJAX call has been made,
// not when it completes.
showLoadingImage();

これにはいくつかの注意点があります。まず、読み込み中の画像を表示できる場所が2つ以上ある場合、一度に何件の通話が実行されているかを追跡し、それらが実行されているときにのみ非表示にする必要があります。全部終わった。これは、ほとんどすべての場合に機能する単純なカウンターを使用して実行できます。

第二に、これは、AJAX呼び出しが成功した場合にのみ、ロードするイメージを非表示にします。エラー状態を処理するには、を検討する必要があります$.ajaxよりも複雑である、$.load$.get等が挙げられるが、多くの柔軟すぎ。


2
返信いただきありがとうございます。しかし、なぜAJAXを使用する必要があるのか​​教えてください。ページ自体ですべてを追跡することはできませんか?
thedp 2009

正確に何を追跡したいですか?ページが読み込まれた後に情報を要求しているのでなければ(そして、AJAXがプラグインを使用せずにそれを行う唯一の方法である場合を除き)、「読み込み」イメージがまったく必要なのはなぜですか。
Samir Talwar、

Samir Talwar:実際には重いJavaScriptアプリケーションです。おかげで、私はアイデアを得ました。
thedp 2009

分かります。その場合は、showLoadingImage開始前とhideLoadingImage終了後に電話してください。かなり単純なはずです。ただしsetTimeout、ブラウザが実際に新しい<img>タグをレンダリングすることを確認するために、なんらかの呼び出しを続ける必要がある場合があります。JavaScriptの実行が完了するまで問題が発生しない場合がいくつかあります。
Samir Talwar、

16

Jonathonの優れたソリューションはIE8で機能しなくなります(アニメーションはまったく表示されません)。これを修正するには、CSSを次のように変更します。

.modal {
display:    none;
position:   fixed;
z-index:    1000;
top:        0;
left:       0;
height:     100%;
width:      100%;
background: rgba( 255, 255, 255, .8 ) 
            url('http://i.stack.imgur.com/FhHRx.gif') 
            50% 50% 
            no-repeat;
opacity: 0.80;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity = 80);
filter: alpha(opacity = 80)};

2
複数の「background-」行が機能しなかったため編集されましたが、単一のbackgroundステートメントが正しく機能しました。
モーリスフラナガン

7

jQueryは、AJAXリクエストの開始時と終了時のイベントフックを提供します。これらをフックしてローダーを表示できます。

たとえば、次のdivを作成します。

<div id="spinner">
  <img src="images/spinner.gif" alt="Loading" />
</div>

display: noneスタイルシートでに設定します。スタイルは自由に設定できます。必要に応じてAjaxload.infoで素敵な読み込み画像を生成できます。

次に、次のようなものを使用して、Ajaxリクエストを送信するときに自動的に表示されるようにすることができます。

$(document).ready(function () {

    $('#spinner').bind("ajaxSend", function() {
        $(this).show();
    }).bind("ajaxComplete", function() {
        $(this).hide();
    });

});

このJavascriptブロックをページの最後に追加してから、bodyタグを閉じる、または適切と思われる場所に追加してください。

これで、Ajaxリクエストを送信するたびに、#spinnerdivが表示されます。リクエストが完了すると、再び非表示になります。


誰かがAJAXがこれと何をしているのか説明してもらえますか?AJAXを使用してサーバーにアクセスせずに、このすべてをページ内で単純に管理することはできません...またはここで何か不足していますか?ありがとう。
thedp 2009

4
ああ-私が理解しているように、AJAXリクエストを行っているときはいつでも、ローディング画像が表示されることを望んでいました。ページが完全に読み込まれるまで「しばらくお待ちください、読み込み中...」アニメーションを表示したい場合は、ページに読み込みdivを配置し、$(document).readyブロックで非表示にすることができます。
Veeti、2009

7

RailsでTurbolinksを使用している場合、これが私の解決策です。

これはCoffeeScriptです

$(window).on 'page:fetch', ->
  $('body').append("<div class='modal'></div>")
  $('body').addClass("loading")

$(window).on 'page:change', ->
  $('body').removeClass("loading")

これは、Jonathan Sampsonの最初の優れた回答に基づくSASS CSSです。

# loader.css.scss

.modal {
    display:    none;
    position:   fixed;
    z-index:    1000;
    top:        0;
    left:       0;
    height:     100%;
    width:      100%;
    background: rgba( 255, 255, 255, 0.4)
            asset-url('ajax-loader.gif', image)
            50% 50% 
            no-repeat;
}
body.loading {
    overflow: hidden;   
}

body.loading .modal {
    display: block;
}

6

マークHのように、blockUIが道です。

例:

<script type="text/javascript" src="javascript/jquery/jquery.blockUI.js"></script>
<script>
// unblock when ajax activity stops
$(document).ajaxStop($.unblockUI); 

$("#downloadButton").click(function() {

    $("#dialog").dialog({
        width:"390px",
        modal:true,
        buttons: {
            "OK, AGUARDO O E-MAIL!":  function() {
                $.blockUI({ message: '<img src="img/ajax-loader.gif" />' });
                send();
            }
        }
    });
});

function send() {
    $.ajax({
        url: "download-enviar.do",          
        type: "POST",
        blablabla
    });
}
</script>

Obs .: http://www.ajaxload.info/で ajax-loader.gifを入手しました



6

他の投稿をすべて尊重して、CSS3とjQueryを使用して、外部リソースやファイルを使用することなく、非常にシンプルなソリューションを用意しました。

$('#submit').click(function(){
  $(this).addClass('button_loader').attr("value","");
  window.setTimeout(function(){
    $('#submit').removeClass('button_loader').attr("value","\u2713");
    $('#submit').prop('disabled', true);
  }, 3000);
});
#submit:focus{
  outline:none;
  outline-offset: none;
}

.button {
    display: inline-block;
    padding: 6px 12px;
    margin: 20px 8px;
    font-size: 14px;
    font-weight: 400;
    line-height: 1.42857143;
    text-align: center;
    white-space: nowrap;
    vertical-align: middle;
    -ms-touch-action: manipulation;
    cursor: pointer;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    background-image: none;
    border: 2px solid transparent;
    border-radius: 5px;
    color: #000;
    background-color: #b2b2b2;
    border-color: #969696;
}

.button_loader {
  background-color: transparent;
  border: 4px solid #f3f3f3;
  border-radius: 50%;
  border-top: 4px solid #969696;
  border-bottom: 4px solid #969696;
  width: 35px;
  height: 35px;
  -webkit-animation: spin 0.8s linear infinite;
  animation: spin 0.8s linear infinite;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  99% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  99% { transform: rotate(360deg); }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="submit" class="button" type="submit" value="Submit" />


5

これによりボタンが非表示になり、「読み込み中」のアニメーションがその場所に表示され、最後に成功メッセージが表示されます。

$(function(){
    $('#submit').click(function(){
        $('#submit').hide();
        $("#form .buttons").append('<img src="assets/img/loading.gif" alt="Loading..." id="loading" />');
        $.post("sendmail.php",
                {emailFrom: nameVal, subject: subjectVal, message: messageVal},
                function(data){
                    jQuery("#form").slideUp("normal", function() {                 
                        $("#form").before('<h1>Success</h1><p>Your email was sent.</p>');
                    });
                }
        );
    });
});


5

私が見たほとんどのソリューションは、読み込みオーバーレイをデザインし、それを非表示にして、必要に応じて再表示するか、またはgifや画像などを表示することを期待しています。

堅牢なプラグインを開発したかったので、jQueryを呼び出すだけで、ロード画面を表示し、タスクが完了したらそれを破棄できます。

以下はコードです。Font awesomeとjQueryに依存します。

/**
 * Raj: Used basic sources from here: http://jsfiddle.net/eys3d/741/
 **/


(function($){
    // Retain count concept: http://stackoverflow.com/a/2420247/260665
    // Callers should make sure that for every invocation of loadingSpinner method there has to be an equivalent invocation of removeLoadingSpinner
    var retainCount = 0;

    // http://stackoverflow.com/a/13992290/260665 difference between $.fn.extend and $.extend
    $.extend({
        loadingSpinner: function() {
            // add the overlay with loading image to the page
            var over = '<div id="custom-loading-overlay">' +
                '<i id="custom-loading" class="fa fa-spinner fa-spin fa-3x fa-fw" style="font-size:48px; color: #470A68;"></i>'+
                '</div>';
            if (0===retainCount) {
                $(over).appendTo('body');
            }
            retainCount++;
        },
        removeLoadingSpinner: function() {
            retainCount--;
            if (retainCount<=0) {
                $('#custom-loading-overlay').remove();
                retainCount = 0;
            }
        }
    });
}(jQuery)); 

上記をjsファイルに入れて、プロジェクト全体に含めてください。

CSSの追加:

#custom-loading-overlay {
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    right: 0;
    background: #000;
    opacity: 0.8;
    filter: alpha(opacity=80);
}
#custom-loading {
    width: 50px;
    height: 57px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin: -28px 0 0 -25px;
}

呼び出し:

$.loadingSpinner();
$.removeLoadingSpinner();

4

でASP.Net MVCを使用する場合using (Ajax.BeginForm(...、を設定してajaxStartも機能しないことに注意してください。

を使用しAjaxOptionsてこの問題を解決します。

(Ajax.BeginForm("ActionName", new AjaxOptions { OnBegin = "uiOfProccessingAjaxAction", OnComplete = "uiOfProccessingAjaxActionComplete" }))


2

パーhttps://www.w3schools.com/howto/howto_css_loader.asp、これはありませんJSとの2段階のプロセスであります:

1.このHTMLをスピナーを配置する場所に追加します。 <div class="loader"></div>

2.このCSSを追加して実際のスピナーを作成します:

.loader {
    border: 16px solid #f3f3f3; /* Light grey */
    border-top: 16px solid #3498db; /* Blue */
    border-radius: 50%;
    width: 120px;
    height: 120px;
    animation: spin 2s linear infinite;
}

@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

OPはjQueryを使用$("#loader").toggle();しているため、アニメーションを開始するために長時間実行されるリクエストを行う前に呼び出すことができ、リクエストのコールバック関数で別の呼び出しを行ってアニメーションを非表示にすることができます。
ドミトリチュバロフ

2

アニメーションにはCSS3を使用しています

/************ CSS3 *************/
.icon-spin {
  font-size: 1.5em;
  display: inline-block;
  animation: spin1 2s infinite linear;
}

@keyframes spin1{
    0%{transform:rotate(0deg)}
    100%{transform:rotate(359deg)}
}

/************** CSS3 cross-platform ******************/

.icon-spin-cross-platform {
  font-size: 1.5em;
  display: inline-block;
  -moz-animation: spin 2s infinite linear;
  -o-animation: spin 2s infinite linear;
  -webkit-animation: spin 2s infinite linear;
  animation: spin2 2s infinite linear;
}

@keyframes spin2{
    0%{transform:rotate(0deg)}
    100%{transform:rotate(359deg)}
}
@-moz-keyframes spin2{
    0%{-moz-transform:rotate(0deg)}
    100%{-moz-transform:rotate(359deg)}
}
@-webkit-keyframes spin2{
    0%{-webkit-transform:rotate(0deg)}
    100%{-webkit-transform:rotate(359deg)}
}
@-o-keyframes spin2{
    0%{-o-transform:rotate(0deg)}
    100%{-o-transform:rotate(359deg)}
}
@-ms-keyframes spin2{
    0%{-ms-transform:rotate(0deg)}
    100%{-ms-transform:rotate(359deg)}
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>


<div class="row">
  <div class="col-md-6">
    Default CSS3
    <span class="glyphicon glyphicon-repeat icon-spin"></span>
  </div>
  <div class="col-md-6">
    Cross-Platform CSS3
    <span class="glyphicon glyphicon-repeat icon-spin-cross-platform"></span>
  </div>
</div>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.