我正在使用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"
});
但它没有帮助。我猜服务不知道在输入字段中输入了哪个关键字?
任何指针都会很棒。
答案 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>
。