我正在使用此代碼來搜索約500個li標籤。用jQuery快速搜索大列表
$(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中搜索槽只有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();
}
});
+1正確的想法,但只有當li內部的值是唯一的時,這才能正確工作。你也正在做一個完全匹配。 – 2009-09-15 21:39:04
啊...部分匹配...嗯,我想添加所有首字母縮略詞子串的排列將是一個醜陋的選擇。 – 2009-09-15 22:18:59
代碼中的一些錯誤,應該是:var abbrs = {}; \t $( 'UL#縮寫立')每個(函數(I){ \t \t abbrs [this.firstChild.nodeValue] = I; \t})。 - 我怎樣才能進行部分比賽? – 2009-09-16 18:33:48