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

jQuery模板中Autocomplete功能失效问题求助

解决jQuery模板动态生成文本框的Autocomplete失效问题

你遇到的这个问题其实挺常见的——动态生成的DOM元素没法被提前执行的代码绑定插件。咱们来拆解下原因:你现在是先跑了初始化Autocomplete的.each()循环,再去渲染jQuery模板,但这时候模板里的.approvername文本框还没被添加到页面DOM里呢,代码根本找不到这些元素,自然绑定不上。而模板外的静态文本框因为一开始就在页面里,所以能正常工作。

下面给你几个具体的解决办法:

1. 调整代码执行顺序(最直接的修复)

把Autocomplete的初始化代码放到模板渲染完成之后,确保DOM元素已经存在了再绑定插件:

// 第一步:先渲染模板到页面
$("#approverTemplate").tmpl(approvers).appendTo("#approverContainer");

// 第二步:再给已生成的文本框初始化Autocomplete
$('.approvername').each(function (i, el) { 
    el = $(el); 
    el.autocomplete({ 
        source: function (request, response) { 
            $.ajax({ 
                url: 'https://localhost/<myurl>' + request.term, 
                dataType: "json", 
                type: "GET", 
                contentType: "application/json; charset=utf-8", 
                success: function (data) { 
                    response($.map(data, function (value, key) { 
                        return { label: value.full_name, value: value.user_id }; 
                    })) 
                }, 
                error: function (response) { 
                    alert(response.responseText); 
                }, 
                failure: function (response) { 
                    alert(response.responseText); 
                } 
            }); 
        }, 
        focus: function (event, ui) { 
            el.val(ui.item.label); 
            return false; 
        }, 
        select: function (e, ui) { 
            el.val(ui.item.label); 
            return false; 
        }, 
        minLength: 1 
    }); 
});

2. 封装初始化逻辑(适配多次渲染场景)

如果之后你还会多次渲染这个模板添加新的文本框,把初始化逻辑封装成函数,每次渲染完都调用一次,还能避免重复初始化已绑定的元素:

// 封装初始化函数
function initApproverAutocomplete() {
    // 只给还没绑定Autocomplete的文本框初始化
    $('.approvername').not('.ui-autocomplete-input').each(function (i, el) { 
        el = $(el); 
        el.autocomplete({ 
            // 这里复制你原来的Autocomplete配置即可
            source: function (request, response) { 
                $.ajax({ 
                    url: 'https://localhost/<myurl>' + request.term, 
                    dataType: "json", 
                    type: "GET", 
                    contentType: "application/json; charset=utf-8", 
                    success: function (data) { 
                        response($.map(data, function (value, key) { 
                            return { label: value.full_name, value: value.user_id }; 
                        })) 
                    }, 
                    error: function (response) { 
                        alert(response.responseText); 
                    }, 
                    failure: function (response) { 
                        alert(response.responseText); 
                    } 
                }); 
            }, 
            focus: function (event, ui) { 
                el.val(ui.item.label); 
                return false; 
            }, 
            select: function (e, ui) { 
                el.val(ui.item.label); 
                return false; 
            }, 
            minLength: 1 
        }); 
    });
}

// 第一次渲染模板后调用
$("#approverTemplate").tmpl(approvers).appendTo("#approverContainer");
initApproverAutocomplete();

// 之后如果再添加新的审批人模板,只需重复调用:
// $("#approverTemplate").tmpl(newApproverData).appendTo("#approverContainer");
// initApproverAutocomplete();

3. 额外检查项

如果调整顺序后还是不行,可以排查这几点:

  • 在浏览器控制台执行$('.approvername'),看看能不能找到模板生成的文本框,确认模板是否正确渲染到了#approverContainer里
  • 确保已经正确引入了jQuery UI的JS和CSS文件(Autocomplete是jQuery UI的组件,不是原生jQuery的)
  • 检查AJAX请求的URL是否正确,在控制台的Network标签里看看请求有没有发送成功

内容的提问来源于stack exchange,提问作者Bablu Dutt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:21