Слушайте AJAX завершить событие из поведения

12

У меня есть форма с кнопкой AJAX. Когда я нажимаю на него, он обновляет кучу материала, как и ожидалось, и это нормально.

Мне было интересно, если есть способ создать слушатель в поведении, который вызывается, когда вызов AJAX завершен?

Благодарность

Пол Шелдрейк
источник

Ответы:

19

Да, есть :

Drupal.behaviors.YourBehaviour = {
attach: function(context, settings) {  
  $('#yourform').ajaxComplete(function(event, xhr, settings) {
    if ($(event.target.id) == 'the-id-of-your-item') {
      // Your code here
    }
  });
 }
}
CountZero
источник
2
+1, но для Drupal 7 это будетDrupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Клайв
Вы правы: забыли строку при вставке!
Countzero
2
вам не нужен этот $ (), только event.target.id вы не ссылаетесь на объект
Никола
Зачем заключать это в поведение Drupal?
ram4nd
1
Потому что это считается лучшей практикой и, среди прочего, предотвращает столкновения пространств имен.
Countzero
11

Для версий jQuery 1.8+ кажется, что теперь вы должны прикрепить функцию .ajaxComplete к документу, а не к форме или самому представлению (см. Http://api.jquery.com/ajaxcomplete/ ).

Следующее работает для меня на D7 с Jquery 1.10 и Views 7.x-3.8, где «your_view_id» - это имя компьютера представления, установленного на панели настроек представления «Other». В событии, xhr и настройках есть много другой информации, которую можно отключить, чтобы определить, соответствует ли результат ajax нужному представлению, но это сработало для моей ситуации:

jQuery(document).ajaxComplete(function(event, xhr, settings) {
    if(typeof settings.extraData != 'undefined' && typeof settings.extraData.view_display_id != 'undefined') {

        switch(settings.extraData.view_display_id){

            case "your_view_id":

                console.log('your_view_id ajax results!');

                break;

            default:

                console.log('some other ajax result...');

                break;

        }
    }

});
user1193694
источник
4

Ни одно из данных решений не работало для меня с Drupal 7.24, jQuery 1.11 и Views 7.x-3.8 .

То, что предложил пользователь1193694, было неплохим, но у полученного объекта настроек не было параметра extraData .

При анализе объекта настроек я увидел, что свойства settings.data содержат ' view_name = ' и имя компьютера вашего представления, поэтому я и фильтрую:

jQuery(document).ajaxComplete(function(event, xhr, settings) {

    // see if it is from our view
    if (settings.data.indexOf( "view_name=your_views_name") != -1) {

            console.log('your_view_id ajax results!');

    }
});

Замените ' your_views_name ' на имя машины вашего представления.

Larzan
источник