jQuery:包含选择器以搜索多个字符串


67

假设我有:

<li id="1">Mary</li>
<li id="2">John, Mary, Dave</li>
<li id="3">John, Dave, Mary</li>
<li id="4">John</li>

如果我需要查找包含“ John”和“ Mary”的所有<li>元素,我将如何构造jQuery?

搜索单个字符串似乎很容易:

$('li:contains("John")').text()

我正在寻找类似以下伪代码的内容:

$('li:contains("John")' && 'li:contains("Mary")').text()

谢谢!

Answers:


120

回答

为了找到li“具有同时包含玛丽文本•约翰:

$('li:contains("Mary"):contains("John")')

要查找li包含文本“ EITHER MaryJohn”的,请执行以下操作:

$('li:contains("Mary"), li:contains("John")')

说明

只需将其:contains视为类声明即可,例如.class

$('li.one.two').      // Find <li>'s with classes of BOTH one AND two
$('li.one, li.two').  // Find <li>'s with a class of EITHER one OR two

与相同:contains

$('li:contains("Mary"):contains("John")').      // Both Mary AND John
$('li:contains("Mary"), li:contains("John")').  // Either Mary OR John

演示版

http://jsbin.com/ejuzi/edit


如果我在数组中有字符串,我如何去散开容器?该数组将根据复选框值构建,因此每次都不具有标准长度吗?
jeynon

7

怎么样

$('li:contains("John"),li:contains("Mary")')

jQuery甚至不会索引任何东西两次。因此,有一个自动过滤器,拉撒路的答案实际上找到了四个要素。
Paul

谢谢,那是我希望的工作方式,但是没有。该选择器不返回任何结果。我快速尝试了一下:$('li:contains(“ John”)','li:contains(“ Mary”)')。text(),我得到的只是“”。甚至$('li:contains(“ John”)','li:contains(“ Mary”)')。css('font-color','red')似乎也不起作用。
zıəsuɐɟəʇs

1
我认为您正在'两者之间插入一个li:contains
rahul 2010年

因此,即使更正了我在上述测试中使用的虚假语法,这仍然会选择所有<li>元素。$('li:contains(“ John”),li:contains(“ Mary”)')。css('color','red')这(用单引号分隔选择符):$('li:contains( “ John”)','li:contains(“ Mary”)')。css('color','red')完全不选择任何内容。
zıəsuɐɟəʇs

啊...我明白您的意思,您只想要同时包含两段文字的LI ...嗯...我需要考虑一下。
拉撒路

7

回答

正确的语法是 $("li:contains('John'),li:contains('Mary')").css("color","red")

但是我发现,如果要测试的案例很多,jQuery的性能将非常糟糕(尤其是在IE6上,我知道它已经很旧了,但仍在使用中)。因此,我决定编写自己的属性过滤器。

这是使用方法: $("li:mcontains('John','Mary')").css("color","red")

jQuery.expr[':'].mcontains = function(obj, index, meta, stack){
    result = false;     
    theList = meta[3].split("','");

    var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')

    for (x=0;x<theList.length;x++) {
        if (contents.indexOf(theList[x]) >= 0) {
            return true;
        }
    }

    return false;
};

3
添加.toLowerCase()contentstheList[x]使这种不区分大小写。
Eonasdan 2012年

您如何使其不区分大小写?
computerguy

谢谢-这是我在Chrome中想要的功能:但是,这有点让我发疯了,只有三个条目与中间条目匹配: $("li:mcontains('John', 'Ringo', 'Mary')").css("color","red"); 经过一番调试后,我发现`theList = meta [3] .split(“', '“);`a)我正在使用',<space>'来删除空格,例如:','b)Split给出了'John,Ringo,Mary'(注意在第一和最后一个条目上用单引号引起) : $("li:mcontains(John', 'Ringo', 'Mary)").css("color","red");工作了!!很高兴指出我做错了什么-但这就是我发现的问题
Mark O'Donohue

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.