使用URL中的JSON进行jQuery UI自动完成

时间:2012-09-11 13:16:58

标签: jquery json jquery-ui autocomplete jquery-ui-autocomplete

我正在使用jQuery UI自动完成功能。我可以使用jQuery UI提供的示例,如下所示:

var availableTags = [
        "ActionScript",
        "AppleScript",
        "Asp",
        "BASIC",
        "C",
        "C++",
        "Clojure",
        "COBOL",
        "ColdFusion",
        "Erlang",
        "Fortran",
        "Groovy",
        "Haskell",
        "Java",
        "JavaScript",
        "Lisp",
        "Perl",
        "PHP",
        "Python",
        "Ruby",
        "Scala",
        "Scheme"
    ];

$("#tags").autocomplete({
    source: availableTags
});

这没有任何问题。但我需要使用JSON作为我的数据源,可以像这样检索:http://mysite.local/services/suggest.ashx?query=ball

如果我要去那个网址,我会像这样得到JSON:

 [{"id":12,"phrase":"Ball"},{"id":16,"phrase":"Football"},{"id":17,"phrase":"Softball"}]

如何使用我的网址作为数据源?

我尝试过这样更改source-option:

$("#tags").autocomplete({
    source: "http://mysite.local/services/suggest.ashx"
});

但它没有帮助。我猜服务不知道在输入字段中输入了哪个关键字?

任何指针都会很棒。

1 个答案:

答案 0 :(得分:12)

您需要更改源代码以符合以下规范(小部件的documentation中概述)。源必须是包含(或返回包含)的数组的数组:

  • 简单字符串,或:
  • 包含label属性,value属性或两者兼有的对象。

如果由于某种原因您无法更改远程源返回的内容,则可以在成功检索数据后对其进行转换。以下是您将如何做到这一点:

$("#tags").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://mysite.local/services/suggest.ashx",
            data: { query: request.term },
            success: function (data) {
                var transformed = $.map(data, function (el) {
                    return {
                        label: el.phrase,
                        id: el.id
                    };
                });
                response(transformed);
            },
            error: function () {
                response([]);
            }
        });
    });
});

如您所见,您需要通过将函数传递给窗口小部件的source选项来自行进行AJAX调用。

我们的想法是使用$.map将您的数组转换为包含自动完成小部件可以解析的元素的数组。

另请注意,当用户键入术语时,传递给AJAX调用的data参数最终应为?query=<term>