JQuery-Selektor "Alle, aber nicht"


88

Ich kann (mit jQuery) alle Divs in einem HTML-Markup wie folgt auswählen:

$('div')

Aber ich möchte ein bestimmtes div(sagen wir haben id="myid") von der obigen Auswahl ausschließen.

Wie kann ich dies mit Jquery-Funktionen tun?


2
Verwenden Sie den Not-Selektor in jquery
abhijit

Antworten:


169

Einfach:

$('div').not('#myid');

Mit using .not()werden Elemente, die mit dem ihm zugewiesenen Selektor übereinstimmen, aus dem von zurückgegebenen Satz entfernt $('div').

Sie können auch den :not()Selektor verwenden:

$('div:not(#myid)');

Beide Selektoren machen dasselbe, sind jedoch :not()schneller , vermutlich weil die Selektor-Engine von jQuery, Sizzle, sie in einen nativen .querySelectorAll()Aufruf optimieren kann .


1
@ Raynos Ich denke nicht, dass es unbedingt schlecht ist , aber die Verwendung .not()ist weitaus besser als :not().
Bojangles

1
Ich denke es sollte sein $('div:not(#myid)');(ohne Anführungszeichen). @ Raynos: Warum? :not()ist ein CSS3-Selektor. jQuery kann den Selektor direkt an übergeben, querySelectorAllwenn er unterstützt wird ...
Felix Kling

@FelixKling als Teil von selectors4 ist es in Ordnung . In jQuery ist es jedoch langsamer .notund weniger lesbar. Ich hätte sagen sollen ": nicht Selektor in jQuery"
Raynos

@ Raynos: Keine Selectors-Spezifikation hat jemals Anführungszeichen zugelassen :not(). Weder ist dieser Selektor neu für Selektoren 4, noch wurde er geändert, um Anführungszeichen zuzulassen. Es wurde jedoch geändert, um komplexere Selektoren zu ermöglichen. Es sei denn, ich habe Ihren Kommentar falsch verstanden ...
BoltClock

1
@PeterKrauss Ich habe gerade einen jsPerf-Benchmark durchgeführt, der querySelectorAllals der schnellste markiert . Kein realer Benchmark, aber zu erwarten, da jQuery intern keinen Overhead verursacht. :not()ist in der Tat schneller, vermutlich weil Sizzle weiß, dass es es für die Verwendung optimieren kannquerySelectorAll()
Bojangles

10
var els = toArray(document.getElementsByTagName("div"));
els.splice(els.indexOf(document.getElementById("someId"), 1);

Sie könnten es einfach auf die altmodische Weise tun. Keine Notwendigkeit für jQuery mit etwas so Einfachem.

Profi-Tipps:

Eine Reihe von dom-Elementen ist nur ein Array. Verwenden Sie daher Ihre bevorzugte toArrayMethode für a NodeList.

Das Hinzufügen von Elementen zu einer Menge ist gerecht

set.push.apply(set, arrOfElements);

Das Entfernen eines Elements aus einer Menge ist

set.splice(set.indexOf(el), 1)

Sie können nicht einfach mehrere Elemente gleichzeitig entfernen :(


1
In der heutigen Zeit (2017) ist die Verwendung von nativem Javascript .querySelector()oder .querySelectorAll()mit div:not(#myid) schneller vielleicht ... Ist es?
Peter Krauss


4
   var elements =  $('div').not('#myid');

Dies schließt alle Divs außer dem mit der ID 'myid' ein.


3
$('div:not(#myid)');

Das ist was du brauchst, denke ich.



3

Sie verwenden die .notEigenschaft der jQuery-Bibliothek:

$('div').not('#myDiv').css('background-color', '#000000');

Sehen sie in Aktion hier . Das div #myDiv ist weiß.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.