Jquery ajaxStart не запускается

Этот код

$("#loading").ajaxStart(function() {
        alert("start");
        $(this).show();
    });

в моей надписи

<div style="text-align:center;"><img id="loading" src="../images/common/loading.gif" alt="" /></div>

Вот полный запрос ajax:

$.ajax({
        type: "POST",       

        url: "http://localhost/WebServices/Service.asmx/GetResults",

        data: jsonText,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {

            var results = (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d;
            PopulateTree(results);
        },

        error: function(xhr, status, error) {
            var msg = JSON.parse(xhr.responseText);
            alert(msg.Message);


        }
    });

$("#loading").ajaxStart(function() {
        alert("start");
        $(this).show();
    });

    $("#loading").ajaxStop(function() {
        alert("stop");
        $(this).hide();
        $("#st-tree-container").show();

    });

никогда не запускает предупреждение "начать", даже если показано, что gif вращается. AjaxStop запускается, как ожидалось. Любые идеи, почему?

Ответ 1

Не запускается, потому что ваш обработчик для .ajaxStart() не зарегистрирован до после, запрос ajax уже прошло (прошлое, когда оно было бы вызвано). .ajaxStop() также зарегистрирован, но до завершается запрос, поэтому, когда он возвращается, он подключен до запуска.

Чтобы исправить это, переместите этот до ваш первый вызов $.ajax():

$("#loading").ajaxStart(function() {
  $(this).show();
}).ajaxStop(function() {
  $(this).hide();
  $("#st-tree-container").show();
});


UPDATE: запуск jQuery 1.9, события AJAX должны быть прикреплены только к документу. http://jquery.com/upgrade-guide/1.9/#ajax-events-should-be-attached-to-document

$(document).ajaxStart(function() {
  $("#loading").show();
});

$(document).ajaxStop(function() {
  $("#loading").hide();
  $("#st-tree-container").show();
});

Ответ 2

Запуск jQuery 1.9, события AJAX должны быть прикреплены только к документу.

Обратитесь к руководству по миграции. http://jquery.com/upgrade-guide/1.9/#ajax-events-should-be-attached-to-document

Как и в jQuery 1.9, глобальные события AJAX (ajaxStart, ajaxStop, ajaxSend, ajaxComplete, ajaxError и ajaxSuccess) запускаются только в элементе документа. Измените программу, чтобы прослушивать события AJAX в документе. Например, если код выглядит так:

$("#status").ajaxStart(function() { $(this).text("Ajax started"); });

Измените его так:

$(document).ajaxStart(function() { $("#status").text("Ajax started"); });

Ответ 3

Я не уверен, что это исправит вашу проблему, но обычно я использую debug.info('your message') в сочетании с консолью Firebug вместо alert(), поскольку предупреждение прерывает вашу обработку script, пока вы не уволите ее, а debug.info является довольно ненавязчивым.

Здесь вы можете загрузить реализацию debug.info.