web-dev-qa-db-fra.com

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

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 avec un comportement appelé lorsque l'appel AJAX est terminé?

Merci

12
Paul Sheldrake

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
    }
  });
 }
}
19
Countzero

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;

        }
    }

});
11
user1193694

Aucun des solutions données ont fonctionné pour moi avec Drupal 7.24, jQuery 1.11 et Vues 7.x-3.8 .

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

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 la machine de votre vue.

4
Larzan