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>
Если мне нужно найти все элементы
поиск одной строки кажется простым:
$('li:contains("John")').text()
Я ищу что-то вроде следующего псевдо-кода:
$('li:contains("John")' && 'li:contains("Mary")').text()
спасибо!
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
демо
ответ
правильный синтаксис будет
$("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; };