您可以在这里做一些事情。最好的办法可能是只运行两次源搜索,因此当用户输入一个值时,您首先针对您的值运行查找以进行直接匹配;
User enters - HMS
Source returns - H.M.S.
No match
因此,在此之后,您需要尝试将用户输入的内容与格式化的源值进行匹配;
User enters - HMS
Source returns formatted string (remove periods) - HMS
Match
Output original source value
您可能要考虑的另一件事是用户通常不会强烈键入他们的搜索;
User enters - hms
Source returns formatted string (remove periods) - HMS
No match
因此,在尝试匹配任何内容之前,您还需要将两个字符串强制为小写。
假设您的来源和搜索方法是在后端完成的,这真的很容易做到。使用 AJAX 获取您的源代码,如果它足够小,您甚至可以将其存储在客户端机器上以供将来使用,然后只需在代码中进行字符串操作并传回源模型。
我还假设您可能希望使用纯 JQuery 来执行此操作,在这种情况下,我会询问您如何获取源代码并对其进行编辑。
C# ASP.NET MVC 中的一个非常基本的示例看起来有点像这样;
脚本:
$(document).ready(function () {
$("#searchTerm").autocomplete({
source: function (request, response) {
$.ajax({
url: "/Home/SearchSites",
data: "{ 'searchTerm': '" + request.term + "' }",
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
dataFilter: function (data) { return data; },
success: function (data) {
response($.map(data, function (item) {
return {
label: item.value,
value: item.value,
id: item.id
}
}))
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
}
});
},
minLength: 1,
select: function (even, ui) {
window.location.href = '/Till/Index/' + ui.item.id;
}
});
});
控制器:
public JsonResult SearchSites(string searchTerm)
{
var suggestedSites = db.Sites.Where(s => searchTerm == null ||
s.Name.ToLower()
.StartsWith(searchTerm.ToLower()))
.Select(x => new { id = x.SiteUid_PK, value = x.Name })
.Take(5).ToList();
var result = Json(suggestedSites, JsonRequestBehavior.AllowGet);
return result;
}
这必须适应您使用的任何语言,但逻辑将保持几乎完全相同,您只需向控制器方法添加一些额外的字符串格式。