2011-11-29 10 views
5

Al usar un jQueryUI Autocompletar con AutoFocus establecido en verdadero, si escribe demasiado rápido y pulsa enter, la primera selección reemplazará a la que escribió, incluso si no coincide.jQuery autocompletar autofoco no mantener

Por ejemplo, si escribe "aplicación", y la primera selección del autocompletado de desplazamiento es "apple", y luego continúa escribiendo "applique" rápidamente y presione enter, "applique" se reemplaza por "apple" ".

Inmediatamente antes de que el texto introducido sea reemplazado por la primera selección de la función autocompletar, ¿hay alguna forma de asegurarse de que la primera selección coincida con el texto ingresado?

Respuesta

3

Reduzca su retraso en las opciones de autocompletar. Si está utilizando datos locales, puede establecer el retraso en 0. De forma predeterminada, está establecido en 300 (ms). Entonces, después de presionar una tecla, lleva 300 ms antes de volver a evaluar el conjunto de datos para las coincidencias.

Así que, básicamente, su enfoque automático en el primer elemento, y no le ha dado la oportunidad de volver a filtrar antes de presionar enter.

Como alternativa, puede cambiar la demora a mitad de la transmisión después del primer enfoque automático. Por lo tanto, la primera vez que espere 300 ms para mostrar una sugerencia, luego en el evento de enfoque, disminuirá el temporizador a 0 ms, por lo que filtrará la lista más rápido.

Tenga cuidado, ya que un retraso de 0 podría causar problemas si se trata de datos remotos. Algo como esto podría funcionar bien:

$(".selector").autocomplete({ 
    delay: 300, 
    focus: function() { 
    $(".selector").autocomplete("option", "delay", 0); 
    }, 
    source: sourceData 
} 
0

Sé que llego tarde, pero esto me está volviendo loco. No quería cambiar mi retraso, e incluso si lo hiciera, si escribiera demasiado rápido, eso borrará mis últimos caracteres.

Después de un gran dolor de cabeza, he encontrado la mejor solución :)

Abra su jquery-ui-1.8.20.custom.js (no se puede asegurar el código funcionará en cualquier otra versión) y luego encontrar este líneas:

   blur: function(event, ui) { 
       // don't set the value of the text field if it's already correct 
       // this prevents moving the cursor unnecessarily 
       if (self.menu.element.is(":visible") && 
        (self.element.val() !== self.term)) { 
        self.element.val(self.term); 
       } 
      } 

basta con comentar que if statement así:

   blur: function(event, ui) { 
       // don't set the value of the text field if it's already correct 
       // this prevents moving the cursor unnecessarily 
       /*COMMENTING THIS IF OUT MAKES AUTOCOMPLETE STOP ERASING WHAT YOU TYPE 
       if (self.menu.element.is(":visible") && 
        (self.element.val() !== self.term)) { 
        self.element.val(self.term); 
       } 
       */ 
      } 

y todo funcionará bien :)