Как выполнить локальные как глобальные события ajax в jQuery? - PullRequest
2 голосов
/ 03 июня 2009

Недавно, переключаясь с Прототип на 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?

Ответы [ 3 ]

4 голосов
/ 03 июня 2009

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

  1. ajaxStart
  2. полная
  3. ajaxComplete

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

// local ajax event
$.ajax({
    ...
    global: 'true',
    complete: function(data) {
        ...
    }
}); // <=== This line here
3 голосов
/ 03 июня 2009

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

function globalAjaxComplete(data)

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

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

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

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

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

0 голосов
/ 08 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...