Ouça o evento completo do AJAX de um comportamento

12

Eu tenho um formulário que possui um botão AJAX. Quando clico, ele atualiza várias coisas conforme o esperado, o que é bom.

Eu queria saber se existe uma maneira de criar um ouvinte no comportamento que é chamado quando a chamada AJAX é concluída?

obrigado

Paul Sheldrake
fonte

Respostas:

19

Sim existe :

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
fonte
2
+1, mas para Drupal 7 seriaDrupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Clive
Você está certo: esqueceu uma linha ao colar!
Countzero
2
você não precisa dessa $ () apenas event.target.id você are't referência a um objeto
Nikola
Por que envolvê-lo em comportamentos Drupal?
Ram 25nd15
1
Porque é considerado uma prática recomendada e evita colisões de namespaces, entre outras coisas.
Countzero
11

Para versões do jQuery 1.8+, parece que agora você deve anexar a função .ajaxComplete ao documento, não o formulário ou a própria exibição (consulte http://api.jquery.com/ajaxcomplete/ )

O seguinte funcionou para mim no D7 com o Jquery 1.10 e as visualizações 7.x-3.8, onde "your_view_id" é o nome da máquina da visualização definida no painel de configurações "Outras" da visualização. Há muitas outras informações no evento, xhr e configurações a serem desativadas para determinar se o resultado do ajax é para a visualização que você deseja, mas isso funcionou para a minha situação:

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

Nenhuma das soluções fornecidas funcionou para mim com o Drupal 7.24, jQuery 1.11 e Views 7.x-3.8 .

O que o usuário1193694 sugeriu não foi ruim, mas o objeto de configurações que eu recebi não tinha o parâmetro extraData .

Ao analisar o objeto de configurações, vi que a propriedade settings.data contém ' view_name = ' e o nome da máquina da sua view, então é isso que eu estou filtrando:

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

    }
});

Substitua ' your_views_name ' pelo nome da máquina da sua visualização.

Larzan
fonte