2010-10-18 7 views
5

Ho un controllo di completamento automatico dell'interfaccia utente jQuery che genera una richiesta Ajax quando minLength = 3. Il problema è il seguente: Dire che inserisco "fic" come iniziale termine di ricerca - questo va bene. La richiesta viene attivata e i risultati vengono restituiti. Decido che non voglio selezionare nessuno dei risultati e quindi reinserire di nuovo la stessa ricerca (fic). Questa volta non viene emessa alcuna richiesta Ajax!jQuery UI Il completamento automatico non avvia una ricerca quando si digita un termine cercato

Il mio codice è il seguente:

// ... do request 
$("#reportSearch").autocomplete({ 
    delay: 50, 
    minLength: 3, 
    source: function(q, add){ 
     $.ajaxSetup ({ cache: false});    
     $.ajax({ 
      type: "GET", 
      url: K_URL_REQUEST 


Quindi, in pratica la richiamata "fonte" non viene generato nel secondo scenario che ho descritto sopra. Sembrava che la ragione di questo è che il controllo di completamento automatico teneva sul termine di ricerca precedente e perché abbinato - non è stato innescando una ricerca:

// Taken from jquery-ui-1.8.4.custom.min.js 
if (a.term != a.element.val()) { // *** THE MATCH IS HERE 
    //console.log("a.term != a.element.val(): "+a.term+", "+a.element.val()); 
    a.selectedItem = null; 
    a.search(null, c) // *** SEARCH IS TRIGGERED HERE 
} 


Per ottenerlo per sparare ogni volta, ho semplicemente reimpostato il termine di ricerca su null dopo una ricerca restituita. In questo modo ha funzionato come previsto.

Il fatto è che non capisco questo comportamento. Avrei pensato che ogni ricerca dovrebbe essere distinta. Non c'è cache (o non dovrebbe essere comunque).

Quindi, anche se ho risolto il problema, sento di aver perso qualcosa qui.

Qualche idea a qualcuno? Grazie in anticipo!

+0

Whate fa il tuo [** 'search' **] (http://docs.jquery.com/UI/Autocomplete#event-search) sguardo evento piace? A quanto ho capito, il completamento automatico dovrebbe sparare nel secondo scenario. –

+0

Nota come puoi inserire 'jav' cancellarlo, quindi inserirlo di nuovo, e funzionerà ancora con questa demo ==> http://jsfiddle.net/KFrQm/. –

+0

Ciao Peter - Non ho un evento di ricerca. Non è necessario dare il via alla ricerca. Hai ragione sull'esempio. L'ho capito prima - l'unica differenza è che la mia fonte è una richiesta di ajax. – peetj

risposta

6

Ho trovato una soluzione a questo problema (per info, io sto usando jQuery UI 1.8.4)

L'implementazione completamento automatico nella jquery-ui-1.8.4.custom.js ha un metodo definito come _modificare. Annunciando la dichiarazione se, il controllo invia sempre la richiesta.

+0

Duncan - grazie per la vostra risposta – peetj

+0

Posso confermare che questa combinazione con la risposta di Stefaan funziona in 1.8.14. Grazie. –

6

sono riuscito a risolvere questo problema commentando questa istruzione if nel sorgente del completamento automatico di jquery ui.

// keypress is triggered before the input value is changed 
clearTimeout(self.searching); 
self.searching = setTimeout(function() { 
    // only search if the value has changed 
    //if (self.term != self.element.val()) { 
     self.selectedItem = null; 
     self.search(null, event); 
    //} 
}, self.options.delay); 
7

invece cambiare il jquery.ui, si può provare a cancellare il valore della proprietà "precedente", facendo qualcosa di simile:.
$ (this) .data() autocomplete.previous = null;

+0

sto affrontando lo stesso problema in completamento automatico jquerymobile qui è il collegamento http://stackoverflow.com/q/18798630/2307391 –

+0

la risposta di gezequiel ha funzionato per me, solo nel mio caso era: $ (questo) .data(). autocomplete.term = null; – Babayoto

+0

su jQuery ui 1.10.2 '$ (this) .data(). UiAutocomplete.term = null;' ha funzionato per me – Safareli

0

Ottimi consigli qui - questo è qualcosa che ho lottato per un po '.

Per me, l'unica soluzione che funziona in modo coerente è una combinazione delle risposte di Duncan e Stefaan sopra.

1

Dal momento che JQuery UI 1.8+ è possibile utilizzare la fabbrica di widget per estendere il comportamento predefinito di tutti i widget di completamento automatico. semplicemente un file javascript con questo contenuto dopo jQueryUI

// Extend jquery UI autocomplete 
$.widget("ui.autocomplete", $.ui.autocomplete, { 
    _close: function(event) { 
     var ret = this._super(); 

     // Resets previously used search term 
     this.term = null; 

     return ret; 
    } 
}); 
Problemi correlati