【问题标题】:jqueryUi autocomplete - custom data and displayjqueryUi 自动完成 - 自定义数据和显示
【发布时间】:2012-07-05 17:10:29
【问题描述】:

我的完整代码在这里:http://jsfiddle.net/HfNk9/13/

我正在寻找这个例子jqueryUi autocomplete - custom data and display

假设对象项目不同,它看起来像这样:

project = [
    {
        name: 'bar',
        value: 'foo',
        imgage: 'img.png'
    }
]

如果我设置source = project,自动完成指的是project.value,而不是project.name
我应该如何改变这种行为?


var autocomplete = function(element, data) {
    var fixtures = [
        {
        avatar: "http://www.placekitten.com/20/20",
        name: 'aaaaaaaaa',
        value: 'bbbbbbbbb'}
    ];

    element.autocomplete({
        minLength: 3,
        source: function(request, response) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
            response($.grep(fixtures, function(value) {
                return matcher.test(value.name);
            }));
        },
        create: function() {
            console.log(fixtures)
            element.val(fixtures.name);
        },
        focus: function(event, ui) {
            element.val(ui.item.name);
            return false;
        },
        select: function(event, ui) {
            element.val(ui.item.name);
            return false;
        }
    }).data('autocomplete')._renderItem = function(ul, item) {
        return $('<li></li>')
            .data('item.autocomplete', item)
            .append('<a><img src="' + item.avatar + '" />' + item.name + '<br></a>')
            .appendTo(ul);
    };
};

autocomplete($('#auto'));

我的完整代码:http://jsfiddle.net/HfNk9/13/

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    您需要过滤不同于自动完成小部件默认搜索的属性(当您使用带有对象的源数组时,您已经注意到它是 namevalue)。

    您可以使用函数而不是数组作为源并以这种方式执行您自己的过滤:

    element.autocomplete({
        minLength: 3,
        source: function(request, response) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
            response($.grep(fixtures, function(value) {
                return matcher.test(value.name);
            }));
        },
        create: function() {
            console.log(fixtures)
            element.val(fixtures.name);
        },
        focus: function(event, ui) {
            element.val(ui.item.name);
            return false;
        },
        select: function(event, ui) {
            element.val(ui.item.name);
            return false;
        }
    }).data('autocomplete')._renderItem = function(ul, item) {
        return $('<li></li>')
            .data('item.autocomplete', item)
            .append('<a><img src="' + item.avatar + '" />' + item.name + '<br></a>')
            .appendTo(ul);
    };
    

    示例: http://jsfiddle.net/QzJzW/

    【讨论】:

    • 另外,渲染中的“a”标签是必要的,没有它像focus方法或其他的东西会失败(没有设置ui.item)。
    【解决方案2】:

    您应该使用select 属性:

    $("...").autocomplete({
        source: ...,
        select: function( event, ui ) { //when an item is selected
            //use the ui.item object
            alert(ui.item.name)
            return false;
        }
    });
    

    【讨论】:

    • 谢谢,我试过了,但还是不行。我发布了我的完整代码。
    【解决方案3】:

    答案在您链接到的页面的源代码中。如果你想使用name 的值而不是value,那么你可以这样做:

    $( "#input" ).autocomplete({
        minLength: 0,
        source: projects,
        focus: function( event, ui ) {
            $( "#input" ).val( ui.item.value );
            return false;
        },
        select: function( event, ui ) {
            $( "#input" ).val( ui.item.value );
            return false;
        }
    })
    .data( "autocomplete" )._renderItem = function( ul, item ) {
        return $( "<li></li>" )
            .data( "item.autocomplete", item )
            .append( "<a>" + item.name + "</a>" )
            .appendTo( ul );
    };
    

    【讨论】:

    • 谢谢,我试过了,但还是不行。我发布了我的完整代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多