2010-04-14 24 views
9

我正在使用JQuery UI插件blockUI來阻止每個Ajax請求的UI。它的作用就像一個魅力,但是,我不想阻止UI(或者至少不會顯示「請稍候」消息),當我進行ajax調用以獲取自動完成建議項時。我怎麼做?我正在使用jQuery自動完成插件來實現自動完成功能。jQuery塊UI異常

有沒有一種方法可以告訴塊UI插件不阻止用戶界面的自動完成?

回答

21
$('#myWidget').autocomplete({ 
    source: function(data, callback) { 
     $.ajax({ 
      global: false, // <-- this is the key! 
      url: 'http:...', 
      dataType: 'json', 
      data: data, 
      success: callback 
     }); 
    } 
}); 
+0

感謝這個人,愛你 – franchez 2014-10-24 09:21:08

0

使用模態塊(塊UI)意味着阻止來自用戶的任何輸入,我會建議普通的老式throbber顯示'請稍等..'並阻止(設置屬性readonly =「只讀」)您的輸入控件直到ajax請求完成。

上面的UI似乎是自相矛盾的!

+0

這似乎並沒有答案。我使用'$(document).ajaxStart($。blockUI).ajaxStop($。unblockUI)阻止了所有的ajax請求;''''''''''''''''''''''我希望blockUI插件可以配置爲例外。 – Chirantan 2010-04-16 06:20:15

1

嘗試使用裝飾

$.blockUI = function() { 
    if (condition_you_dont_want_to_block) { 
     return; 
    } 
    return $.blockUI.apply(this, arguments); 
} 

,或者你可以寫自己的塊功能就是聰明

function my_blockUI() { 
    if (condition_you_dont_want_to_block) { 
     return; 
    } 
    $.blockUI(); 
} 
$(document).ajaxStart(my_blockUI).ajaxStop($.unblockUI); 
+0

然而,這很好,我不希望根據請求的某些參數顯示消息,比如說,如果發出的請求是url請求,或者至少是發起請求的元素的id或ajax目的。必須有一些線索決定是否顯示消息。 '$(this)'總是給出'document'對象。因此,無法知道我何時不想顯示「Please wait ...」消息。 – Chirantan 2010-04-18 09:31:51

+0

對於這種情況它不是一個好的答案(jQuery UI是不是自己寫任何東西,只是配置:P),'但它有設計模式!!!!! :)'+1 – naugtur 2010-04-19 13:17:26

1

您可以設置blockUI通過添加網頁上的所有功能工作到一個全局的jQuery事件處理程序。爲了確保它不會在自動完成ajax調用時被調用,我們必須確定該調用是否爲自動完成調用。問題是這些全球功能沒有那麼多的信息可供他們使用。但是ajaxSend確實獲得了一些信息。它獲取用於進行ajax調用的設置對象。設置對象具有要發送的數據字符串。所以你可以做的是附加到每個數據串在每一個Ajax請求在你的網頁是這樣的:

&notautocomplete=notautocomplete 

例如:

$.ajax({data:"bar=1&foo=2&notautocomplete=notautocomplete"}) 

然後我們就可以把這個代碼在文檔準備部分之前別的:

$(document).ajaxSend(
    function (event, xhr, ajaxOptions){ 
    if(ajaxOptions.data.indexOf("notautocomplete") !== -1){ 
     $.blockUI; 
    } 
}); 
$(document).ajaxStop($.unblockUI); 

當然其他更好的想法是尋找一些在自動完成請求是唯一的,如URL,而是取決於它的自動完成插件您正在使用以及您如何使用它。

2

嗯,看起來是在jQuery的:) 你可以使用一個全球性的標誌,表示如果是自動完成呼叫,並在一般autcompletefunction

var isAutoComplete = false; 
    function autoComplete(autocomplete){ 
    isAutoComplete = true; 
    if($(autocomplete).isfunction()) 
     autocomplete(); 
    } 

     $(document).ajaxStart(function(){if(!isAutoComplete)$.blockUI();}).ajaxStop(function(){isAutoComplete = false;$.unblockUI();}); 

這不是一個很好的解決方案包裝它缺少功能但它應該工作...