Tengo muchos problemas para hacer que el widget de autocompletar de jQuery funcione para mí. Estoy usando una lista de pares clave/valor de un servidor.jQuery UI Autocompletar con texto híbrido/búsqueda de id
que tienen los siguientes requisitos:
Si el usuario selecciona un valor desde el widget, que quiero pasar el ID al servidor.
Si el usuario no selecciona un valor e ingresa el texto sin formato, o modifica un valor que ya ha sido seleccionado, quiero que se borre el campo de ID y que el texto sin procesar sea enviado al servidor.
Suponga que someAjaxFunction
devuelve una matriz de objetos que el widget de autocompletar espera: {label:label, value:key}
.
Inicialmente conjunto de widgets del autocompletar hasta este modo:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
Cambio de la selección, incluso colocando el cursor sobre uno de los elementos cambia el texto en el cuadro de texto referenciado por $ (entrada) a la clave subyacente, en lugar de la etiqueta. Esto es altamente indeseable desde el punto de vista de la interacción del usuario; de hecho, la razón por la que estoy investigando esto es porque los usuarios del sitio que estoy creando se desconcertaron constantemente por el texto que ingresaron y que aparentemente se convirtió en números aleatorios.
he añadido un campo oculto bajo el cuadro de texto e implementó el select() y el enfoque() eventos con el fin de ocultar el ID de este modo:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
focus: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
select: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
minLength: 1
});
Esto funciona bien cuando el usuario se está pegando a la secuencia de comandos proporcionada por el menú desplegable Autocompletar. El ID está oculto y enviado correctamente al servidor. Lamentablemente, si el usuario desea ingresar texto de forma libre en el cuadro y buscar según ese valor, el campo ID no se restablece y el ID seleccionado previamente se envía al servidor. Esto también es bastante confuso.
La documentación de jQuery UI autocompletar enumera un evento change
y establece que la propiedad item
del argumento ui
será ajustado en el elemento seleccionado. Pensé que podría restablecer el campo de identificación oculto al presionar una tecla y volver a llenar la ID si se modifica la función Autocompletar. Desafortunadamente, además del evento de pulsación de tecla que captura un montón de pulsaciones de teclas que no debe restablecer el ID, la instrucción return false
en el evento select
anterior que es necesario para administrar el texto en el cuadro de texto impide que el evento change
tenga ui .item correctamente asignado.
Así que ahora estoy atascado, realmente no sé qué más puedo intentar para hacer que la funcionalidad de soporte de widgets parezca que debería ser compatible por defecto. O este proceso es mucho más complicado de lo que debería ser, o me falta algo realmente obvio. Recogí todos los eventos disponibles y todos los ejemplos, y salgo con las manos vacías. De hecho, incluso el ejemplo "Datos y visualización personalizados" en la página de jQuery UI sufre este problema.
Puedo agregar algunos hacks en el lado del servidor para cubrir esto, pero realmente preferiría poder hacerlo a nivel del cliente.
También preferiría seguir el widget de autocompletar jQuery UI en lugar de cambiar a otro.
Disculpa, ¿puedo aclarar algo? Al menos uno de sus problemas es que desea que el cuadro de identificación se complete con * la * identificación asociada si el usuario ingresa un valor que tiene una ID correspondiente, o lo que el usuario escriba, si no hay un valor correspondiente - correcto/¿incorrecto? – Stephen
No, solo quiero que el campo ID oculto esté vacío si el texto en el cuadro de texto está configurado a algo que no corresponde a una selección ofrecida por la función autocompletar. – Shabbyrobe