0

我使用 Drupal 7 和 Views 3。我已经安装了 Better Exposed Filters 模块。我公开了一些过滤器并且我使用 ajax,所以当我更改复选框或选择值时,例如会出现 ajax 请求。通常一切正常。

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

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

4

2 回答 2

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

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

于 2013-06-04T22:33:24.240 回答
0

事实上我已经做到了:)

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

  • 更改条件:if (ajax.ajaxing){ ... }
  • 关闭禁用提交元素
  • current_ajax为当前的 ajax 请求添加变量,这样我就可以做到current_ajax.abort();
于 2012-10-17T09:55:49.283 回答