jQuery autocomplete结合Ajax调用仅按空格/下箭头才触发下拉?
问题根因
你当前的实现逻辑搞反了autocomplete的初始化时机:你是在每次输入触发的AJAX请求成功后,才第一次给输入框绑定autocomplete组件,绑定完成后不会主动触发下拉框渲染,只有下一次按键操作(空格、下箭头等)才会触发已经初始化完成的autocomplete显示匹配结果。
除此之外你的代码还有几处明显错误:
- keydown事件触发时没有清除上一次的定时器,快速输入会触发多次冗余请求
- keydown阶段输入框的值还未更新,拿到的是上一次输入的内容,应该改用input/keyup事件
- 全局用
$('.song-input')绑定autocomplete,多输入框场景下会出现冲突,应该用遍历到的当前input变量 input.next() == 'SongSelector'的判断逻辑错误,input.next()返回的是jQuery对象,无法直接和字符串相等判断,需要根据实际场景调整为input.next().hasClass('SongSelector')或者input.next().attr('id') == 'SongSelector'- 你的请求URL拼写有问题,缺了参数分隔符
?,正确写法应该是search?q=${songSearch}
修复方案
先提前初始化autocomplete组件,输入触发请求成功后直接更新source配置,再手动触发autocomplete的搜索事件拉起下拉框:
function songSelection() { $(".song-input").each(function () { const input = $(this); // 这里修正判断逻辑,根据你实际的节点属性调整 if (input.next().attr('id') === 'SongSelector') { let timer; // 提前初始化autocomplete input.autocomplete({ source: [], minLength: 1 }); // 改用input事件,能实时拿到最新输入值,也兼容粘贴等操作 input.on('input', function () { // 每次输入先清上一次的定时器,防抖 clearTimeout(timer); timer = setTimeout(doneTyping, 300); }); function doneTyping() { const songSearch = input.val().trim(); if (!songSearch) return; $.ajax({ url: `https://deezerdevs-deezer.p.rapidapi.com/search?q=${songSearch}`, method: "GET", headers: { "x-rapidapi-host": "deezerdevs-deezer.p.rapidapi.com", "x-rapidapi-key": "APIkeyhere" }, success: function (data) { const songList = data.data.map(item => item.song); // 直接更新已初始化的autocomplete的source参数 input.autocomplete('option', 'source', songList); // 手动触发搜索,拉起下拉框 input.autocomplete('search', songSearch); }, }) } } }); }
验证说明
修复后输入字符等待300ms防抖结束后,只要接口返回正常就会自动弹出下拉框,不需要额外按键操作。
内容的提问来源于stack exchange,提问作者master_j02
相关产品推荐
相关产品推荐

