Limite los resultados en jQuery UI Autocomplete

126

Estoy usando jQuery UI Autocomplete.

 $("#task").autocomplete({
     max:10,
     minLength:3,
     source: myarray
 });          

El parámetro max no funciona y todavía obtengo más de 10 resultados. ¿Me estoy perdiendo de algo?

santhosh
fuente
11
No hay ninguna opción llamada maxen autocompletar
Jayantha Lal Sirisena

Respuestas:

272

Aquí está la documentación adecuada para el widget jQueryUI . No hay un parámetro incorporado para limitar los resultados máximos, pero puede lograrlo fácilmente:

$("#auto").autocomplete({
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(myarray, request.term);

        response(results.slice(0, 10));
    }
});

Puede proporcionar una función al sourceparámetro y luego llamar slicea la matriz filtrada.

Aquí hay un ejemplo de trabajo: http://jsfiddle.net/andrewwhitaker/vqwBP/

Andrew Whitaker
fuente
77
Funciona de maravilla. ¿Es muy útil si su lista de autocompletado es muy larga (~ 10k resultados) y ralentiza la representación html.
Benjamin Crouzier
¡Muchas gracias por esto! Ahora puedo permitir que los usuarios tengan una lista masiva en localStorage, ¡pero el sitio web se siente realmente rápido! ¡Encantador! : D muchas gracias por esto! : D tan feliz que encontré esta solución ^ __ ^
Alisso
¿Qué pasa si uno tiene dos cuadros de autocompletar en la misma página? Cuando hago el corte de respuesta en ambos, ambos dejan de cortar: /
Alisso
+1 para esta solución. Agregaré minLength: 3 para reducir más los resultados. jsfiddle.net/vqwBP/295
Adrian P.
2
En jsFiddle la solución provista, cambie el valor de corte de 10 a 3 y luego en el cuadro de entrada, ingrese el carácter C. solo recibirá 3 valores que, para un usuario final, podría llevarlos a creer que esos son los únicos tres valores disponibles y no puede continuar ingresando caracteres. Todo lo que sugiero es que proporcione un buen texto de ayuda para acompañar esta solución (por ejemplo, solo se mostrarán los resultados coincidentes XX superiores. Continúe escribiendo para refinar los resultados. "Algo en ese sentido.
HPWD
45

Puede establecer la minlengthopción en un gran valor o puede hacerlo mediante CSS como este,

.ui-autocomplete { height: 200px; overflow-y: scroll; overflow-x: hidden;}
Jayantha Lal Sirisena
fuente
Genio. Me encanta la simplicidad de esto y permite que el usuario decida.
denislexic
18
Esto es bastante hacky. Si tiene una lista realmente larga y el autocompletado devuelve miles de coincidencias, será muy lento ...
Vajk Hermecz
1
De acuerdo con Vajk. Esta es una solución pobre desde un punto de vista de escalabilidad.
Kiksy
44
De acuerdo con Vajk. No juegues con CSS cuando el juego esté en JS.
Adrian P.
Hice lo mismo en mi aplicación de diccionario. ¡Vale la pena!
Moxet Jan
25

Lo mismo que "Jayantha" dijo que usar CSS sería el enfoque más fácil, pero esto podría ser mejor,

.ui-autocomplete { max-height: 200px; overflow-y: scroll; overflow-x: hidden;}

Tenga en cuenta que la única diferencia es "altura máxima". esto permitirá que el widget cambie de tamaño a una altura más pequeña pero no más de 200 px

Sam Battat
fuente
44
Por tu solución. Incluso si es válido, estamos discutiendo soluciones jQuery. Ofrecer una solución CSS a un programador no es una buena idea cuando el problema se puede resolver en jQuery. Y al final esto es solo enmascarar los resultados que no resuelven el problema como en la respuesta aceptada. ¡Aqui tienes!
Adrian P.
3
@SamBattat Usar CSS para un problema de programación es un truco horrible. ¡Imagínese tratando de depurar eso!
Christian Payne
19

Agregando a la respuesta de Andrew , incluso puede introducir una maxResultspropiedad y usarla de esta manera:

$("#auto").autocomplete({ 
    maxResults: 10,
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(src, request.term);
        response(results.slice(0, this.options.maxResults));
    }
});

jsFiddle: http://jsfiddle.net/vqwBP/877/

¡Esto debería ayudar a la legibilidad y mantenibilidad del código!

Engancharse
fuente
10

esto es lo que usé

.ui-autocomplete { max-height: 200px; overflow-y: auto; overflow-x: hidden;}

El desbordamiento automático por lo que la barra de desplazamiento no se mostrará cuando se supone que no debe hacerlo.

Desto
fuente
5

Podría resolver este problema agregando el siguiente contenido a mi archivo CSS:

.ui-autocomplete {
    max-height: 200px;
    overflow-y: auto;
    overflow-x: hidden;
}
Sam
fuente
Por favor no agregue "gracias" como respuestas. En realidad, no proporcionan una respuesta a la pregunta, y pueden ser percibidos como ruido por sus futuros visitantes. En su lugar, vota a favor las respuestas que te gustan. De esta manera, los futuros visitantes de la pregunta verán un mayor recuento de votos en esa respuesta, y el respondedor también será recompensado con puntos de reputación. Vea Por qué es importante votar .
jps
¡Esto es exactamente lo que estaba buscando! ¡No limita la cantidad de resultados sino la cantidad de artículos mostrados! thx
Serge insas
¿Por qué esta respuesta tiene tan pocos votos positivos? ¿Hay algo malo con eso? Me funcionó, al menos a primera vista.
Szybki
3

Si los resultados provienen de una consulta mysql, es más eficiente limitar directamente el resultado mysql:

select [...] from [...] order by [...] limit 0,10

donde 10 es el número máximo de filas que desea

la_nutria
fuente
1
¡No es bueno consultar una base de datos con cada mouse! Puede ser lento en algunos servidores o en una gran base de datos. Por cierto, no voté en contra pero escribí esta explicación. Lo que las personas deben hacer cuando votan en contra. Gracias.
Adrian P.
2

Lo hice de la siguiente manera:

success: function (result) {
response($.map(result.d.slice(0,10), function (item) {
return {
// Mapping to Required columns (Employee Name and Employee No)
label: item.EmployeeName,
value: item.EmployeeNo
}
}
));
AH Jamali
fuente
2

jQuery le permite cambiar la configuración predeterminada cuando adjunta autocompletar a una entrada:

$('#autocomplete-form').autocomplete({
   maxHeight: 200, //you could easily change this maxHeight value
   lookup: array, //the array that has all of the autocomplete items
   onSelect: function(clicked_item){
      //whatever that has to be done when clicked on the item
   }
});
myjeeed
fuente
2

Complemento: jquery-ui-autocomplete-scroll con desplazamiento y los resultados de límite son hermosos

$('#task').autocomplete({
  maxShowItems: 5,
  source: myarray
});
KingRider
fuente
2

He probado todas las soluciones anteriores, pero la mía solo funcionó de esta manera:

success: function (data) {
    response($.map(data.slice (0,10), function(item) {
    return {
    value: item.nome
    };
    }));
},
Tatiana
fuente
0

En mi caso, esto funciona bien:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
tlberio
fuente