Sí, puedes hacerlo si parches de mono se autocompletan.
En el widget de autocompletar incluido en v1.8rc3 de jQuery UI, la ventana emergente de sugerencias se crea en la función _renderMenu del widget de autocompletar. Esta función se define así:
_renderMenu: function( ul, items ) {
var self = this;
$.each( items, function( index, item ) {
self._renderItem( ul, item );
});
},
La función _renderItem se define así:
_renderItem: function( ul, item) {
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( "<a>" + item.label + "</a>" )
.appendTo( ul );
},
Entonces, lo que debe hacer es reemplazar ese _renderItem fn con su propia creación que produzca el efecto deseado. Esta técnica, redefiniendo una función interna en una biblioteca, he llegado a aprender que se llama parche de mono . Así es como lo hice:
function monkeyPatchAutocomplete() {
// don't really need this, but in case I did, I could store it and chain
var oldFn = $.ui.autocomplete.prototype._renderItem;
$.ui.autocomplete.prototype._renderItem = function( ul, item) {
var re = new RegExp("^" + this.term) ;
var t = item.label.replace(re,"<span style='font-weight:bold;color:Blue;'>" +
this.term +
"</span>");
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( "<a>" + t + "</a>" )
.appendTo( ul );
};
}
Llama a esa función una vez $(document).ready(...)
.
Ahora, esto es un truco, porque:
Hay un obj regexp creado para cada elemento presentado en la lista. Ese regexp obj debe reutilizarse para todos los artículos.
no se utiliza ninguna clase css para formatear la parte completada. Es un estilo en línea.
Esto significa que si tuviera múltiples autocompletados en la misma página, todos recibirían el mismo tratamiento. Un estilo CSS resolvería eso.
... pero ilustra la técnica principal y funciona para sus requisitos básicos.
ejemplo de trabajo actualizado: http://output.jsbin.com/qixaxinuhe
Para preservar el caso de las cadenas de coincidencia, en lugar de usar el caso de los caracteres escritos, use esta línea:
var t = item.label.replace(re,"<span style='font-weight:bold;color:Blue;'>" +
"$&" +
"</span>");
En otras palabras, a partir del código original anterior, solo necesita reemplazarlo this.term
por "$&"
.
EDITAR
Lo anterior cambia cada widget de autocompletar en la página. Si desea cambiar solo uno, consulte esta pregunta:
¿Cómo parchear * solo una * instancia de Autocompletar en una página?
var re = new RegExp(this.term, "i");
Gran publicación!esto también funciona:
una combinación de las respuestas de @ Jörn Zaefferer y @ Cheeso.
fuente
$().autocomplete()
Súper servicial Gracias. +1.
Aquí hay una versión ligera que se ordena en "La cadena debe comenzar con el término":
fuente
Aquí va, un ejemplo completo funcional:
Espero que esto ayude
fuente
jQueryUI 1.9.0 cambia el funcionamiento de _renderItem.
El siguiente código tiene en cuenta este cambio y también muestra cómo estaba haciendo la coincidencia de resaltado con el complemento jQuery Autocompletar de Jörn Zaefferer. Destacará todos los términos individuales en el término de búsqueda general.
Desde que pasé a usar Knockout y jqAuto, encontré que esta es una forma mucho más fácil de diseñar los resultados.
fuente
.jqAutocompleteMatch { font-weight: bold; }
this.term
debe usar alguna lógica para escapar de regex antes de realizar cualquier procesamiento. Vea Escape string para usar en JavaScript regex como una de las muchas respuestas sobre cómo hacer esto.para una manera aún más fácil, intente esto:
fuente
Aquí hay una repetición de la solución de Ted de Koning. Incluye :
fuente
Aquí hay una versión que no requiere ninguna expresión regular y coincide con múltiples resultados en la etiqueta.
fuente
Eche un vistazo a la demostración del cuadro combinado, que incluye resaltado de resultados: http://jqueryui.com/demos/autocomplete/#combobox
La expresión regular en uso allí también se ocupa de los resultados html.
fuente
Aquí está mi versión:
Ejemplo de texto coincidente resaltado
fuente
puedes usar el siguiente código:
lib:
y lógica:
crea un widget personalizado que puede anular
_renderItem
sin sobrescribir el_renderItem
prototipo original del complemento.en mi ejemplo también utilicé la función de renderizado original para simplificar el código
Es importante si desea utilizar el complemento en diferentes lugares con diferentes vistas de autocompletar y no quiere romper su código.
fuente
Si en su lugar utiliza el complemento de terceros, tiene una opción destacada: http://docs.jquery.com/Plugins/Autocomplete/autocomplete#url_or_dataoptions
(vea la pestaña Opciones)
fuente
Para admitir múltiples valores, simplemente agregue la siguiente función:
fuente