:包含多个单词

时间:2010-05-23 00:54:51

标签: jquery contains

我正在使用以下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分隔的多个单词的组合),那么代码不起作用..

有没有办法实现这个目标?

4 个答案:

答案 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 -

代码已更新。有点低效,但它应该做的工作。