$('#div_search').keypress(function() {
var search_term = $(this).val();
$('.ticker_list').children('div').each(function() {
var search_value = $(this).attr('search_term');
if (search_value.indexOf(search_term) >= 0) {
$(this).show();
}
else {
$(this).hide();
}
});
});
这非常慢,这是有道理的,因为它运行500个div并搜索每个'search_term'属性以查看输入搜索词是否在attr中。有更好或更快的方法吗?我甚至对更好的搜索机制感兴趣。
我也可以根据需要修改DOM。
修改 对不起我应该提到说搜索术语是“你好今天约翰尼”,术语“你好”,“今天”和“约翰尼”必须返回true,这就是为什么我在上面的脚本中使用indexOf。
答案 0 :(得分:5)
这是一个简单的CSS选择器:
$(".ticker_list > div[search_term*="+search_term+"]")
您可能需要转义search_term
,具体取决于它可能包含的内容。
答案 1 :(得分:1)
var search_term = this.value;
$('.ticker_list > div[search-term*="' search_term + '"]').show();
注意:
data-*
属性来存储DOM元素的“元数据”,而不是创建自己的属性。this.value
而非$(this).val()
获取输入值。 keypress
事件转移到change
或至少keyup
事件。 $(this)
,it can speed up you code a bit。答案 2 :(得分:0)
我认为这更快?
$('#div_search').on('keypress', function(){
var search_term = this.value,
elems = document.getElementsByClassName('ticker_list')[0].children;
for (i=0; i<elems.length; i++) {
var search_value = elems[i].getAttribute('search_term');
elems[i].style.display = (search_value.indexOf(search_term) != -1?'block':'none');
}
});
答案 3 :(得分:0)
我制作了一个jsperf here
Jsfiddle http://jsfiddle.net/C9m2K/2/
进行一些小的优化,例如不在循环中隐藏或显示元素,可以提高你的速度, 但仍然将搜索条件存储在javascript对象中要快得多。
您可以像这样构建它:
var searchArray = $('.ticker_list').children('div').map( function( elem ){
return {
value: $(this).attr( "search_term" ),
elem: this
};
}).toArray();
你也不应该在循环中切换隐藏和显示,如果搜索词只匹配一次,那么你正在调用hide 你可以隐藏之前显示的元素的499次。
$('#div_search').keyup( function() {
var previouslyShown = [],
i, len = searchArray.length;
return function(e) {
var cur,
searchTerm = $(this).val();
$( previouslyShown ).hide();
previouslyShown = [];
for( i = 0; i < len; ++i ) {
cur = searchArray[i];
if( cur.value.indexOf( searchTerm ) >= 0 ) {
$( cur.elem ).show();
previouslyShown.push( cur.elem );
}
}
};
}());