【问题标题】:Drupal Better Exposed Filters - abort Ajax requestDrupal 更好的暴露过滤器 - 中止 Ajax 请求
【发布时间】:2012-10-16 12:57:44
【问题描述】:

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

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

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

【问题讨论】:

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

标签: ajax drupal drupal-views


【解决方案1】:

我遇到了同样的问题,并设法解决了它而无需修改任何核心文件。这个想法是监听 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.. 
});

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

【讨论】:

    【解决方案2】:

    其实我已经做到了:)

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

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

    【讨论】:

    • Kevin 在下面的回答要好得多 - 无需修改核心文件:) 谢谢队友!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多