задержать показ загрузочного gif ajax с помощью jQuery - PullRequest
10 голосов
/ 05 декабря 2009

Как лучше всего отложить показ gif-загрузчика ajax. Когда я нажимаю на кнопку, gif загрузчика показывает и скрывает, даже если время, затраченное на это, составляет несколько сотен миллисекунд, это дает браузеру своего рода мерцание. Я хочу лишь показать gif, если для выполнения запроса ajax требуется более 1000 миллисекунд.

 <script type="text/javascript">
     $(document).ready(function() {
         $('#loader').hide();
         $('#btnGetPeople').click(function() {
            $('#loader').show();
             $.getJSON("/User/GetName/10",
                null,
                function(data) { showPerson(data); });
         });
     });

     function showPerson(data) {
         alert(data);
         $('#loader').hide();
     }
</script>

Мой div загрузчика содержит ....

<div id="loader"><img alt="" src="/content/ajax-loader.gif" /></div>

Какая лучшая техника для этого?

Ответы [ 4 ]

22 голосов
/ 05 декабря 2009

Как видите, я добавил тайм-аут, задержка которого отображается в течение 300 мс. Если ajax быстрее, тайм-аут отменяется до того, как загрузчик действительно отображается.

<script type="text/javascript">
    var showLoader;
    $(document).ready(function() {
        $('#loader').hide();
        $('#btnGetPeople').click(function() {
            // only show loader if ajax request lasts longer then 300 ms
            showLoader = setTimeout("$('#loader').show()", 300);
            $.getJSON("/User/GetName/10",
                null,
                function(data) { showPerson(data); });
        });
    });

    function showPerson(data) {
        clearTimeout(showLoader);
        alert(data);
        $('#loader').hide();
    }
</script>
5 голосов
/ 05 декабря 2009

Вот интересный способ сделать это. Заменить $loader.show() следующим:

$("#loader").data('timeout', window.setTimeout(function(){ $("#loader").show()}, 1000));

И ваша команда скрытия с этим:

window.clearTimeout($("#loader").hide().data('timeout'));
1 голос
/ 31 августа 2012

Вы также можете сделать это так.

var loadingTimer;

$(document).ready(function () {

    $("#loader").ajaxStart(function () {
        loadingTimer = setTimeout(function () {
            $("#loader").show();
        }, 200);
    });

    $("#loader").ajaxStop(function () {
        clearTimeout(loadingTimer);
        $(this).hide();
    });

}
0 голосов
/ 24 ноября 2010

Думаю, я поделюсь чем-то, что я сделал для этого. У меня была ситуация, когда мне нужно было сделать больше, чем просто показать или скрыть один элемент. Поэтому я использовал bind для создания пользовательских событий для загрузчика:

$("#loader").bind("delayshow", function (event, timeout) {
    var $self = $(this);
    $self.data('timeout', setTimeout(function () {
        // show the loader
        $self.show();
        /* 
            implement additional code here as needed
        */
    }, timeout));
}).bind("delayhide", function (event) {
    // close and clear timeout
    var $self = $(this);
    clearTimeout($self.hide().data('timeout')); 
    /*
        implement additional code here as needed 
    */
});

// show it with a 500 millisecond delay
$("#loader").trigger('delayshow', 500);

// hide it
$("#loader").trigger('delayhide');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...