一尘不染

jQuery UI通过URL的JSON自动完成

json

我正在使用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

如果要转到该URL,我将像这样返回JSON:

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

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

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

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

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

任何指针都很棒。


阅读 261

收藏
2020-07-27

共1个答案

一尘不染

您需要更改源来满足以下规范(该小部件的文档中已概述)。源必须是包含以下内容的数组(或返回包含以下内容的数组):

  • 简单字符串,或:
  • 包含一个或多个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将您的数组转换为包含自动完成小部件可以解析的元素的数组。

还要注意,data传递给AJAX调用的参数应该?query=<term>在用户键入术语时结束。

2020-07-27