Как выполнить как локальные, так и глобальные события ajax в jQuery?

Недавний переход с Prototype на jQuery, я борюсь с некоторыми основными проблемами.

Я использую в своем приложении несколько AJAX-запросов; для 95% этих запросов я хотел бы, чтобы выполнялись некоторые глобальные события, такие как отображение или скрытие индикатора загрузки. Помимо глобальной функциональности, каждый запрос также должен иметь некоторый пользовательский код, выполняемый после его завершения.

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

// global events
$('#loader').bind('ajaxStart', function() { 
    // in this particular example, the ajaxStart() works fine, 
    // as it has not been overridden
    Loader.enable();
}).bind('ajaxComplete', function() { 
    // this section will not execute. when the local complete()
    // is removed, it will execute just fine
    Loader.disable();
} );

// local ajax event
$.ajax({
    type: $(element).attr('method'),
    url: $(element).attr('action'),
    data: $(element).serialize(),
    global: 'true',
    complete: function(data) {
        if (params.target && $('#' + params.target)) {
            $('#' + params.target).html(data.responseText);
        }
        Behaviour.apply();
});

В этом конкретном случае локальное событие complete(), по-видимому, останавливает выполнение глобального события ajaxComplete().

Есть ли способ выполнить как локальные, так и глобальные события ajax?


person Aron Rotteveel    schedule 03.06.2009    source источник


Ответы (3)


Только что попробовал запустить ваш код. Добавлен недостающий }); хотя. Работал как шарм. Звонки были сделаны в таком порядке:

  1. ajaxСтарт
  2. полный
  3. ajaxComplete

Вот что я сделал:

// local ajax event
$.ajax({
    ...
    global: 'true',
    complete: function(data) {
        ...
    }
}); // <=== This line here
person Uzbekjon    schedule 03.06.2009
comment
Ошибка исправлена, но была вызвана неправильной вставкой. Это не решает мою проблему. - person Aron Rotteveel; 03.06.2009

Я не пробовал, но почему вы не создаете глобальный метод:

function globalAjaxComplete(data)

и вызвать его как из глобального, так и из локального обработчика событий?

Вы также можете определить класс «ajaxEnabled» и сделать это:

$(".ajaxEnabled").bind("ajaxStart", 
   Function() { globalAjaxComplete(); });

Тогда вам не нужно будет каждый раз вызывать глобальный метод.

Однако до сих пор не знаю, почему локальная привязка отменяет глобальную.

person kgiannakakis    schedule 03.06.2009
comment
Я еще не пробовал это, но это, несомненно, сработает. Однако это потребовало бы от меня использования этой структуры для каждого AJAX-запроса, что на самом деле не улучшает мой код. - person Aron Rotteveel; 03.06.2009

Прежде всего, спасибо за ответы. Оба они, по крайней мере, помогли мне снова и снова переоценивать мой код.

Проблема и решение оказались довольно простыми:

Behaviour.apply();, которое было вызвано в моем локальном событии complete, вызвало ошибку в другом месте, препятствуя правильному завершению функции complete() и эффективно отключая глобальное событие ajaxComplete(). Исправление этой ошибки также устранило мою проблему.

Это означает, что jQuery поддерживает объединение как локальных, так и глобальных событий ajax.

person Aron Rotteveel    schedule 08.06.2009