2009-07-02 3 views
45

Ich weiß, wie Elemente mit einem bestimmten Attribute zu erhalten:Wie kann ich die Elemente ohne ein bestimmtes Attribut von jQuery

$("#para [attr_all]") 

Aber wie kann ich die Elemente, ohne ein bestimmtes Attribut erhalten? Ich versuche

$("#para :not([attr_all])") 

Aber es funktioniert nicht. Was ist der richtige Weg?

Lassen Sie mich ein Beispiel geben:

<div id="para"> 
    <input name="fname" optional="1"> 
    <input name="lname"> 
    <input name="email"> 
</div> 

jQuery:

$("#para [optional]") // give me the fname element 
$("#para :not([optional])") //give me the fname, lname, email (fname should not appear here) 

Antwort

18

Das erste, was mir in den Sinn kommt (vielleicht optimal sub):

$('p').filter(function(){ 
    return !$(this).attr('attr_all'); 
}); 

jedoch p:not([attr_all]) funktionieren sollte, so glaube ich, etwas anderes in Ihrem Code los ist.

+1

Endlich gelöst das Problem und es wurde von einem anderen Teil des Codes verursacht und so werde ich dies als die Antwort markieren. – Billy

+5

Siehe die Antwort unten mit den höheren Upvotes. – WildService

5

$("#para [attr!=val]") Versuchen.

Ihre :not wirklich funktionieren sollte, obwohl, was sonst mir suspekt etwas macht los ist.

Für eine vollständige Liste der Attributselektoren finden Sie in der jQuery Selectors docs.

+0

Es funktioniert nicht. – Billy

+0

Ja, ich denke, dein Problem liegt im Kontext, nicht dieser Selektor. – chaos

+0

+1. Beachten Sie, dass dieser Selektor JQuery-spezifisch ist. Es ist nicht als CSS-Attributselektor definiert, daher kann es nicht als Zielelement für das Styling (via CSS) verwendet werden: http://www.w3.org/TR/CSS2/selector.html#attribute-selectors – PatrikAkerstrand

102

Wenn Ihr Codebeispiel der genaue Code Sie verwenden, glaube ich, das Problem ein verirrter Raum.

$("#para :not([attr_all])") 

sollte

$("#para:not([attr_all])") 

sein, wenn Sie in einen Raum verlassen, wählt er Nachkommen von #para.

+7

das ist die richtige Antwort –

+3

Das ist die richtige Antwort, Daumen hoch –

+9

Aber, von der ursprünglichen Frage will das OP ** ** die Nachkommen auswählen! –

7

Ein schneller Weg, dies zu tun ist, zuerst alle Elemente mit der ID para (das ist ungültig HTML, wenn es mehrere gibt, überlegen, eine Klasse statt verwenden) und verwenden Sie den Filter (oder finden Sie, wie die HTML ist so konstruiert) Methode, um nur die Elemente, ohne das Attribut wie folgt:

$('#para').filter(':not([attr_all])'); 

dies tun Sie jQuery viel weniger Arbeit haben, weil Sie nur durch eine kleinere Teilmenge von Elementen Looping diejenigen ohne das Attribut zu erhalten . Tun Sie es mit einer einzigen Selektor Anweisung, zB $("#para :not([attr_all])"), verursacht jQuery alle Elemente ohne das Attribut zu bekommen, filtern sie dann für diejenigen mit der ID Abs.

1

Frank DeRosa Antwort ist ungefähr richtig, aber da die OP die Nachkommen finden will, ist es weg ein bisschen. Probieren Sie es selbst aus, es scheint, als sollte es funktionieren, aber es ist möglich, dass was auch immer Sie laufen nicht mag, dass der ':' - Operator direkt als ein Nachkomme verwendet wird. Versuchen Sie mit

$("#para input:not([optional])") 

hätte ich einen Kommentar hinterlassen, kann aber noch nicht.

+1

Oder vielleicht ein breiterer Selektor: '$ (" # para *: not ([optional]) ")' – Gideon

Verwandte Themen