2010-04-14 2 views
9

Sto usando il plug-in JQuery UI blockUI per bloccare l'interfaccia utente per ogni richiesta Ajax. Funziona come un incantesimo, tuttavia, non voglio bloccare l'interfaccia utente (o almeno non mostrare il messaggio "Attendere prego") quando sto facendo chiamate ajax per recuperare gli oggetti suggeriti di completamento automatico. Come lo faccio? Sto usando il plugin di completamento automatico jQuery per la funzionalità di completamento automatico.jQuery block UI exceptions

C'è un modo che posso dire al plug-in UI del blocco per non bloccare l'interfaccia utente per il completamento automatico?

risposta

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

grazie per questo uomo, ti amo – franchez

0

utilizzando un blocco modale (blocco dell'interfaccia utente) significa bloccare qualsiasi input da parte dell'utente, suggerirei plain throbber per mostrare 'Please wait ..' e bloccare (impostare gli attributi readonly = "readonly") i comandi di input fino a la richiesta Ajax è completa.

L'interfaccia utente precedente sembra essere in conflitto tra loro!

+0

Questo non sembra la risposta. Sto bloccando tutte le richieste Ajax usando '$ (document) .ajaxStart ($. BlockUI) .ajaxStop ($ .unblockUI);' Quello che hai suggerito è simulare lo stesso manualmente ed escludendolo per il completamento automatico che non è proprio la soluzione. Speravo che il plugin blockUI possa essere configurato per le eccezioni. – Chirantan

1

provare a utilizzare un decoratore

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

oppure si può scrivere la propria funzione di blocco che è più intelligente

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

Questo è comunque utile, vorrei non mostrare il messaggio in base ad alcuni parametri della richiesta, come ad esempio, l'url a cui è richiesta se è stata effettuata o almeno l'id dell'elemento da cui è originata la richiesta o l'ajax oggetto. Ci deve essere qualche indizio che determina se mostrare il messaggio o meno. '$ (this)' fornisce sempre l'oggetto 'document'. Quindi non c'è modo di sapere quando vorrei non mostrare il messaggio "Please wait ...". – Chirantan

+0

Non è una buona risposta per questo caso (l'interfaccia utente di jquery è per non scrivere nulla da soli, basta configurare: P), 'ma ha schemi di progettazione !!!!! :) '+1 – naugtur

1

È possibile impostare blockUI a lavorare per tutte le funzioni della pagina aggiungendo a un gestore di eventi jQuery globale. Per assicurarci che non venga chiamato sulle chiamate ajax con completamento automatico, dobbiamo determinare se la chiamata è una chiamata di completamento automatico o meno. Il problema è che queste funzioni globali non hanno così tante informazioni a loro disposizione. Tuttavia ajaxSend ottiene alcune informazioni. Ottiene l'oggetto impostazioni usato per effettuare la chiamata ajax. l'oggetto impostazioni ha la stringa di dati inviata. Quindi cosa si può fare è accoda ad ogni stringa di dati in ogni richiesta Ajax sulla tua pagina qualcosa di simile:

&notautocomplete=notautocomplete 

Ad esempio:

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

Poi possiamo inserire questo codice nella tua sezione pronti documento prima qualsiasi altra cosa:

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

Naturalmente l'altra idea migliore sarebbe quella di cercare qualcosa di unico nelle auto richieste complete, come l'url, ma che dipende da quale plug-in di completamento automatico stai usando e come lo stai usando.

2

Hm, sembra essere una caratteristica che manca in jQuery :) Si potrebbe utilizzare un flag globale per indicare se si tratta di una chiamata di completamento automatico e avvolgerlo in un autcompletefunction generale

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

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

Non è una bella soluzione ma dovrebbe funzionare ...