Słuchaj zdarzenia zakończenia AJAX na podstawie zachowania

12

Mam formularz z przyciskiem AJAX. Kiedy klikam, aktualizuje kilka rzeczy zgodnie z oczekiwaniami, co jest w porządku.

Zastanawiałem się, czy istnieje sposób na stworzenie detektora w zachowaniu, który jest wywoływany po zakończeniu wywołania AJAX?

Dzięki

Paul Sheldrake
źródło

Odpowiedzi:

19

Tak jest :

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
źródło
2
+1, ale dla Drupala 7 byłoby toDrupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Clive
Masz rację: zapomniałeś linii podczas wklejania!
Countzero
2
nie potrzebujesz tego $ () po prostu event.target.id nie odwołujesz się do obiektu
Nikola
Po co owijać to w zachowania Drupala?
ram4nd
1
Ponieważ jest to uważane za najlepszą praktykę i zapobiega między innymi kolizjom przestrzeni nazw.
Countzero
11

W przypadku wersji jQuery 1.8+ wydaje się, że musisz teraz dołączyć do dokumentu funkcję .ajaxComplete, a nie formularz lub sam widok (patrz http://api.jquery.com/ajaxcomplete/ )

Poniższe działało dla mnie na D7 z Jquery 1.10 i widokami 7.x-3.8, gdzie „twój_id_id” to nazwa komputera widoku ustawionego w panelu ustawień „Inne” widoku. Istnieje wiele innych informacji o zdarzeniu, xhr i ustawieniach, które należy wyłączyć, aby ustalić, czy wynik ajax jest dla widoku, który chcesz, ale zadziałało to w mojej sytuacji:

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;

        }
    }

});
użytkownik1193694
źródło
4

Żadne z podanych rozwiązań nie działało dla mnie z Drupal 7.24, jQuery 1.11 i Views 7.x-3.8 .

To, co sugerował użytkownik1193694, nie było złe, ale obiekt ustawień, który otrzymałem, nie miał parametru extraData .

Podczas analizowania obiektu ustawień zauważyłem, że właściwość settings.data zawiera ' view_name = ' i nazwę komputera twojego widoku, więc to właśnie filtruję :

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

    }
});

Zamień „ twoja_nazwa_widoku ” na nazwę komputera twojego widoku.

Larzan
źródło