2012-10-16 59 views
0

我使用Drupal 7和Views 3.我安装了Better Exposed Filters模块。我暴露了一些过滤器,我使用ajax,所以当我改变复选框或选择值例如有ajax请求。一般来说,一切正常。Drupal更好的暴露过滤器 - 中止Ajax请求

但我有一个问题,我无法处理:/ 基本上,当我改变选择值,ajax请求发送。在此请求的结果之前,我再次更改选择值,但没有ajax请求。 我无法发送另一个Ajax请求或中止现有的请求。

所以我的问题是,如何中止这个Ajax请求,立即发送下一个?

+0

如果可能,您可以禁用所有复选框/选择,而ajax请求是并在ajax请求完成时再次激活它们。 (我认为jQuery ajaxStart和ajaxStop函数可以帮助你) – Jozzeh

回答

4

我有同样的问题,并设法解决它而无需修改任何核心文件。我们的想法是侦听jQuery的全局ajaxSend()事件,为当前请求存储jqXHR对象,然后在您的过滤器的click处理程序中检查请求是否已完成,如果尚未完成则请求中止。因此,代码看起来类似:

var filterXHR = null; 
$(document).ajaxSend(function (event, jqXHR, settings) { 
    filterXHR = jqXHR; // cache XHR object for current ajax request 
}); 

// event handler for when a filter is selected/changed/etc. 
$('#filters-block .form-item a').click(function() { 

    // check if there is a previous request that has not yet completed 
    if (filterXHR && filterXHR.readyState != 4) { 
    // abort ajax request 
    filterXHR.abort(); 

    // subsequent requests will add their own progress indicator, 
    // so you probably want to remove the old one here 
    $('.ajax-progress').remove(); 
    } 

    // submit exposed form, do other stuff, etc.. 
}); 

[我知道它的普遍不好的互联网礼仪复活的老帖,但因为这是对谷歌来到了,当我在寻找的第一个(也是唯一一个)有意义的结果info,我认为在这里分享我的解决方案是适合其他人可能会遇到类似问题并最终登陆此页面的好处。]

0

其实我有管理它:)

我改写了一些原型在Drupal的文件夹ajax.js。

  • 更改条件:if (ajax.ajaxing){ ... }
  • 熄灭禁用提交元素
  • 添加current_ajax变量的当前AJAX 要求,所以我可以做current_ajax.abort();
+2

凯文的答案下面好得多 - 无需修改核心文件:) Thx队友! – Astaz3l

相关问题