Как вызвать .ajaxStart () для определенных вызовов ajax

У меня есть несколько вызовов ajax в документе сайта, которые отображают или скрывают индикатор выполнения в зависимости от статуса ajax

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

Я хотел бы в основном переписать эти методы в других частях сайта, где выполняется много быстрых небольших вызовов ajax и не требуется, чтобы индикатор выполнения появлялся и исчезал. Я пытаюсь прикрепить их или вставить в другие вызовы $ .getJSON и $ .ajax. Я пробовал связать их цепочкой, но, видимо, это бесполезно.

$.getJSON().ajaxStart(function(){ 'kill preloader'});

person kevzettler    schedule 28.07.2009    source источник
comment
Ответ от 2012 года будет работать для jquery 1.8+   -  person gtgaxiola    schedule 01.10.2018


Ответы (10)


ПРИМЕЧАНИЕ 2018: Этот ответ устарел; не стесняйтесь предлагать исправление к этому ответу, которое будет работать.

Вы можете связать ajaxStart и ajaxStop, используя настраиваемое пространство имен:

$(document).bind("ajaxStart.mine", function() {
    $('#ajaxProgress').show();
});

$(document).bind("ajaxStop.mine", function() {
    $('#ajaxProgress').hide();
});

Затем вы временно отмените привязку в других частях сайта до ваших вызовов .json:

$(document).unbind(".mine");

Уловил идею здесь, пока искал ответ.

РЕДАКТИРОВАТЬ: У меня не было времени, чтобы проверить это, увы.

person montrealist    schedule 31.07.2009
comment
Если я использую $ (document) .unbind (.mine); перед вызовом JSON, как мне потом правильно повторно привязать пространство имен? - person JonSnow; 25.09.2015
comment
@nights, это ответ 2009 года. Вы всегда можете предложить альтернативу, чтобы я мог соответствующим образом отредактировать. - person montrealist; 25.04.2017

В объекте параметров есть атрибут .ajax () принимает название global.

Если установлено значение false, событие ajaxStart для вызова не запускается.

    $.ajax({
        url: "google.com",
        type: "GET",
        dataType: "json",
        cache: false,
        global: false, 
        success: function (data) {
person Hasnat Safder    schedule 15.07.2017

Если вы поместите это в свою функцию, которая обрабатывает действие ajax, она будет связываться только тогда, когда это необходимо:

$('#yourDiv')
    .ajaxStart(function(){
        $("ResultsDiv").hide();
        $(this).show();
    })
    .ajaxStop(function(){
        $(this).hide();
        $(this).unbind("ajaxStart");
    });
person Jason Rikard    schedule 02.12.2010
comment
Спасибо! Я считаю, что ваш ответ проще всего реализовать. - person Dragos Durlut; 21.06.2013
comment
Это работает? Можете ли вы использовать ajaxStart в своем собственном селекторе? Из документации: As of jQuery 1.8, the .ajaxStart() method should only be attached to document. - person Ivan Wang; 15.03.2014

Использовать локальные события Ajax

                success: function (jQxhr, errorCode, errorThrown) {
                    alert("Error : " + errorThrown);
                },
                beforeSend: function () {
                    $("#loading-image").show();
                },
                complete: function () {
                    $("#loading-image").hide();
                }
person Ramya Muthukumar    schedule 09.02.2017


К сожалению, событие ajaxStart не содержит дополнительной информации, которую вы можете использовать, чтобы решить, показывать анимацию или нет.

Во всяком случае, вот одна идея. Почему бы в вашем методе ajaxStart не запустить анимацию, скажем, через 200 миллисекунд? Если запросы ajax завершаются за 200 миллисекунд, вы не показываете никакой анимации, в противном случае вы показываете анимацию. Код может выглядеть примерно так:

var animationController = function animationController()
{
    var timeout = null;
    var delayBy = 200; //Number of milliseconds to wait before ajax animation starts.

    var pub = {};

    var actualAnimationStart = function actualAnimationStart()
    {
        $('#ajaxProgress').show();
    };

    var actualAnimationStop = function actualAnimationStop()
    {
        $('#ajaxProgress').hide();
    };

    pub.startAnimation = function animationController$startAnimation() 
    { 
        timeout = setTimeout(actualAnimationStart, delayBy);
    };

    pub.stopAnimation = function animationController$stopAnimation()
    {
        //If ajax call finishes before the timeout occurs, we wouldn't have 
        //shown any animation.
        clearTimeout(timeout);
        actualAnimationStop();
    }

    return pub;
}();


$(document).ready(
    function()
    {
        $(document).ajaxStart(animationController.startAnimation);
        $(document).ajaxStop(animationController.stopAnimation);
    }
 );
person SolutionYogi    schedule 28.07.2009

используйте beforeSend или завершите функции обратного вызова в вызове ajax следующим образом ..... Живой пример находится здесь https://stackoverflow.com/a/34940340/5361795

Источник ShoutingCode

person Zigri2612    schedule 22.01.2016

У меня есть решение. Я установил глобальную переменную js с именем showloader (по умолчанию установлено значение false). В любой из функций, которые вы хотите показать загрузчику, просто установите для нее значение true, прежде чем выполнять вызов ajax.

function doAjaxThing()
{
    showloader=true;
    $.ajax({yaddayadda});
}

Тогда у меня в голове есть следующее:

$(document).ajaxStart(function()
{
    if (showloader)
    {
        $('.loadingholder').fadeIn(200);
    }
});    

$(document).ajaxComplete(function() 
{
    $('.loadingholder').fadeOut(200);
    showloader=false;
});
person Ollie Brooke    schedule 21.03.2014

Используйте ajaxSend и ajaxComplete, если вы хотите пересмотреть запрос, прежде чем решать, что делать. См. Мой ответ здесь: https://stackoverflow.com/a/15763341/117268

person Emil Stenström    schedule 02.04.2013

<div class="Local">Trigger</div>

<div class="result"></div>
<div class="log"></div>

$(document).ajaxStart(function() {
$( "log" )text( "Trigger Fire successfully." );
});

$( ".local" ).click(function() {
$( ".result" ).load("c:/refresh.html.");
});

Просто просмотрите этот пример, чтобы понять: когда пользователь щелкает элемент с классом Local и отправляется запрос Ajax, отображается сообщение журнала.

person Praveen04    schedule 11.07.2013