自动完成功能的Source回调将请求和响应对象作为参数。我找不到任何有用的信息,这些信息是什么,以及它们定义的属性和方法。
答案 0 :(得分:4)
我认为理解function(request, response) {...}
内容的最佳方法是浏览插件本身的源代码。
我会尽量清楚,告诉我你是否需要更多细节或解释。
当您在输入中输入一些值时,插件会通过私有方法“_search”执行“搜索”
_search: function(value) {
this.pending++;
this.element.addClass("ui-autocomplete-loading");
this.source({ term: value }, this.response);
}
阅读最后一行,您可以看到该插件希望“source”属性为函数,它执行
请求:具有一个属性term
的对象文字,其中包含输入中输入的内容
响应:插件属性response
。此属性是一个默认调用私有方法“_response”的函数,它负责显示菜单,过滤列表,关闭菜单等。
但是阅读文档后,source
选项会接受一个数组或网址来远程获取值......那么这是如何工作的呢?
该插件通过私有方法this.source
初始化_initSource
:
_initSource: function() {
var self = this,
array, url;
if ($.isArray(this.options.source)) {
array = this.options.source;
this.source = function(request, response) {
response($.ui.autocomplete.filter(array, request.term));
};
} else if (typeof this.options.source === "string") {
url = this.options.source;
this.source = function(request, response) {
if (self.xhr) {
self.xhr.abort();
}
self.xhr = $.ajax({
url: url,
data: request,
dataType: "json",
autocompleteRequest: ++requestIndex,
success: function(data, status) {
if (this.autocompleteRequest === requestIndex) {
response(data);
}
},
error: function() {
if (this.autocompleteRequest === requestIndex) {
response([]);
}
}
});
};
} else {
this.source = this.options.source;
}
},
您可以看到,在这两种情况下,插件最终将this.source
定义为function(request, response) {...}
如果您提供数组,它会执行response
方法以显示使用request.term
传递已过滤数组的菜单:
this.source = function(request, response) {
response($.ui.autocomplete.filter(array, request.term));
}
如果您提供了网址,则会生成ajax请求,并在成功时执行response
方法以显示返回的data
:
success: function(data, status) {
if (this.autocompleteRequest === requestIndex) {
response(data);
}
},
否则,它使用提供的选项值
所以当你以这种方式调用插件时:
$(...).autocomplete({
source: function(request, response) { ... }
});
你实际上没有为插件提供任何数据!
但您有机会以您希望的方式收集数据(其他是数组或网址),并且仍然可以通过参数访问插件功能。您通过request.term
获得了输入内容,并且可以执行response
回调来显示结果。
示例?自动填充演示页面......
如果您转到Autocomplete Multiple values演示页面,jquery ui团队将使用此功能。
数据存储在javascript数组var availableTags = [...];
他们以这种方式定义source
选项:
source: function(request, response) {
// delegate back to autocomplete, but extract the last term
response($.ui.autocomplete.filter(availableTags, extractLast(request.term)));
}
使用特殊处理方法过滤availableTags
数组以处理输入中的多个值
调用response
函数显示已过滤的数组