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

发布于 2024-12-04 14:08:33 字数 1828 浏览 0 评论 0原文

我有两个这样的输入字段:

<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< /code> 来自 item.value

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

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

I have two input fields like this:

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

I want to have an autocompleter on both of these fields. I have written the following 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);
}; 

Of course, my server returns JSON data with 2 field: accountCode and accountName.

I want both inputs to use the custom renderer in _renderItem so that this will be displayed in the list:

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

For the first field, it works perfectly, but for second field it only displays the accountCode from item.value.

I've checked that the JSON received from the server is the same in both cases so the problem is in the Javascript.

Do you know why this problem exist?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

感情洁癖 2024-12-11 14:08:33

您的问题就在这里:

}).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/ambiguously/DM8Wv/2/

检查 jsfiddle 做了什么,您应该看到发生了什么。

您可以迭代自动完成字段并使用如下内容单独设置 _renderItem (未经测试的代码):

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

您还可以将自动完成小部件单独绑定到每个元素,但将其全部放在一起并使用 each 设置_renderItem 可以使一切井井有条。

Your problem is right here:

}).data("autocomplete")._renderItem

When the autocomplete widget binds to an element, each element gets its own distinct autocomplete data value. Then, when you grab the .data('autocomplete') to set the _renderItem function, you'll only get one of the two distinct data objects; so the first text field gets your custom renderer but the second one stays with the default renderer.

You can see what's going on by playing with this HTML:

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

And this 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>');

And a live demo: http://jsfiddle.net/ambiguous/DM8Wv/2/

Check what the jsfiddle does and you should see what's going on.

You can iterate through the autocomplete fields and set the _renderItem individually with something like this (untested code):

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

You could also bind the autocomplete widget to each element individually but keeping it all together and using each to set the _renderItem keeps everything nicely organized.

纵性 2024-12-11 14:08:33

非常好的解决方案:

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

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

Very nice solution with respect to:

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

The purpose of calling auto-complete with the same class is when you want to have the same help list to show up in several similar fields.

躲猫猫 2024-12-11 14:08:33

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

(只需将代码添加到 Javascript 中的某处,您的 HTML 标签就不会再在自动完成中转义)

It's works for me!!!
http://www.arctickiwi.com/blog/jquery-autocomplete-labels-escape-html-tags

(Just add code to your Javascript somewhere and your HTML tags won’t be escaped anymore in Autocomplete)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文