从行为监听AJAX完成事件


12

我有一个带有AJAX按钮的表单。当我单击它时,它会按预期更新一堆东西,这很好。

我想知道是否有一种方法可以创建行为侦听器,该行为在AJAX调用完成时被调用?

谢谢

Answers:


19

就在这里 :

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

2
+1,但对于Drupal 7来说是Drupal.behaviors.YourBehaviour = { attach: function() { $('#yourform').ajaxComplete...
Clive

您说对了:粘贴时忘了一行!
Countzero 2012年

2
您不需要此$()仅是event.target.id,就无需引用对象
Nikola,

为什么将其包装在Drupal行为中?
ram4nd 2015年

1
因为它被认为是最佳实践,并且可以防止名称空间冲突。
Countzero

11

对于jQuery 1.8+版本,似乎您现在必须将.ajaxComplete函数附加到文档,而不是表单或视图本身(请参见http://api.jquery.com/ajaxcomplete/)。

以下代码在D7上使用Jquery 1.10和Views 7.x-3.8为我工作,其中“ your_view_id”是在视图的“其他”设置面板中设置的视图的计算机名。在事件,xhr和设置中还有很多其他信息可以用来确定ajax结果是否适合您想要的视图,但这适用于我的情况:

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;

        }
    }

});

4

给定的解决方案都不适用于Drupal 7.24,jQuery 1.11Views 7.x-3.8

什么user1193694建议是不坏,但设置对象,我收到没有足够的而额外参数。

解析设置对象时,我看到settings.data属性包含“ view_name = ”和您视图的计算机名称,因此这就是我要过滤的内容:

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

    }
});

将“ your_views_name ” 替换为视图的计算机名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.