Antes de que me los señale, sí, he revisado la media docena de publicaciones sobre este tema, pero todavía estoy bloqueado en cuanto a por qué esto no funciona.
Mi objetivo es detectar cuándo el autocompletado produce 0 resultados. Aquí está el código:
$.ajax({
url:'sample_list.foo2',
type: 'get',
success: function(data, textStatus, XMLHttpRequest) {
var suggestions=data.split(",");
$("#entitySearch").autocomplete({
source: suggestions,
minLength: 3,
select: function(e, ui) {
entityAdd(ui.item.value);
},
open: function(e, ui) {
console.log($(".ui-autocomplete li").size());
},
search: function(e,ui) {
console.log("search returned: " + $(".ui-autocomplete li").size());
},
close: function(e,ui) {
console.log("on close" + $(".ui-autocomplete li").size());
$("#entitySearch").val("");
}
});
$("#entitySearch").autocomplete("result", function(event, data) {
if (!data) { alert('nothing found!'); }
})
}
});
La búsqueda en sí funciona bien, puedo hacer que los resultados aparezcan sin problemas. Según tengo entendido, debería poder interceptar los resultados con el controlador de autocompletar ("resultado"). En este caso, nunca se dispara. (Incluso una alerta genérica o un archivo console.log que no hace referencia al número de resultados nunca se activa). El controlador de eventos abierto muestra el número correcto de resultados (cuando hay resultados), y los controladores de eventos de búsqueda y cierre informan un tamaño de resultado que siempre está un paso por detrás.
Siento que me estoy perdiendo algo obvio y deslumbrante aquí, pero simplemente no lo veo.
fuente
Respuestas:
jQueryUI 1.9
jQueryUI 1.9 ha bendecido el widget de autocompletar con el
response
evento, que podemos aprovechar para detectar si no se devolvieron resultados:Entonces, con eso en mente, la piratería que tuvimos que hacer en jQueryUI 1.8 se reemplaza con:
Ejemplo: http://jsfiddle.net/andrewwhitaker/x5q6Q/
jQueryUI 1.8
No pude encontrar una manera sencilla de hacer esto con la API jQueryUI, sin embargo, puede reemplazar la
autocomplete._response
función con la suya y luego llamar a la función jQueryUI predeterminada ( actualizada para extender elprototype
objeto de autocompletar ) :Y luego vincule un controlador de
autocompletesearchcomplete
eventos al evento (el contenido es el resultado de la búsqueda, una matriz):Lo que está sucediendo aquí es que está guardando la
response
función de autocompletar en una variable (__response
) y luego la usaapply
para llamarla nuevamente. No puedo imaginar ningún efecto negativo de este método ya que está llamando al método predeterminado. Dado que estamos modificando el prototipo del objeto, esto funcionará para todos los widgets de autocompletar.Aquí hay un ejemplo de trabajo : http://jsfiddle.net/andrewwhitaker/VEhyV/
Mi ejemplo usa una matriz local como fuente de datos, pero no creo que eso deba importar.
Actualización: también puede envolver la nueva funcionalidad en su propio widget, extendiendo la funcionalidad predeterminada de autocompletar:
Cambiar su llamada de
.autocomplete({...});
a:Y luego enlazar al
autocompletesearchcomplete
evento personalizado más tarde:Vea un ejemplo aquí : http://jsfiddle.net/andrewwhitaker/VBTGJ/
Dado que esta pregunta / respuesta ha recibido algo de atención, pensé en actualizar esta respuesta con otra forma de lograrlo. Este método es más útil cuando solo tiene un widget de autocompletar en la página. Esta forma de hacerlo se puede aplicar a un widget de autocompletar que usa una fuente remota o local:
Dentro de
if
es donde colocaría su lógica personalizada para ejecutar cuando no se detectan resultados.Ejemplo: http://jsfiddle.net/qz29K/
Si está utilizando una fuente de datos remota, diga algo como esto:
Luego, deberá cambiar su código para que pueda hacer que AJAX se llame usted mismo y pueda detectar cuándo regresan 0 resultados:
fuente
contents[0]
Todo el mundo parece estar ignorando la forma fácil e incorporada: use el evento messages: noResults.
Esta característica se agregó en jQuery 1.9, como una característica experimental ( descrita aquí ). En julio de 2017, aún no está documentado en la API .
fuente
Si está utilizando una fuente de datos remota (como una base de datos MySQL, PHP o lo que sea en el lado del servidor), hay un par de otras formas más limpias de manejar una situación en la que no hay datos para devolver al cliente (sin la necesidad de hacks o cambios en el código de la interfaz de usuario del código central).
Utilizo PHP y MySQL como mi fuente de datos remota y JSON para pasar información entre ellos. En mi caso, parecía recibir errores de excepción de jQuery si la solicitud JSON no obtenía algún tipo de respuesta del servidor, por lo que me resultó más fácil devolver una respuesta JSON vacía desde el lado del servidor cuando no hay datos y luego manejar el cliente respuesta desde allí:
Otra forma sería devolver una bandera en la respuesta del servidor para indicar que no hay datos coincidentes y realizar acciones en el lado del cliente en función de la presencia (o el valor) de la bandera en la respuesta. En este caso, la respuesta del servidor sería algo como:
Luego, en base a esta bandera, se pueden realizar acciones en el lado del cliente:
fuente
Después de inicializar su elemento de autocompletar, configure la opción de mensajes si desea usar los intervalos predeterminados para la indicación de mensajes:
NOTA : Esta es una API experimental (no documentada). Los desarrolladores de jQuery UI todavía están investigando una solución completa para la manipulación e internacionalización de cadenas.
fuente
Después de horas jugando, finalmente encontré un truco para mostrar
No match found
en el autocompletado de jQuery. Mire el código anterior y simplemente agregue adiv
, en mi caso#ulNoMatch
y su estilo establecido endisplap:none
. En el método de devolución de llamada exitosa, verifique si la matriz devuelta tienelength == 0
. Si está ahí lo tienes, ¡te alegraste el día! :)fuente
No veo por qué el
source
parámetro con una devolución de llamada personalizada no es suficiente:fuente
fuente
fuente