Jquery自动完成2个输入字段(同一类)

时间:2011-09-14 03:32:46

标签: jquery jquery-ui autocomplete

我有两个输入字段:

<input name="accountCode" class="accountCode grid_2"/>
<input name="accountCode" class="accountCode grid_2"/>

我希望在这两个字段上都有自动填充功能。我写了以下JavaScript:

$(".accountCode").autocomplete(
{
    minLength : 1,
    source : function(request, response) {
        $.ajax({                            
            url : baseUrl + "Autocomplete/Account?accountCode=" + $(this).val(),
            dataType : "json",
            success : function(data) {
                response($.map(data, function(item) {
                    return {
                        value : item.accountCode,
                        desc : item.accountName
                    }
                }));
            }
        });
    },
    focus : function(event, ui) {                   
        $(this).val(ui.item.accountCode);
        return false;
    },
    select : function(event, ui) {
        // $("#category").val( ui.item.name );
        $(this).val(ui.item.value);
        // $( "#project-description" ).html( ui.item.desc );
        return false;
    }
}).data("autocomplete")._renderItem = function(ul, item) {
    return $("<li></li>").data("item.autocomplete", item).append(
        "<a><strong>" + item.value + " </strong>" + item.desc + "</a>")
    .appendTo(ul);
}; 

当然,我的服务器返回带有2个字段的JSON数据:accountCodeaccountName

我希望两个输入都使用_renderItem中的自定义渲染器,以便显示在列表中:

"<a><strong>" + item.value + " </strong>" + item.desc + "</a>"

对于第一个字段,它可以很好地工作,但对于第二个字段,它只显示来自accountCode的{​​{1}}。

我已经检查过从服务器收到的JSON在两种情况下是相同的,所以问题出在Javascript中。

你知道为什么会出现这个问题吗?

3 个答案:

答案 0 :(得分:19)

你的问题就在这里:

}).data("autocomplete")._renderItem

当自动完成窗口小部件绑定到元素时,每个元素都会获得自己不同的autocomplete数据值。然后,当您抓住.data('autocomplete')设置_renderItem功能时,您只会获得两个不同数据对象的一个;所以第一个文本字段获取自定义渲染器,但第二个文本字段保留默认渲染器。

通过使用此HTML,您可以看到正在发生的事情:

<div id="a"></div>
<div id="b"></div>
<div id="out"></div>

这个jQuery:

var $out = $('#out');

$out.append('<p>Setting both to {a:"a"}</p>');
$('#a').data('pancakes', { a: 'a' });
$('#b').data('pancakes', { a: 'a' });
$out.append('<p>#a.a = ' + $('#a').data('pancakes').a + '</p>');
$out.append('<p>#b.a = ' + $('#b').data('pancakes').a + '</p>');

$out.append('<p>Setting "div".a to "x"</p>');
$('div').data('pancakes').a = 'x';
$out.append('<p>#a.a = ' + $('#a').data('pancakes').a + '</p>');
$out.append('<p>#b.a = ' + $('#b').data('pancakes').a + '</p>');

现场演示:http://jsfiddle.net/ambiguous/DM8Wv/2/

检查jsfiddle的作用,你应该看看发生了什么。

您可以遍历自动填充字段并使用类似的内容(未经测试的代码)单独设置_renderItem

$(".accountCode").autocomplete({
    //...
}).each(function() {
    $(this).data('autocomplete')._renderItem = function(ul, item) {
        //...
    };
});

您还可以将自动完成窗口小部件单独绑定到每个元素,但将它们保持在一起,并使用each设置_renderItem使所有内容保持良好组织。

答案 1 :(得分:4)

非常好的解决方案:

.each(function() {
    $(this).data('autocomplete')._renderItem = function(ul, item) {
        //...
    };
});

使用相同的类调用自动完成的目的是希望在几个相似的字段中显示相同的帮助列表。

答案 2 :(得分:1)

这对我有用!!! http://www.arctickiwi.com/blog/jquery-autocomplete-labels-escape-html-tags

(只需在您的Javascript中添加代码,您的HTML代码就不会再在自动填充中转义)