2012-11-20 14 views
5

Czy można wybrać wszystkie elementy z określoną klasą, ale nie, jeśli zawierają one pewną wartość .text()?Znajdź wszystkie elementy, które nie zawierają określonego ciągu znaków

Oto co mam do tej pory -

<div class="test">0</div> 
<div class="test">1</div> 
<div class="test">2</div> 
<div class="test">3</div> 
<div class="test">4</div> 

var divList = $(".test").toArray(); 
var divLength = divList.length; 

Co chcę zrobić z tym kodem jest nie obejmują <div> z 0 w nim.

+0

Można również uzyskać bezpośredni dostęp '.length' na obiekcie jQuery. – pimvdb

+0

Czy może to być 10, 20, 100 itd.? – epascarello

+0

będziesz mieć problemy, jeśli jeden z tych elementów div ma "0" w dowolnym miejscu w tekście. o ile mi wiadomo, ': zawiera' nie może pobrać wyrażenia regularnego. – jbabey

Odpowiedz

11
$('.test').not(':contains(0)') 

http://api.jquery.com/contains-selector/

Nawiasem mówiąc, aby odpowiedzieć na pytanie epascarello jest, to pasuje do żadnego podciąg w dowolnym miejscu wewnątrz elementu. Jeśli twoje liczby wzrosną do 10, to dopasuje je i zdyskontuje. Będziesz potrzebował niestandardowego selektora lub funkcji .filter(), jeśli to jest problem dla Ciebie.

+0

+1, o wiele szybciej niż składnia pojedynczego selektora (w najmniejszej chrome) http://jsperf.com/psuedo-vs-chained-jb – jbabey

+0

@jbabey Nie jestem zaskoczony - parsowanie selektora oznacza dodatkową pracę silnik jQuery, aby uzyskać ten sam wynik. Oczywiście w realnym świecie raczej nie będzie żadnej zauważalnej różnicy. – Blazemonger

0

Można spróbować to: -

$(".test:not(:contains('0'))") 
+0

+1 dla poprawnej odpowiedzi i przeciwdziałania losowemu komentatorowi w dół. – jbabey

+0

@jbabey: - Bardzo dużo.Źle zrozumiałem pytanie poprzednio, może dlatego właśnie dostałem awanturę :( –

3

Szybkie google przyniósł to do powierzchni http://forum.jquery.com/topic/jquery-opposite-of-contains

Wszystko sprowadza się do tego

$(".test:not(:contains('0'))") 

EDIT

A test przez @jbabey pokazuje th u akceptowane odpowiedź jest szybszy, więc korzystać z tego

$(".test").not(":contains(0)"); 

Jako obserwacji na odpowiedź epascarello w następujący selektor zrobi dokładne dopasowanie (nie jest wliczone w jQuery domyślnie!)

$.expr[":"].econtains = function(obj, index, meta, stack){ 
    return (obj.textContent || obj.innerText || $(obj).text() || "").toLowerCase() == meta[3].toLowerCase(); 
} 

aby wykonać dokładne dopasowanie, można teraz używać

$(".test").not(":econtains(0)");​ 
0

Oto metoda, która nie korzysta z :contains selektor

Można użyć .filter() funkcję

$('.test').filter(function(){ 
    return $(this).text().indexOf('0') < 0 ; 
}); 

Check Fiddle

0

Jest to również jedna z okazji, aby uzyskać żądany tekst: http://jsbin.com/arifuv/1/edit

var aa = $('.test').filter(':not(:contains(0))').text(); 

console.log(aa); 

// results are ---> 1234 
Powiązane problemy