【问题标题】:Understanding and implementing jQuery autocomplete with AJAX source and appendTo使用 AJAX 源和 appendTo 理解和实现 jQuery 自动完成
【发布时间】:2012-07-30 21:06:37
【问题描述】:

下面是我尝试让appendTo 使用带有 AJAX 源的 jQuery 自动完成功能。

我有多个问题,希望能帮助许多正在努力理解使用 AJAX 源代码实现自动完成的正确方法的其他人。

1) source: function(request, response) {...} 这是做什么的?为什么需要它。

2) function(data){ response($.map (data, function(obj) { 以什么格式返回数据?我意识到数据是 JSON 格式的,但.map 的意义何在?有必要这样做吗?有什么好处吗?

3a) 使用appendTorenderItem时,是否需要返回上述success数据?

3b) 或者,根据上述数据,您如何正确使用 appendTo 和 renderItem 来更改检索值的格式和显示?

$(function() {
$( ".find_group_ac" ).autocomplete({
        minLength: 1,
        source: function(request, response) {
            $.ajax({
                url: "welcome/search/",
                data: { term: $(".find_group_ac").val()},
                dataType: "json",
                type: "POST",
                success: function(data){ response($.map
                        (data, function(obj) {
                            return {
                            label: obj.name + ': ' + obj.description,
                            value: obj.name,
                            id: obj.name
                };}));}
            });
        }
    }).data( "autocomplete" )._renderItem = function( ul, item ) {
            return $( "<li></li>" )
                .data( "item.autocomplete", item )
                .append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
                .appendTo( ul );
        };
});

这似乎有很多要回答的问题,但我相信它对许多 javascript 新手和我自己来说都很有价值。

【问题讨论】:

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


    【解决方案1】:

    source: function(request, response) {...}这是做什么的?为什么需要它。

    由于您正在执行自定义 AJAX POST 来获取数据,因此您必须指定一个函数,该函数使用所需的自动完成候选者调用 response 回调。

    在最简单的用例中,您只需向source 参数提供一个字符串,该小部件将针对该URL 发出一个带有附加?term=(term) 的GET 请求。由于您正在执行 POST 并发送不同的术语,因此您必须使用 source 的函数版本。

    PS:您应该为$.ajax 调用提供request.term 而不是$(".find_group_ac").val()


    function(data){ response($.map (data, function(obj) { 返回数据?我意识到数据是 JSON 格式,但是什么是 .map 的意义何在?有必要这样做吗?有什么好处吗?

    自动完成小部件需要一个数组数据源,其项目满足以下要求之一:

    1. 项目必须是单个字符串,或者:
    2. 项目必须是具有label 属性、value、属性或两者兼有的对象。

    考虑到这一点,如果您使用的服务器端资源的 JSON 不是以这种方式格式化,则必须先转换数据以满足这些规范,然后再将其提供给 @ 987654335@ 功能。执行此操作的常用方法是使用 $.map,它遍历数组并转换每个元素。


    使用appendTorenderItem时,是否需要返回上述成功数据?

    不,但它们经常一起使用。

    假设您想要在候选列表中显示一个额外的属性(例如description)。在这种情况下,您可以将服务器端结果转换为自动完成所需的格式(包括labelvalue,但仍包括description),但您还希望显示description 属性。在这种情况下,您需要重载_renderItem


    或者,根据上述数据,您如何正确使用 appendTo 和 renderItem 来更改检索值的格式和显示?

    如果上面提出的问题在这个答案中得到了充分回答,那么我需要做的就是发布一些将这些概念结合在一起的代码:

    $( ".find_group_ac" ).autocomplete({
        minLength: 1,
        source: function(request, response) {
            $.ajax({
                url: "welcome/search/",
                data: { term: $(".find_group_ac").val()},
                dataType: "json",
                type: "POST",
                success: function(data) { 
                    response($.map(data, function(obj) {
                        return {
                            label: obj.name,
                            value: obj.name,
                            description: obj.description,
                            id: obj.name // don't really need this unless you're using it elsewhere.
                        };
                    }));
                }
    
            });
        }
    }).data( "autocomplete" )._renderItem = function( ul, item ) {
        // Inside of _renderItem you can use any property that exists on each item that we built
        // with $.map above */
        return $("<li></li>")
            .data("item.autocomplete", item)
            .append("<a>" + item.label + "<br>" + item.description + "</a>")
            .appendTo(ul);
    };
    

    jQueryUI's documentation page for autocomplete 上的示例实际上非常广泛,可能会有所帮助。具体来说,请务必查看:

    【讨论】:

    • 谢谢 :) 拯救了我的一天!
    • 感谢这个 sn-p。请注意,描述后缺少逗号(,):obj.description
    • @Danilo:谢谢!已更新。
    猜你喜欢
    • 2019-03-07
    • 2013-01-12
    • 2014-10-09
    • 1970-01-01
    • 2018-04-23
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多