Limite los resultados en jQuery UI Autocomplete


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/


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;}

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


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!


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.


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;
}

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


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
}
}
));

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
   }
});


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
    };
    }));
},


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,
                }
            }
        })
    );
},
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.