jquery - 根据匹配位置对自动完成 UI 结果进行排序

标签 jquery jquery-ui jquery-ui-autocomplete

我想根据字符串中匹配发生的位置对 jQuery 自动完成 UI 结果进行排序。匹配是第一个字母的结果应优先于匹配位于字符串中间的结果。

搜索“M”应返回:

Matt, Michael, Sam, Tim, Adam, Benjamin

相反,由于它现在只是按字母顺序返回项目,所以我得到的是:

Adam, Benjamin, Matt, Michael, Sam, Tim

不幸的是,自动完成 UI 似乎没有任何执行此类操作的选项,而只是按照收到结果的顺序显示结果。让 MySql 进行排序不是一个选择,因为所有可能的匹配项都已预加载,因此我不会在每次击键时都调用数据库。有人做过这样的事吗?

最佳答案

您可以通过为 source 选项提供一个函数而不是一个简单的数组来提供您想要的任何本地过滤逻辑。这是一个简单的示例,可以完成您想要的基本操作:

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));
    }
});

示例: http://jsfiddle.net/zkVrs/

基本上,逻辑是构建一个以该术语开头的匹配数​​组,然后将其与包含该术语但不以其开头的匹配连接起来。

性能可能是一个问题,尤其是使用 $.inArray 调用时。可能是完成该部分的更好方法,但希望这会给您一个良好的起点。

关于jquery - 根据匹配位置对自动完成 UI 结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8302534/

相关文章:

jquery-ui - jQuery UI slider 句柄跳转

javascript - 显示自动完成响应多个值

jquery - 引用 jQuery 自动完成中的文本输入

jquery-ui - Jquery UI 自动完成匹配输入的第一个字母

javascript - 如何在ajax中使用动态添加的html类

jquery - IE7 : CSS & jQuery: dragging up, 拖动项在最上面,向下拖动 : dragged item is below. 如何让两者都在最上面?

jquery-ui - 如何使 jqueryUI datepicker 以与显示的格式不同的格式提交?

jQuery:只运行一次

javascript - jQuery .each 返回 TypeError : Cannot call method 'indexOf' of undefined

javascript - 如何检查滚动条是在开头还是结尾?