Javascript 在jquery自动完成中使用查找和/或服务url
我的应用程序中有一个自动完成功能,可以向服务器发出ajax请求。 然而,一旦我从服务器获取数据,我希望使用查找功能,而不是使用服务url(以最小化对服务器的调用) 下面是我的js的样子Javascript 在jquery自动完成中使用查找和/或服务url,javascript,jquery,autocomplete,jquery-autocomplete,jquery-ui-autocomplete,Javascript,Jquery,Autocomplete,Jquery Autocomplete,Jquery Ui Autocomplete,我的应用程序中有一个自动完成功能,可以向服务器发出ajax请求。 然而,一旦我从服务器获取数据,我希望使用查找功能,而不是使用服务url(以最小化对服务器的调用) 下面是我的js的样子 $('#country').autocomplete({ serviceUrl : './countryCache?', paramName : 'countryName', transformResult : function(response) { return {
$('#country').autocomplete({
serviceUrl : './countryCache?',
paramName : 'countryName',
transformResult : function(response) {
return {
// must convert json to javascript object before process
suggestions : $.map($.parseJSON(response), function(item) {
return {
data : item.name
};
})
};
},
showNoSuggestionNotice:true,
onSelect: function (value, data) {
$('#countryId').val(value.data);
}
});
下面是我对countryCache的ajax调用示例——“印度、冰岛、印度尼西亚”。
如果用户键入了I,服务器将返回上述结果。
现在,当用户在I之后输入n时,我不想再次调用服务器。
有人能帮我实现吗。有一个简单的解决方案。在这里,您将看到一个标题为“带缓存的远程”的部分,该部分介绍了如何实现您所寻找的内容 我根据这个问题修改了该站点的代码,并添加了一些注释以进行澄清:
var cache = {};
$( "#country" ).autocomplete({
source: function( request, response ) {
// If the term is in the cache, use the already existing values (no server call)
var term = request.term;
if ( term in cache ) {
response( cache[ term ] );
return;
}
// Add countryName with the same value as the term (particular to this question)
// If the service reads the parameter "term" instead, this line can be deleted.
request.countryName = request.term;
// Call the server only if the value was not in the cache
$.getJSON( "./countryCache", request, function( data, status, xhr ) {
cache[ term ] = data;
response( data );
});
},
select: function (event, data) {
$('#countryId').val(data.item.value);
}
});
因为我不知道JSON的具体格式,所以我只使用了一个基本格式,用于返回的文本“In:[“印度”、“印度尼西亚”、“西班牙”]
(没有ID,只是一个普通数组)
如果您使用的是(上面的代码看起来很像,尽管问题被标记为),那么您不必担心缓存,因为插件会自动为您执行它 从插件的文档中:
noCache
:指示是否缓存建议结果的布尔值。默认值false
由于您没有为
nocache
指定任何值,因此它将采用默认值false
,并将直接执行缓存。我最终完全没有使用此方法,而是使用了限制为100的快速搜索。但既然我问了,下面是我如何仅使用第一个字符发送请求的:
// global variables: models [], result {}
lookup: function(query, done) {
var mdl = $("#autocomplete").val();
if (mdl.length == 0) {
names = [];
result.suggestions = models;
done(result);
return;
} else if (mdl.length != 1) {
result.suggestions = names;
console.log(result);
done(result);
return;
}
var jqHXR = $.ajax({url: "search.php",
data: {"q": mdl},
dataType: "json",
method: "GET" }
)
.done(function(data, status, jqXHR){
models = [];
$.each( data, function( key, val) {
names.push({ value: val.u, data: { category: genders[val.g] } });
});
result.suggestions = names;
done(result);
})
.fail(function (data, status, errorThrown) {
console.log("failed: "+status+"| error: "+errorThrown);
console.log(data);
});
},
我的一位同事使用了devbridge,我的研究似乎验证了minChars和lookupLimit的devbridgeAutocomplete对象有一个属性。也许devbridgeAutocomplete有不同的实例,但我认为值得发布,以防它们相似,尽管我应该假设您已经看到了:) 代码如下:
var a = $('#<%= txtFindName.ClientID %>').devbridgeAutocomplete({
minChars: 3,
lookupLimit: 20,
serviceUrl: 'AutoComplete/ADUsers.aspx',
onSelect: function (suggestion) {
$('#<%= txtTo.ClientID %>').val( $('#<%= txtTo.ClientID %>').val() + ',' + suggestion.data);
$('#<%= txtFindName.ClientID %>').val('');
}
});
var a=$('#')。devbridgeAutocomplete({
明查斯:3,
截止日期:20,
serviceUrl:'AutoComplete/ADUsers.aspx',
onSelect:功能(建议){
$('#').val($('#').val()+,'+suggestion.data);
$('#').val('');
}
});
Beat me to it:)指向文档的链接将向您展示您所需的一切,此示例非常接近您所需的内容。只需查找“源代码”,就可以找到匹配和返回的逻辑,将您的条件放在ajax之前,您就是黄金。有趣的是,问题中显示的代码不是针对jQuery UI Autocomplete,而是针对默认情况下进行缓存的Autocomplete插件。因此,问题中的代码将是答案,这不是jQuery UI,而是jQuery-autocomplete。minChars是开始搜索之前的字符数,我相信。啊,我想你是对的。在这种情况下,为什么不在运行ajax之前添加字段长度的条件呢。我认为这是最简单的解决办法。我会把它贴出来。然后我会在你的另一个答案中看到它。查找属性,在其中添加逻辑,然后不再进行连续调用。