- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用此代码搜索大约 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/
我是一名优秀的程序员,十分优秀!