jquery - 使用 jQuery 快速搜索大列表

标签 jquery performance optimization search list

我使用此代码搜索大约 500 里标签。

$(function() {

    $.expr[":"].containsInCaseSensitive = function(el, i, m){
        var search = m[3];
        if (!search) return false;
        return eval("/" + search + "/i").test($(el).text());
    };  

    $('#query').focus().keyup(function(e){
        if(this.value.length > 0){
            $('ul#abbreviations li').hide();
            $('ul#abbreviations li:containsInCaseSensitive(' + this.value + ')').show();
        } else {
            $('ul#abbreviations li').show();    
        }
        if(e.keyCode == 13) {
            $(this).val('');
            $('ul#abbreviations li').show();
        }
    });

});

这是 HTML:

<input type="text" id="query" value=""/>
<ul id="abbreviations">
<li>ABC<span>description</span></li>
<li>BCA<span>description</span></li>
<li>ADC<span>description</span></li>
</ul>

由于有这么多 li 标签,这个脚本非常慢。

如何才能使其更快,以及如何仅搜索 li 中的 ABC 文本,而不是 span 标签(不更改 html)?

我了解现有的插件,但我需要一个像这样的小实现。

这是感兴趣的人的完成代码

var abbrs = {};

$('ul#abbreviations li').each(function(i){
    abbrs[this.firstChild.nodeValue] = i;
});

$('#query').focus().keyup(function(e){
    if(this.value.length >= 2){
        $('ul#abbreviations li').hide();
        var filterBy = this.value.toUpperCase();
        for (var abbr in abbrs) {
            if (abbr.indexOf(filterBy) !== -1) {
               var li = abbrs[abbr];
               $('ul#abbreviations li:eq('+li+')').show();
            }
        }       
    } else {
        $('ul#abbreviations li').show();    
    }
    if(e.keyCode == 13) {
        $(this).val('');
        $('ul#abbreviations li').show();
    }   
});

最佳答案

首先将所有项目缓存到一个对象中:

var abbrs = {};

$("ul#abbreviations li").each(function (i) {
    abbrs[this.firstChild.nodeValue] = this;
});

然后在对象中查找键入的文本:

var li = abbrs[this.value.toUpperCase()];
// show li, hide others

更新:对于部分匹配,您必须迭代集合:

var filterBy = this.value.toUpperCase();

for (var abbr in abbrs) {
    if (abbr.indexOf(filterBy) !== -1) {
        var li = abbrs[abbr];
        // show li
    }
}

关于jquery - 使用 jQuery 快速搜索大列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1428645/

相关文章:

jquery - 如何在 JQuery 和/或 CSS 中创建水平文本 slider ?

javascript - 在移动设备上来不及使用 display none, block

algorithm - 包含元素 N 且总数 > MIN 的最短子列表

php - 如何优化这个算法?

javascript - Bootstrap Accordion 不工作。

javascript - 在javascript中使用过滤器时获取项目索引

java - Android 填充 ArrayList 时的性能问题

java - 如何优化 REST API 响应时间

javascript - Bootstrap 导航栏 : Is there a way to disable a few menu items even the parent for certain pages?

c++ - 简单的 getter/accessor 防止矢量化 - gcc 错误?