2012-10-16 85 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

相關問題