2010-04-14 19 views
9

Używam wtyczki JQuery UI blockUI do blokowania interfejsu użytkownika dla każdego żądania ajax. Działa jak urok, jednak nie chcę blokować interfejsu użytkownika (lub przynajmniej nie wyświetlać komunikatu "proszę czekać"), gdy wykonuję wywołania ajaxowe w celu pobrania autouzupełniania sugerowanych elementów. Jak mogę to zrobić? Używam plugin autocomplete jquery do funkcji autouzupełniania.wyjątki jQuery bloku UI

Czy jest jakiś sposób, aby powiedzieć blokowej wtyczce interfejsu użytkownika, aby nie blokować interfejsu użytkownika do autouzupełniania?

Odpowiedz

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

dzięki za tego człowieka, kocham cię – franchez

0

użycie bloku modalnego (blokowy interfejs użytkownika) oznacza blokowanie jakichkolwiek danych wejściowych od użytkownika, sugerowałbym, aby zwykły throbber wyświetlał komunikat "Proszę czekać .." i blokował (ustawia atrybuty readonly = "readonly"). żądanie ajax jest kompletne.

Powyższy interfejs wydaje się być samowykonujący!

+0

To nie wydaje się być odpowiedzią. Blokuję wszystkie żądania ajax używając '$ (document) .ajaxStart ($ .blockUI) .ajaxStop ($. UnblockUI);' Sugerowałeś symulowanie tego samego ręcznie i wykluczenie go dla autouzupełniania, które tak naprawdę nie jest rozwiązaniem. Miałem nadzieję, że wtyczka blockUI może być skonfigurowana na wyjątki. – Chirantan

1

spróbuj dekorator

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

lub można napisać własną funkcję bloku, który jest mądrzejszy

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

To jest miłe, ale nie chcę wyświetlać wiadomości na podstawie pewnych parametrów żądania, takich jak say, adres URL, do którego jest żądanie, jeśli jest tworzony lub przynajmniej identyfikator elementu, z którego pochodzi żądanie lub ajax obiekt. Musi istnieć jakaś wskazówka, która określa, czy wyświetlić komunikat, czy nie. '$ (this)' zawsze daje obiekt 'document'. Dlatego nie ma sposobu, aby wiedzieć, kiedy nie chcę wyświetlać komunikatu "Proszę czekać ...". – Chirantan

+0

To nie jest dobra odpowiedź dla tej sprawy (jquery UI jest za pisanie czegokolwiek samemu, po prostu konfigurowanie: P), 'ale ma wzorce projektowe !!!!! :) '+1 – naugtur

1

Można ustawić blockUI do pracy dla wszystkich funkcji na stronie dodając do globalnej obsługi zdarzeń jQuery. Aby upewnić się, że nie zostanie wywołany w wywołaniach autouzupełniania ajax, musimy ustalić, czy połączenie jest autouzupełnieniem, czy nie. Problem polega na tym, że te globalne funkcje nie mają dostępu do tak wielu informacji. Jednak ajaxSend dostaje trochę informacji. Otrzymuje obiekt ustawień używany do wywołania ajax. obiekt ustawień wysyła ciąg danych. W związku z tym, co można zrobić, to dołączyć do każdego ciągu danych w każde żądanie ajax na swojej stronie coś takiego:

&notautocomplete=notautocomplete 

Na przykład:

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

Wtedy możemy umieścić ten kod w dokumencie gotowym odcinku przed coś innego:

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

oczywiście druga lepszym pomysłem byłoby poszukać czegoś wyjątkowego w auto kompletnych wniosków, jak URL, ale to zależy od autouzupełnianie plug-in z którego korzystasz i jak go używasz.

2

Hm, wydaje się być brakującym elementem w jQuery :) Można użyć globalną flagę, aby wskazać, czy jest to wezwanie autouzupełnianie i zawinąć go w ogólnym autcompletefunction

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

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

To nie jest miłe rozwiązanie ale powinno działać ...