2010-06-30 19 views
27

Estoy usando la Autocompletar de jQuery UI con un origen de datos local (source: myArray). Quiero que el autocompletar proponga solo los resultados que comienzan con la cadena ingresada en lugar del insensible a mayúsculas/minúsculas contiene búsqueda. ¿Hay una solución simple para esto o tengo que proporcionar mi búsqueda personalizada/devolución de llamada de origen?jQuery UI Uso de autocompletar startsWith

+2

Respuesta relacionada: http://stackoverflow.com/questions/2382497/jquery-autocomplete-plug-in-search-configuration – sina

Respuesta

10

Actualmente lo he hecho de esta manera, no estoy seguro si hay una solución mejor:

source: function(request, response) { 
    var filteredArray = $.map(orignalArray, function(item) { 
     if(item.value.startsWith(request.term)){ 
      return item; 
     } 
     else{ 
      return null; 
     } 
    }); 
    response(filteredArray); 
}, 

Este enfoque también hizo posible imponer un límite (por ejemplo, 10 elementos) de la cantidad de elementos para ser mostrado.

+0

No soy de ninguna manera un experto en estas cosas, pero puedo imaginar un algoritmo de coincidencia de cadenas como Aho -Corasick puede ayudar. – Huppie

+0

Antes de malinterpretar mi comentario anterior. La implementación de cadenas que coincidan solo debe hacerse cuando el rendimiento es absolutamente crítico Y un generador de perfiles muestra que su solución actual es el cuello de botella. Hasta entonces, usa la solución que tienes ahora. La legibilidad de su código supera los beneficios de rendimiento en este caso :) – Huppie

+0

Su propuesta sobre el algoritmo de coincidencia de cadenas también significa un método de devolución de llamada personalizado como el anterior (si no estoy equivocado). Puede ser interesante en algunos casos particulares como dices, aunque el UI Autocompletar ya implementa una búsqueda decente (con contiene). Por ahora me quedaré con mi implementación (solo recibí 3k elementos de 4chars cada uno). – Bart

1
source: function(request, response) { 
       var t = jQuery.grep(t, function(a){ 
         var patt = new RegExp("^" + request.term, "i"); 
         return (a.match(patt)); 
        }); 
       response(t); 
      }, 
+0

Supongo que necesita ser beo patt.test en lugar de match. – toy

+1

Lo he notado ahora también. O tiene que ser un .match (patt). No sé cómo/por qué funcionó antes, pero Sí. –

+0

¿Qué pasa si quiero obtener palabras que termine? Con probé esta expresión regular, var patt = new RegExp ("\\>" + request.term, "i"); pero no funcionó, por cierto, ¿qué significa el segundo parámetro para la función RegExp llamada "i"? – Tarek

2

Ingresé al código Jqueryui y lo cambié allí.

Si nos fijamos en la sección de auto completo, verá la línea siguiente:

filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i") 

modificarla a la siguiente (cuidado, esto es un cambio global):

filter:function(a,b){var g=new RegExp("^" + d.ui.autocomplete.escapeRegex(b),"i") 
2

Aquí está una forma ligeramente diferente de hacer una búsqueda sensible a mayúsculas y minúsculas. Tenga en cuenta la falta de "i" en la creación de la expresión regular en el segundo ejemplo, que es lo que causa la insensibilidad de mayúsculas y minúsculas en la implementación predeterminada.

caso

insensible:

  $('#elem').autocomplete({ 
       source: array 
      }); 

entre mayúsculas y minúsculas:

  $('#elem').autocomplete({ 
       source: function(request, response) { 
        var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term, "")); 
        var data = $.grep(array, function(value) { 
         return matcher.test(value.label || value.value || value); 
        }); 
        response(data); 
       } 
      }); 
23

ver esto:

de ajuste de palabra de inicio:

http://blog.miroslavpopovic.com/jqueryui-autocomplete-filter-words-starting-with-term

Anula el método de filtro de autocompletar. Yo uso esto y funciona bien.

// Overrides the default autocomplete filter function to search only from the beginning of the string 
$.ui.autocomplete.filter = function (array, term) { 
    var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i"); 
    return $.grep(array, function (value) { 
     return matcher.test(value.label || value.value || value); 
    }); 
}; 

palabra partido:

Partido startsWith de cualquier palabra de la cadena.

p. Ej."LHR Londres" se corresponde con

var matcher = new RegExp("\\b" + $.ui.autocomplete.escapeRegex(term), "i"); 

\ b Posición afirman en un límite de palabra (^ \ w | \ w $ | \ W \ w | \ w \ W) "londres"

2

que pueda utilizar la misma manera en Jquery UI Autocomplete Examples

<script> 
$("#autocompleteInputField").autocomplete({ 
    source: function(request, response) { 
      var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i"); 
      response($.grep(myArray, function(item){ 
       return matcher.test(item); 
      })); 
     } 
}); 
</script> 

O otra manera con el uso de $.map método no $.grep

<script> 
$("#autocompleteInputField").autocomplete({ 
    source: function(request, response) { 
      var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i"); 
      response($.map(myArray, function(item) { 
       if (matcher.test(item)) { 
        return (item) 
       } 
      })); 
     } 
}); 
</script> 
Cuestiones relacionadas