在jQuery UI Autocomplete中限制结果


Answers:


272

这里是适当的文件jQueryUI的部件。没有用于限制最大结果的内置参数,但是您可以轻松实现:

$("#auto").autocomplete({
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(myarray, request.term);

        response(results.slice(0, 10));
    }
});

您可以为source参数提供一个函数,然后调用slice过滤后的数组。

这是一个工作示例: http : //jsfiddle.net/andrewwhitaker/vqwBP/


7
奇迹般有效。如果您的自动完成列表很长(〜10k结果)并且会减慢html渲染速度,这是否很有用?
本杰明·克鲁兹耶

非常感谢您!现在,我可以让用户在localStorage中拥有一个庞大的列表,但是该网站的感觉真的非常快!可爱!:D非常感谢您!:D 很高兴我
碰巧

如果一个人在同一页面上有两个自动完成框怎么办?当我对两者都执行响应切片时,两者都停止切片:/
Alisso 2013年

此解决方案+1。我将添加minLength:3来缩小结果范围。jsfiddle.net/vqwBP/295
Adrian P.

2
在jsFiddle提供的解决方案中,将slice值从10更改为3,然后在输入框中输入字符C。您将只收到3个值,最终用户可能会认为这3个值是唯一可用的3个值并且可能无法继续输入字符。所有我的建议是,以提供良好的帮助文本陪这个解决方案(例如,只有顶端XX匹配结果将显示继续打字优化结果“类似的规定。
HPWD

45

您可以将minlength选项设置为较大的值,也可以像这样通过CSS进行操作,

.ui-autocomplete { height: 200px; overflow-y: scroll; overflow-x: hidden;}

天才。我喜欢它的简单性,它可​​以让用户做出决定。
denislexic 2012年

18
这很hacky。如果您的名单很长,并且自动完成功能返回了数千场比赛,那将非常缓慢……
Vajk Hermecz 2012年

1
同意Vajk。从可扩展性的角度来看,这是一个糟糕的解决方案。
2013年

4
同意Vajk。当游戏使用JS时,请勿使用CSS。
Adrian P.

我在字典应用程序中做了同样的事情。值得!
Moxet 2014年

25

就像“ Jayantha”一样,说使用CSS是最简单的方法,但这可能会更好,

.ui-autocomplete { max-height: 200px; overflow-y: scroll; overflow-x: hidden;}

注意唯一的区别是“最大高度”。这将允许小部件将尺寸调整为较小的高度,但不超过200像素


4
因为您的解决方案。即使是有效的,我们也在讨论jQuery解决方案。当问题可以通过jQuery解决时,向程序员提供CSS解决方案并不是一个好主意。最后,这只是掩盖结果,不能像接受的答案那样解决问题。干得好!
Adrian P.

3
@SamBattat使用CSS解决编程问题是一件可怕的事情。试想调试一下!
克里斯蒂安·佩恩

19

添加到安德鲁的回答,你甚至可以引入一个maxResults属性,并使用它是这样的:

$("#auto").autocomplete({ 
    maxResults: 10,
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(src, request.term);
        response(results.slice(0, this.options.maxResults));
    }
});

jsFiddle:http : //jsfiddle.net/vqwBP/877/

这应该有助于代码的可读性和可维护性!


10

这是我用的

.ui-autocomplete { max-height: 200px; overflow-y: auto; overflow-x: hidden;}

自动溢出,因此在不应有的情况下不会显示滚动条。


5

我可以通过在CSS文件中添加以下内容来解决此问题:

.ui-autocomplete {
    max-height: 200px;
    overflow-y: auto;
    overflow-x: hidden;
}

请不要添加“谢谢”作为答案。他们实际上并未提供问题的答案,并且可能被未来的访问者视为噪音。相反,请投票给您喜欢的答案。这样,未来的问题访问者将对该答案有更高的投票率,并且回答者还将获得声誉得分。请参阅为什么投票很重要
jps

这正是我想要的!不限制结果的数量,而是切碎物品的数量!thx
Serge insas

为什么这个答案很少投票?这有什么问题吗?至少乍一看为我工作。
Szybki

3

如果结果来自mysql查询,则直接限制mysql结果更有效:

select [...] from [...] order by [...] limit 0,10

其中10是您想要的最大行数


1
不好用鼠标查询数据库!在某些服务器或大型数据库上可能很慢。顺便说一句,我没有投票,而是写下了这个解释。人们投反对票时应该做什么。谢谢。
Adrian P.

2

我以以下方式做到了:

success: function (result) {
response($.map(result.d.slice(0,10), function (item) {
return {
// Mapping to Required columns (Employee Name and Employee No)
label: item.EmployeeName,
value: item.EmployeeNo
}
}
));

2

当您将自动完成附加到输入时,jQuery允许您更改默认设置:

$('#autocomplete-form').autocomplete({
   maxHeight: 200, //you could easily change this maxHeight value
   lookup: array, //the array that has all of the autocomplete items
   onSelect: function(clicked_item){
      //whatever that has to be done when clicked on the item
   }
});


2

我已经尝试了上述所有解决方案,但是我的工作方式仅是这样:

success: function (data) {
    response($.map(data.slice (0,10), function(item) {
    return {
    value: item.nome
    };
    }));
},


0

就我而言,这很好:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.