我正在使用以下jQuery
var etag = 'kate'
if (etag.length > 0) {
$('div').each(function () {
$(this).find('ul:not(:contains(' + etag + '))').hide();
$(this).find('ul:contains(' + etag + ')').show();
});
}
针对以下HTML
<div id="2">
<ul>
<li>john</li>
<li>jack</li>
</ul>
<ul>
<li>kate</li>
<li>clair</li>
</ul>
<ul>
<li>hugo</li>
<li>desmond</li>
</ul>
<ul>
<li>said</li>
<li>jacob</li>
</ul>
</div>
<div id="3">
<ul>
<li>jacob</li>
<li>me</li>
</ul>
<ul>
<li>desmond</li>
<li>george</li>
</ul>
<ul>
<li>allen</li>
<li>kate</li>
</ul>
<ul>
<li>salkldf</li>
<li>3kl44</li>
</ul>
</div>
基本上,只要etag有一个单词,代码就能完美运行并隐藏那些不包含etag的元素。我的问题是,当etag是多个单词时(我无法控制它。它来自数据库,可能是用空格char分隔的多个单词的组合),那么代码不起作用..
有没有办法实现这个目标?
答案 0 :(得分:5)
此过滤器检查给定字符串中的任何单词是否与元素的文本匹配。
jQuery.expr[':'].containsAny = function(element, index, match) {
var words = match[3].split(/\s+/);
var text = $(element).text();
var results = $.map(words, function(word) {
return text === word;
});
return $.inArray(true, results) !== -1;
};
显示和隐藏为:
$('ul').hide();
$('li:containsAny(john kate)').parents('ul').show();
查看示例here。
答案 1 :(得分:3)
你可以将它变成一个函数,它可以将任意数量的单词分隔成一个字符,如下所示:
function filter(words) {
var uls = $('div ul').hide();
$.each(words.split(' '), function(i, v) {
uls = uls.filter(':contains(' + v + ')');
});
uls.show();
}
//sample call
var etag='kate clair'
filter(etag);
You can see a working demo here
这会找到包含所有给定字符串中的单词的<ul>
元素。
答案 2 :(得分:1)
另一种方法:
var etag='Some text from server';
if (etag.length > 0) {
$('div ul').each(function () {
var el = $(this); // Local reference
(el.html() === etag) ? el.show() : el.hide();
});
}
答案 3 :(得分:0)
略有不同的方法 - 试试这个:
var etag='kate test blah';
var tags = etag.split(' ');
$('div ul').each(function () {
var list = $(this);
list.hide();
list.children('li').each(function() {
var item = $(this);
if ($.inArray(item.html(), tags) >= 0) list.show();
});
});
写在浏览器中,很抱歉,如果有任何错误!
- 修改 -
实际上,我重读了这个问题,而且该代码无效。您需要首先定义行为 - 列表是否必须包含所有标记,或者只显示其中一个标记?
- 编辑2 -
代码已更新。有点低效,但它应该做的工作。