JQuery 自动完成:在一个字段中显示同一个 JSON 对象的多个属性

Posted

技术标签:

【中文标题】JQuery 自动完成:在一个字段中显示同一个 JSON 对象的多个属性【英文标题】:JQuery autocomplete: display several attributes of a same JSON object in one field 【发布时间】:2019-07-15 06:36:20 【问题描述】:

我第一次使用来自 API Rest 的数据的 jquery 自动完成插件。我希望应用程序的用户选择一个城市(从显示的建议中)。与所选城市匹配的其他字段(如地区、部门等)将根据自动完成返回的 JSON 对象自动填充。

到目前为止,一切正常。 这里是代码(为了使示例更清晰,我对数据进行了硬编码):

$(function () 

var data =  [

    "codeRegion": "93",
    "codeDepartement": "13",
    "zipCodes": [
        "13001",
        "13002",
        "13003",
        "13004",
        "13005",
        "13006",
        "13007",
        "13008",
        "13009",
        "13010",
        "13011",
        "13012",
        "13013",
        "13014",
        "13015",
        "13016"
    ],
    "nom": "Marseille",
    "code": "13055",
    "_score": 0.515005204471824,
    "departement": 
        "code": "13",
        "nom": "Bouches-du-Rhône"
    ,
    "region": 
        "code": "93",
        "nom": "Provence-Alpes-Côte d'Azur"
    
,

    "codeRegion": "76",
    "codeDepartement": "32",
    "zipCodes": [
        "32170"
    ],
    "nom": "Marseillan",
    "code": "32238",
    "_score": 0.4956346463216245,
    "departement": 
        "code": "32",
        "nom": "Gers"
    ,
    "region": 
        "code": "76",
        "nom": "Occitanie"
    
,

    "codeRegion": "76",
    "codeDepartement": "34",
    "zipCodes": [
        "34340"
    ],
    "nom": "Marseillan",
    "code": "34150",
    "_score": 0.4956346463216245,
    "departement": 
        "code": "34",
        "nom": "Hérault"
    ,
    "region": 
        "code": "76",
        "nom": "Occitanie"
    
,

    "codeRegion": "76",
    "codeDepartement": "65",
    "zipCodes": [
        "65350"
    ],
    "nom": "Marseillan",
    "code": "65301",
    "_score": 0.4956346463216245,
    "departement": 
        "code": "65",
        "nom": "Hautes-Pyrénées"
    ,
    "region": 
        "code": "76",
        "nom": "Occitanie"
    
,
]

    $("#cityNameInput").autocomplete(
    minLength: 3,
    source: function (request, response) 

           response($.map(data, function (value, key) 
                        return 
                            label: value.nom,
                            value: value.nom,
                            region: value.region,
                            departementName: value.departement.nom,
                            code: value.departement.code
                        
                    ));
                ,



        focus: function (event, ui) 
            $("#cityNameInput").val(ui.item.nom);
                      return false;
        ,

        select: function (event, ui) 
            $("#cityNameInput").val(ui.item.nom);
            $("#region").val(ui.item.region.nom);
            $("#departementName").val(ui.item.departementName);
            $("#departementId").val(ui.item.code);
            return false;
        
    )
);

我只有一个问题: - 如您所见,不同的城市可能具有相同的名称(在此示例中,有 2 个“Marseillan”) - 进一步:像“马赛”这样的大城市被细分为不同的地区,每个地区都有自己的邮政编码。

所以我想做的是,在自动完成建议列表中不仅显示城市的名称,还包括邮政编码等附加信息。这样每一个提案都非常独特。

我尝试了不同的方法,但无法成功。 有人可以帮我解决这个问题吗?

这里是小提琴的链接: http://jsfiddle.net/cg285qwp/

【问题讨论】:

你想看到这样的:Marseille: zip-13 在下拉列表中? 【参考方案1】:

您可以在自动完成源代码中执行类似的操作

source: function (request, response) 

           response($.map(data, function (value, key)  
           var response_array = [];
             $.each(value.zipCodes,function()
             
                response_array.push(
                  
                    label: value.nom+" zip:"+this,
                    value: value.nom,
                    region: value.region,
                    departementName: value.departement.nom,
                    code: value.departement.code
                  
                            );
                            );
            return response_array;
      ));
 ,

这里的标签是与邮政编码连接的,请检查

【讨论】:

您好,感谢您的回答。我希望看到:“Marseille 13001”、“Marseille 13002”... 13001 和 13002 是马赛市可能的邮政编码之一。您的建议不起作用,因为“value.code”指的是另一个代码,而不是邮政编码。一个城市可以有多个邮政编码,它们存储在一个嵌套数组中(请参阅我的帖子中 JSON 对象的结构)。 您想要 zip 中的所有记录吗?很多人都想要 zip 的所有记录吗? 用户应该在不同的 zip 中做出选择,因为在我的业务逻辑的最后,我需要一个只有一个 zip 的城市。为了实现这一点,我每次都希望在自动完成字段的建议列表中出现(city_name + 1 zip)。因此,如果同一个城市有 3 个不同的邮政编码,它应该在建议列表中出现 3 次,每次使用不同的邮政编码。如果这不可能或太复杂,另一种选择可能是让用户首先选择一个具有自动完成功能的城市,然后在 html 选择表单中填充所有匹配的邮政编码。 @JulienBerthoud 我已经更新了代码,请检查。

以上是关于JQuery 自动完成:在一个字段中显示同一个 JSON 对象的多个属性的主要内容,如果未能解决你的问题,请参考以下文章

Jquery UI自动完成列表不刷新

jQuery自动完成功能不起作用?

一个jQuery插件,在电子邮件字段中建议并自动完成域。

jQuery自动完成不显示数据

JQuery 自动完成结果

IE 事件传播与 jQuery 自动完成/jScrollPane 的行为不符