Hören Sie sich AJAX complete-Ereignisse anhand eines Verhaltens an

12

Ich habe ein Formular mit einer AJAX-Schaltfläche. Wenn ich darauf klicke, aktualisiert es wie erwartet einige Dinge, was in Ordnung ist.

Ich habe mich gefragt, ob es eine Möglichkeit gibt, einen Listener im Verhalten zu erstellen, der aufgerufen wird, wenn der AJAX-Aufruf abgeschlossen ist.

Vielen Dank

Paul Sheldrake
quelle

Antworten:

19

Ja da ist :

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
quelle
2
+1, aber für Drupal 7 wäre esDrupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Clive
Sie haben Recht: Beim Einfügen eine Zeile vergessen!
Countzero
2
Sie brauchen diese $ () nur event.target.id Sie verweisen nicht auf ein Objekt
Nikola
Warum sollte man es in Drupal-Verhaltensweisen einwickeln?
Ram4nd
1
Weil es als Best Practice gilt und unter anderem Namespace-Kollisionen verhindert.
Countzero
11

Bei jQuery 1.8+ -Versionen müssen Sie jetzt die Funktion .ajaxComplete an das Dokument anhängen, nicht an das Formular oder die Ansicht selbst (siehe http://api.jquery.com/ajaxcomplete/ ).

Das Folgende funktionierte für mich auf D7 mit Jquery 1.10 und Ansichten 7.x-3.8, wobei "your_view_id" der Computername der Ansicht ist, der im Einstellungsfenster "Other" der Ansicht festgelegt wurde. In event, xhr und settings gibt es eine Menge weiterer Informationen, mit denen Sie feststellen können, ob das Ajax-Ergebnis für die von Ihnen gewünschte Ansicht geeignet ist. Dies hat jedoch in meiner Situation funktioniert:

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
quelle
4

Keine der angegebenen Lösungen funktionierte für mich mit Drupal 7.24, jQuery 1.11 und Views 7.x-3.8 .

Was user1193694 vorschlug, war nicht schlecht, aber das Einstellungsobjekt, das ich erhielt, hatte nicht den Parameter extraData .

Beim Parsen des Einstellungsobjekts habe ich festgestellt, dass die Eigenschaft settings.data ' view_name = ' und den Computernamen Ihrer Ansicht enthält. Deshalb filtere ich nach folgenden Kriterien:

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

    }
});

Ersetzen Sie ' your_views_name ' durch den Computernamen Ihrer Ansicht.

Larzan
quelle