Écoutez l'événement complet AJAX à partir d'un comportement

12

J'ai un formulaire qui a un bouton AJAX. Lorsque je clique dessus, il met à jour un tas de choses comme prévu, ce qui est bien.

Je me demandais s'il y avait un moyen de créer un écouteur dans le comportement qui est appelé lorsque l'appel AJAX est terminé?

Merci

Paul Sheldrake
la source

Réponses:

19

Oui il y a :

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
la source
2
+1, mais pour Drupal 7, ce seraitDrupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Clive
Vous avez raison: vous avez oublié une ligne en collant!
Countzero
2
vous n'avez pas besoin de ce $ () juste event.target.id vous ne faites pas référence à un objet
Nikola
Pourquoi l'envelopper dans des comportements Drupal?
ram4nd
1
Parce que cela est considéré comme la meilleure pratique et empêche, entre autres, les collisions d'espaces de noms.
Countzero
11

Pour les versions de jQuery 1.8+, il semble que vous devez maintenant attacher la fonction .ajaxComplete au document, pas le formulaire ou la vue elle-même (voir http://api.jquery.com/ajaxcomplete/ )

Ce qui suit a fonctionné pour moi sur D7 avec Jquery 1.10 et Views 7.x-3.8, où "your_view_id" est le nom de la machine de la vue définie dans le panneau de paramètres "Autre" de la vue. Il y a beaucoup d'autres informations dans l'événement, la xhr et les paramètres à désactiver pour déterminer si le résultat ajax est pour la vue que vous souhaitez, mais cela a fonctionné pour ma situation:

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
la source
4

Aucune des solutions données n'a fonctionné pour moi avec Drupal 7.24, jQuery 1.11 et Views 7.x-3.8 .

Ce que user1193694 a suggéré n'était pas mauvais, mais l'objet settings que j'ai reçu n'avait pas le paramètre extraData .

Lors de l'analyse de l'objet settings, j'ai vu que la propriété settings.data contient ' view_name = ' et le nom de la machine de votre vue, donc c'est pour cela que je filtre:

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!');

    }
});

Remplacez « your_views_name » par le nom de l' ordinateur de votre vue.

Larzan
la source