2012-11-20 16 views
5

Ist es möglich, alle Elemente mit einer bestimmten Klasse auszuwählen, aber nicht, wenn sie bestimmte .text() enthalten?Suchen Sie alle Elemente, die keine bestimmte Zeichenfolge enthalten

Hier ist, was ich bisher haben -

<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; 

Was ich will, mit diesem Code zu tun ist, nicht die <div> mit dem 0 darin aufzunehmen.

+0

Sie können direkt 'auch .length' zugreifen auf einem jQuery-Objekt. – pimvdb

+0

Kann es 10, 20, 100 usw. sein? – epascarello

+0

Sie werden Probleme haben, wenn einer dieser divs eine '0' irgendwo im Text hat. Soweit ich weiß, kann ': contains' keine Regex nehmen. – jbabey

Antwort

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

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

übrigens epascarello die Frage zu beantworten, wird dies jeden Teil eines beliebige Stelle innerhalb des Elements entspricht. Wenn Ihre Zahlen auf 10 steigen, wird es auch passen und abdiskontieren. Sie benötigen eine benutzerdefinierte Auswahl oder eine .filter()-Funktion, wenn das ein Problem für Sie ist.

+0

+1, viel schneller als die Single-Selector-Syntax (auf Chrome atleast) http://jsperf.com/psuedo-vs-chained-jb – jbabey

+0

@jbabey Ich bin nicht überrascht - Parsing der Selektor bedeutet zusätzliche Arbeit von der jQuery-Engine, um das gleiche Ergebnis zu erhalten. Natürlich wird es in der realen Welt kaum einen wahrnehmbaren Unterschied geben. – Blazemonger

0

Sie können dies versuchen: -

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

+1 für eine korrekte Antwort und den zufälligen Kommentaren Downvoter entgegenzuwirken. – jbabey

+0

@jbabey: - Vielen Dank.Ich habe die Frage vorher vielleicht missverstanden, deswegen habe ich runtergeraten :( –

3

Eine schnelle Google diese an die Oberfläche gebracht http://forum.jquery.com/topic/jquery-opposite-of-contains

Es kommt auf diesem

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

EDIT

A Test von @jbabey zeigt th auf die akzeptierte Antwort schneller ist, verwenden, so dass

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

Als Followup auf epascarello Antwort, die folgende Selektor eine genaue Übereinstimmung tun wird (dies standardmäßig in jQuery ist nicht enthalten!)

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

Um eine exakte Übereinstimmung zu tun, können Sie jetzt

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

Hier ist eine Methode, die nicht :contains Wähler nicht verwendet

können Sie verwenden .filter() Funktion

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

Check Fiddle

0

Dies ist auch einer der Weg, um den gewünschten Text zu erhalten: http://jsbin.com/arifuv/1/edit

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

console.log(aa); 

// results are ---> 1234 
Verwandte Themen