You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:24:02