在renderItem首次尝试更改jQuery自动完成中的响应项时遇到问题

在renderItem首次尝试更改jQuery自动完成中的响应项时遇到问题,jquery,autocomplete,Jquery,Autocomplete,我已经阅读了大量关于使用_renderItem修改自动完成下拉响应的答案,并从中复制了一些代码。但它不起作用,我也不知道为什么 下面的代码是一个简化的概念测试。当输入某些大城市时,我希望更改城市响应(来自geonames.org),并提供该城市的自治区/地区响应。概念测试简单地将“纽约”更改为“纽约州布朗克斯市,纽约州布朗克斯县”,并使用一个文本字符串表示布朗克斯和现有数据元素。这最终会变得更复杂,但我只想先开始基本的工作 Geonames.org在输入前几个字母时提供“纽约”,但没有发生覆盖更

我已经阅读了大量关于使用_renderItem修改自动完成下拉响应的答案,并从中复制了一些代码。但它不起作用,我也不知道为什么

下面的代码是一个简化的概念测试。当输入某些大城市时,我希望更改城市响应(来自geonames.org),并提供该城市的自治区/地区响应。概念测试简单地将“纽约”更改为“纽约州布朗克斯市,纽约州布朗克斯县”,并使用一个文本字符串表示布朗克斯和现有数据元素。这最终会变得更复杂,但我只想先开始基本的工作

Geonames.org在输入前几个字母时提供“纽约”,但没有发生覆盖更改,警报也不会触发。我还得到了Firebug错误-ReferenceError:item未定义}).data(“item.autocomplete”,item)。\u renderItem=虽然我在很多示例中看到.data(“item.autocomplete”,item),但这一个生成了一个错误,当我修改更改时,错误只会更改。有件事我不明白。至少出现两种症状-Firebug not defined错误和if语句未执行

代码如下。什么应该改变

$("#city3").autocomplete({
    source: function (request, response){
        //some lines omitted
        $.ajax(
            success: function (data){
                response( $.map(data.geonames, function (item){
                    return {
                        label: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                        value: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : ""),
                        county: item.adminName2
                        }
                    }));
            }
        //some lines omitted
}).data("item.autocomplete", item)._renderItem=
    function(ul,item){
    //simple test
        if(item.label=="New York"){
            alert("NYC triggered");
            var replaceItem = $("<li></li>")
                .data("item.autocomplete", item)
                .append("<a>"+"Bronx"+item.label+"Bronx County"+item.adminName1+"</a>");
                return replaceItem.appendTo(ul);
        }else{
        return item.label;
        }
    };
$(“#城市3”).自动完成({
来源:功能(请求、响应){
//有些行省略了
$.ajax(
成功:功能(数据){
响应($.map(data.geonames,函数(项)){
返回{
标签:item.name+(item.adminName2?,“+item.adminName2:”)+(item.adminName1?,“+item.adminName1:”)+,“+item.countryName,
值:item.name+(item.adminName2?,“+item.adminName2:”)+(item.adminName1?,“+item.adminName1:”),
县:item.adminName2
}
}));
}
//有些行省略了
}).data(“item.autocomplete”,item)。\u renderItem=
功能(ul,项目){
//简单测试
如果(项目标签=“纽约”){
警报(“纽约触发”);
var replaceItem=$(“
  • ”) .data(“item.autocomplete”,item) .append(“+”布朗克斯“+item.label+”布朗克斯县“+item.adminName1+”); 返回替换项。附录(ul); }否则{ 退货项目.标签; } };
    你能链接到一些答案吗?项不只是一个神奇的词,它是一个变量,需要先定义它,然后才能将它作为参数传递给函数(在本例中,函数是
    .data(…)
    )。一些轻微的谷歌搜索让我相信所讨论的行实际上应该是:
    }).data(“autocomplete”)。\u renderItem=
    ,即:覆盖
    autocomplete
    数据中的
    \u renderItem
    函数。请注意,这是一个“私有的”/未记录的方法,因此将来可能会中断。@WillPalmer谢谢。是的,我看过你提到的表单,有时两个表单都在同一个代码块中。这是我不明白的部分。在我的例子中,.data表达式中的一个或两个中的“autocomplete”会导致autocomplete中断。输入任何数量的字符都不会得到任何下拉列表。它确实删除了Firebug错误,但是Autocomplete被破坏,因此不会发生附加。我在谷歌上搜索了“jQuery自动完成renderItem”,读了大概30条条目。.data()中的两种形式都被使用了,原因我不清楚。@Willpamer感谢你让我有了新的想法。我从另一段工作代码开始,它以}).data(“autocomplete”)开头,正如您所指出的。Firebug错误消失了,一些非常简单的测试练习奏效了。我还发现我编写的replaceItem函数就是这样做的。它将整个下拉列表替换为1项-这不是我想要的。因此,我仍然不理解.data()中的条目,但我正在寻找一条更高效的途径。再次感谢。