jQuery: содержит селектор для поиска нескольких строк


предполагая, что у меня есть:

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

Если мне нужно найти все элементы

  • , которые содержат "Джон" и "Мэри", как бы я построил jQuery?

    поиск одной строки кажется простым:

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

    Я ищу что-то вроде следующего псевдо-кода:

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

    спасибо!

  • 4 52

    4 ответа:

    ответ

    это так:

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

    объяснение

    только подумайте о :contains как если бы это было объявление класса, как .class:

    $('li.one, li.two'). //you want either one OR two
    $('li.one.two'). //you want BOTH on one element
    
    // same with :contains
    $('li:contains("mary"), li:contains("john")'). // either mary OR john
    $('li:contains("mary"):contains("john")'). //li, which contains both
    

    демо

    http://jsbin.com/ejuzi/edit

    как о

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

    ответ

    правильный синтаксис будет $("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;
    };
    

    все просто:

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