Drupal更好的暴露过滤器 - 中止Ajax请求

时间:2012-10-16 12:57:44

标签: ajax drupal drupal-views

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

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

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

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,并设法解决它而无需修改任何核心文件。我们的想法是监听jQuery的全局ajaxSend()事件,为当前请求存储jqXHR对象,然后在过滤器的单击处理程序中检查请求是否已完成,如果没有则中止。所以代码看起来像:

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

[我知道它通常很糟糕的网络礼仪来复活旧帖子,但由于这是我在寻找信息时谷歌上出现的第一个(也是唯一的)有意义的结果,我认为分享我的解决方案是合适的这里是为了其他可能遇到类似问题并最终登陆此页面的人的利益。]

答案 1 :(得分:0)

事实上我已经管理好了:)

我在Drupal文件夹中的ajax.js中覆盖了一些原型。

  • 更改条件:if (ajax.ajaxing){ ... }
  • 关闭停用提交元素
  • 为当前ajax添加current_ajax变量 请求所以我可以current_ajax.abort();