【问题标题】:jQuery AutoCompletejQuery 自动完成
【发布时间】:2011-10-03 08:46:31
【问题描述】:

我想为用户所在的城市构建一个 jquery 自动完成输入字段。当用户开始输入单词时,我想以这种格式显示具有最接近关联的 5 个城市的列表 [City, Country]

我有三张桌子

  1. 国家(id,country_name)
  2. 地区(id、region_name、country_id)
  3. 城市(id、city_name、region_id、country_id)

当用户选择一个城市时,我想捕获城市的 id 以将其插入数据库。

我应该如何使用自动完成来做到这一点?

我应该使用城市的 id 设置一个隐藏字段还是传递城市的名称,然后检查它的 id 是什么?这里的问题是全球有同名的城市,并且很难识别它。

JS代码

$("#UserCity").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://localhost/baku/users/location/",
            dataType: "json",
            data: {
                data: request.term
            },
            success: function (data) {
                /// Need to modify this part
                response($.map(data.geonames, function (item) {
                    return {
                        label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                        value: item.name
                    }
                }));
            }
        });
    },
    minLength: 2
});

我从 Ajax 获得的示例 JSON 字符串

[{"name":"Banaras, Uttar Pradesh, India","city_id":"1927","region_id":"2193","country_id":"113"},{"name":"Banda, Uttar Pradesh, India","city_id":"1938","region_id":"2193","country_id":"113"},{"name":"Bangalore, Karnataka, India","city_id":"1949","region_id":"2185","country_id":"113"},{"name":"Banganapalle, Andhra Pradesh, India","city_id":"1950","region_id":"2169","country_id":"113"},{"name":"Banswara, Rajasthan, India","city_id":"1983","region_id":"2190","country_id":"113"},{"name":"Banur, Punjab, India","city_id":"1987","region_id":"2189","country_id":"113"}]

我想将名称显示为列表,并通过表单将 City_id 作为可传递参数,这样我就不需要再次进行数据库查询。

数组

Array
(
    [0] => Array
        (
            [name] => Banaras, Uttar Pradesh, India
            [city_id] => 1927
            [region_id] => 2193
            [country_id] => 113
        )

    [1] => Array
        (
            [name] => Banda, Uttar Pradesh, India
            [city_id] => 1938
            [region_id] => 2193
            [country_id] => 113
        )

    [2] => Array
        (
            [name] => Bangalore, Karnataka, India
            [city_id] => 1949
            [region_id] => 2185
            [country_id] => 113
        )

    [3] => Array
        (
            [name] => Banganapalle, Andhra Pradesh, India
            [city_id] => 1950
            [region_id] => 2169
            [country_id] => 113
        )

    [4] => Array
        (
            [name] => Banswara, Rajasthan, India
            [city_id] => 1983
            [region_id] => 2190
            [country_id] => 113
        )

    [5] => Array
        (
            [name] => Banur, Punjab, India
            [city_id] => 1987
            [region_id] => 2189
            [country_id] => 113
        )

)

【问题讨论】:

标签: php jquery mysql cakephp autocomplete


【解决方案1】:

当面临 2 个实例具有相同名称的可能性时,我总是添加一个更独特的东西来区分它们(但这只是为了让用户可以做出正确的选择)。通常,您的城市应该有不同的 ID(它们应该是唯一的)。

【讨论】:

  • 当我显示内容时.. 我会显示 [City, Region, COuntry] 这样就不会有问题了。我只想从表单中获取内容以将其保存在数据库中
【解决方案2】:

HTML:

<input type="text" name="city" id="city" />
<input type="hidden" name="city_id" id="city_id" />

jQuery:

$('input.city').autocomplete('/ajax/autocomplete-city.php').result(function(e, data){
    $('city_id'.val(data[1]);
});

PHP:

$query = mysql_real_escape_string($_GET['q']);

$rs = mysql_query("
    SELECT
        CONCAT_WS(', ', city.city_name, region.region_name, country.country_name)
    ,   city.id
    FROM
        city
    INNER JOIN
        region ON region.id = city.region_id
    INNER JOIN
        country ON country.id = city.country_id
    WHERE
        city.city_name LIKE '$query%'
    LIMIT 10
");

while ($r = mysql_fetch_row($rs))
{
    echo implode("|", $r);
    echo "\n";
}

【讨论】:

  • 感谢 Creadiff 的回答。我对我正在生成的字符串感到困惑。我已将其添加到问题中。我的 url 看起来像这个 site.com/location/{what ever is typed} 并且我得到了我发布的 Json 字符串。
  • 自动完成插件自动发送的 URL 如下所示:location/given/in/parameter?q=field+value。响应由表示管道分隔值的行组成(每个结果一行)。见:dyve.net/jquery/autocomplete.txt
  • 我正在使用 jQuery UI 自动完成模块。正如我在问题中所示,我能够取回 JSON 字符串。无法在 JS 代码中处理它。收到此错误:a 未定义。我正在尝试使用您的代码修改示例。将JS代码更新到问题中
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2013-01-14
相关资源
最近更新 更多