J'utilise ce code pour rechercher environ 500 étiquettes li.Recherche rapide dans une grande liste avec 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();
}
});
});
Et voici le 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>
Ce script est très lent avec autant de balises li.
Comment est-ce que je peux le rendre plus rapide, et comment puis-je rechercher seulement le texte ABC dans le li, et pas les balises d'envergure (sans changer le html)?
Je connais les plugins existants, mais j'ai besoin d'une petite implémentation comme celle-ci.
Voici le code fini pour toute personne intéressée
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 Bonne idée, mais cela ne fonctionne correctement que si les valeurs dans li sont uniques. Aussi, vous faites une correspondance exacte. –
Ah ... match partiel ... Eh bien, je suppose que l'ajout de toutes les permutations de sous-chaînes acronyme serait une option laide. –
Quelques erreurs dans le code, il devrait être: var abbrs = {}; \t $ ('abréviations ul n li') chacune (fonction (i) { \t \t abbrs [this.firstChild.nodeValue] = i; \t}). - Comment puis-je faire un match partiel? –