Estoy haciendo una solicitud Ajax a una API de búsqueda de música, utilizando la función de autocompletar de jQuery. La llamada funciona muy bien, pero creo que tengo que hacer algunos ajustes/mejoras de Ajax. La función de autocompletar parece funcionar muy bien cada vez que se hace clic en la barra espaciadora, ¿lo cual es bastante extraño?
Si escribo las letras "perder", obtengo la salida de la lista de canciones completa en mi consola, pero el cuadro de sugerencias desplegable no aparece, a menos que presione la barra espaciadora o presione la flecha hacia abajo en mi teclado.
function songSelection() { $(".song-input").each(function () { let input = $(this); if (input.next() == 'SongSelector') { let timer; input.on('keydown', function () { timer = setTimeout(doneTyping, 300); }); function doneTyping() { let songSearch = input.val() $.ajax({ url: `https://deezerdevs-deezer.p.rapidapi.com/searchq=${songSearch}`, method: "GET", headers: { "x-rapidapi-host": "deezerdevs-deezer.p.rapidapi.com", "x-rapidapi-key": "APIkeyhere" }, success: function (data) { let songList = [] for (let item in data.data) { songList.push(data.data[item].song) } $('.song-input').autocomplete({ source: songList, }) }, }) } } }); }¿Me estoy perdiendo algo en la solicitud de Ajax? Me parece una funcionalidad bastante extraña que las sugerencias desplegables de autocompletar parecen realmente solo querer funcionar cuando se presiona la barra espaciadora o la tecla de flecha hacia abajo después de escribir.
Considera lo siguiente.
$(function() { $(".song-input").autocomplete({ delay: 300, source: function(request, response) { var songSearch = request.term; var songList = []; $.ajax({ url: "https://deezerdevs-deezer.p.rapidapi.com/", data: { searchq: songSearch }, method: "GET", headers: { "x-rapidapi-host": "deezerdevs-deezer.p.rapidapi.com", "x-rapidapi-key": "APIkeyhere" }, success: function(data) { $.each(data.data, function(key, value) { songList.push(value.song); }); response(songList); }, }) } }); }); <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <link rel="stylesheet" href="/resources/demos/style.css"> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <div> Search: <input type="text" class="song-input"> </div> Esto asignará Autocompletar a todos los Elementos con song-input clase. Cuando el usuario ingresa un término de búsqueda, request.term , se pasará a la API y los resultados se formatearán en una matriz. Esa matriz se pasará a response() .
Ver más: https://api.jqueryui.com/autocomplete/#option-source
Está configurando repetidamente temporizadores que en realidad no eliminan el rebote de la escritura. Por lo tanto, el comportamiento de su función de escritura finalizada no es detectar realmente cuándo alguien ha terminado de escribir.
Consulte esta respuesta para obtener más información: https://stackoverflow.com/a/57763036/637283