You can provide any local filtering logic you'd like by providing the source
option a function instead of a simple array. Here's a quick example that will do the basics of what you want:
var source = ['Adam', 'Benjamin', 'Matt', 'Michael', 'Sam', 'Tim'];
$("input").autocomplete({
source: function (request, response) {
var term = $.ui.autocomplete.escapeRegex(request.term)
, startsWithMatcher = new RegExp("^" + term, "i")
, startsWith = $.grep(source, function(value) {
return startsWithMatcher.test(value.label || value.value || value);
})
, containsMatcher = new RegExp(term, "i")
, contains = $.grep(source, function (value) {
return $.inArray(value, startsWith) < 0 &&
containsMatcher.test(value.label || value.value || value);
});
response(startsWith.concat(contains));
}
});
Example: http://jsfiddle.net/zkVrs/
Basically, the logic is to build up an array of matches that start with the term, and then concatenate that with matches that contain the term but don't start with it.
Performance could be a problem here, especially with the $.inArray
call. Might be a better way to accomplish that portion, but hopefully that will give you a good starting point.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…