我尝试使用像
这样的jQuery / HTML选择器来过滤数据$("li[data-filter*='keyword']")
但是这不能过滤并获得相同的结果“keyword1 keyword2”和“keyword2 keyword1”,您明白吗?
我会给你演示..
HTML:
<input>
<li data-filter="apple pie gummi bears gummi bears john">
Apple pie gummi bears gummi bears John
</li>
<li data-filter="oat cake chocolate bar chupa chups dessert tootsie">
Oat cake chocolate bar chupa chups dessert tootsie
</li>
<li data-filter="jujubes cookie sugar plum lemon drops candy">
Jujubes cookie sugar plum lemon drops candy
</li>
jQuery:
var filter_timer;
$("input").keypress(function() {
clearTimeout(filter_timer);
filter_timer=setTimeout(function(){
filter();
},500);
});
function filter() {
var keyword = $("input").val();
if($("li[data-filter*='"+keyword+"']").length) {
$("li").animate({opacity:0.4}).css({"text-decoration":"line-through"});
$("li[data-filter*='"+keyword+"']").animate({opacity:1}).css({"text-decoration":"blink"});
}else{
$("li").animate({opacity:1},function(){$("li").removeAttr("style")});}
}
游乐场: http://jsfiddle.net/9eaXD/
当我搜索 apple pie 和 pie apple 或 apple gummi pei
时,如何获得相同的结果?答案 0 :(得分:3)
使用属性选择器无法完成您要做的事情。 [data-filter*="apple pie"]
仅匹配data-filter
属性完全字符串apple pie
的元素。
您应该使用.filter()
代替:
$("input").keypress(function() {
var keywords = $(this).val().split(' ');
$('li').removeClass('matched');
$("li[data-filter]").filter(function() {
var filters = $(this).data('filter').split(' ');
for (var i = 0; i < keywords.length; i++) {
var keyword = keywords[i];
if (filters.indexOf(keyword) == -1) {
return false;
}
}
return true;
}).addClass('matched');
});
演示:http://jsfiddle.net/9eaXD/8/
您可以通过为页面加载中的每个元素创建filters
数组来进一步优化这一点:
$("li[data-filter]").filter(function() {
var $this = $(this);
$this.data('filter', $this.data('filter').split(' '));
});