2010-10-18 12 views
5

Tengo un control de Autocompletar jQuery UI que dispara una solicitud Ajax cuando minLength = 3. El problema es el siguiente: Digamos que ingreso "fic" como inicial término de búsqueda - esto está bien. Los incendios de solicitud y los resultados se devuelven. Decido que no quiero seleccionar ninguno de los resultados y luego reingreso a la misma búsqueda nuevamente (fic). ¡Esta vez, ninguna solicitud de Ajax dispara!jQuery UI Autocompletar no desencadenando una búsqueda al ingresar un término hasta ahora buscado

Mi código se muestra a continuación:

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


Así que, básicamente, la devolución de llamada "fuente" no se dispara en el segundo escenario que he descrito anteriormente. Al parecer, la razón de esto era que el control de autocompletar sostenía en el término de búsqueda anterior y debido a que coincidía - no estaba desencadenando una búsqueda:

// 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 
} 


Con el fin de conseguirlo para disparar cada vez, simplemente restablecí el término de búsqueda a nulo después de que se devolviera una búsqueda. De esta manera funcionó como se esperaba.

El problema es que no entiendo este comportamiento. Pensé que cada búsqueda debería ser distinta. No hay almacenamiento en caché (o no debería ser de todos modos).

Así que, aunque he solucionado mi problema, sigo sintiendo que me he perdido algo aquí.

¿Alguna idea a alguien? ¡Gracias por adelantado!

+0

Whate que hace su [** 'search' **] (http://docs.jquery.com/UI/Autocomplete#event-search) mirada evento ¿me gusta? Según lo entiendo, el autocompletar debería disparar en tu segundo escenario. –

+0

Observe cómo puede ingresar 'jav' para eliminarlo, luego ingréselo nuevamente, y aún funcionará con esta demostración ==> http://jsfiddle.net/KFrQm/. –

+0

Hola Peter: no tengo un evento de búsqueda. No es necesario iniciar la búsqueda. Tienes razón sobre el ejemplo. Me di cuenta de esto antes, la única diferencia es que mi fuente es una solicitud de Ajax. – peetj

Respuesta

6

He encontrado una solución a este problema (para información, estoy usando jQuery UI 1.8.4)

La aplicación de autocompletar en el jquery-ui-1.8.4.custom.js tiene un método definido como _cambio. Al comentar la declaración if, el control siempre envía la solicitud.

..., 
_change: function(event) { 
    //if (this.previous !== this.element.val()) { 
     this._trigger("change", event, { item: this.selectedItem }); 
    //} 
}, 
... 
+0

Duncan - gracias por su respuesta – peetj

+0

Puede confirmar que esta respuesta combinada con Stefaan funciona en 1.8.14. Gracias. –

6

He logrado resolver este problema comentando este if-statement en la fuente de la autocompleta de 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

cambiar su lugar, el jquery.ui, puede intentar borrar el valor de la propiedad "anterior", haciendo algo como esto:.
$ (this) .data() autocomplete.previous = null;

+0

me encuentro con el mismo problema en jquerymobile autocompletar aquí está el enlace http://stackoverflow.com/q/18798630/2307391 –

+0

La respuesta de gezequiel funcionó para mí, solo en mi caso fue: $ (this) .data(). autocomplete.term = null; – Babayoto

+0

en jQuery ui 1.10.2 '$ (this) .data(). UiAutocomplete.term = null;' trabajado para mí – Safareli

0

Grandes consejos aquí - esto es algo con lo que he estado luchando durante un tiempo.

Para mí, la única solución que funciona consistentemente es una combinación de las respuestas de Duncan y Stefaan anteriores.

1

Desde JQuery UI 1.8+ puede usar la fábrica de widgets para extender el comportamiento predeterminado de todos sus widgets de autocompletar. basta con incluir un archivo JavaScript con este contenido después 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; 
    } 
}); 
Cuestiones relacionadas