How can I create a “Please Wait, Loading…” animation using jQuery?

后端 未结 17 1992
长情又很酷
长情又很酷 2020-11-22 00:07

I would like to place a \"please wait, loading\" spinning circle animation on my site. How should I accomplish this using jQuery?

相关标签:
17条回答
  • 2020-11-22 00:29

    As far as the actual loading image, check out this site for a bunch of options.

    As far as displaying a DIV with this image when a request begins, you have a few choices:

    A) Manually show and hide the image:

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

    B) Use ajaxStart and ajaxComplete:

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

    Using this the element will show/hide for any request. Could be good or bad, depending on the need.

    C) Use individual callbacks for a particular request:

    $('#form').submit(function() {
        $.ajax({
            url: '/whatever.php',
            beforeSend: function() { $('#wait').show(); },
            complete: function() { $('#wait').hide(); }
        });
        return false;
    });
    
    0 讨论(0)
  • 2020-11-22 00:34

    You could do this various different ways. It could be a subtle as a small status on the page saying "Loading...", or as loud as an entire element graying out the page while the new data is loading. The approach I'm taking below will show you how to accomplish both methods.

    The Setup

    Let's start by getting us a nice "loading" animation from http://ajaxload.info I'll be using enter image description here

    Let's create an element that we can show/hide anytime we're making an ajax request:

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

    The CSS

    Next let's give it some flair:

    /* 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;
    }
    

    And finally, the jQuery

    Alright, on to the jQuery. This next part is actually really simple:

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

    That's it! We're attaching some events to the body element anytime the ajaxStart or ajaxStop events are fired. When an ajax event starts, we add the "loading" class to the body. and when events are done, we remove the "loading" class from the body.

    See it in action: http://jsfiddle.net/VpDUG/4952/

    0 讨论(0)
  • 2020-11-22 00:34

    Like Mark H said the blockUI is the way.

    Ex.:

    <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.: I got the ajax-loader.gif on http://www.ajaxload.info/

    0 讨论(0)
  • 2020-11-22 00:35

    You can grab an animated GIF of a spinning circle from Ajaxload - stick that somewhere in your website file heirarchy. Then you just need to add an HTML element with the correct code, and remove it when you're done. This is fairly simple:

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

    You then just need to use these methods in your AJAX call:

    $.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();
    

    This has a few caveats: first of all, if you have two or more places the loading image can be shown, you're going to need to kep track of how many calls are running at once somehow, and only hide when they're all done. This can be done using a simple counter, which should work for almost all cases.

    Secondly, this will only hide the loading image on a successful AJAX call. To handle the error states, you'll need to look into $.ajax, which is more complex than $.load, $.get and the like, but a lot more flexible too.

    0 讨论(0)
  • 2020-11-22 00:35

    Note that when using ASP.Net MVC, with using (Ajax.BeginForm(..., setting the ajaxStart will not work.

    Use the AjaxOptions to overcome this issue:

    (Ajax.BeginForm("ActionName", new AjaxOptions { OnBegin = "uiOfProccessingAjaxAction", OnComplete = "uiOfProccessingAjaxActionComplete" }))
    
    0 讨论(0)
  • 2020-11-22 00:36

    Along with what Jonathan and Samir suggested (both excellent answers btw!), jQuery has some built in events that it'll fire for you when making an ajax request.

    There's the ajaxStart event

    Show a loading message whenever an AJAX request starts (and none is already active).

    ...and it's brother, the ajaxStop event

    Attach a function to be executed whenever all AJAX requests have ended. This is an Ajax Event.

    Together, they make a fine way to show a progress message when any ajax activity is happening anywhere on the page.

    HTML:

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

    Script:

    $(document).ajaxStart(function(){
        $('#loading').show();
     }).ajaxStop(function(){
        $('#loading').hide();
     });
    
    0 讨论(0)
提交回复
热议问题