Seletor jQuery “All but not”


89

Posso selecionar (usando jQuery) todos os divs em uma marcação HTML da seguinte maneira:

$('div')

Mas eu quero excluir um determinado div(digamos, ter id="myid") da seleção acima.

Como posso fazer isso usando funções Jquery?


2
use o seletor não em jquery
abhijit

Respostas:


170

Simples:

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

O uso de .not()removerá os elementos correspondentes ao seletor fornecido a ele do conjunto retornado por $('div').

Você também pode usar o :not()seletor:

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

Ambos os seletores fazem a mesma coisa, porém :not()é mais rápido , presumivelmente porque o motor do seletor do jQuery, Sizzle, pode otimizá-lo para uma .querySelectorAll()chamada nativa .


1
@Raynos Não acho que seja necessariamente ruim , mas usar .not()é muito, muito melhor do que :not().
Bojangles

1
Acho que deveria ser $('div:not(#myid)');(sem aspas). @Raynos: Por quê? :not()é um seletor CSS3. jQuery pode passar diretamente o seletor para querySelectorAllse for suportado ...
Felix Kling

@FelixKling funciona como parte dos seletores4 . No entanto, em jQuery é mais lento .note menos legível. Eu deveria ter dito ": não seletor em jQuery"
Raynos

@Raynos: Nenhuma especificação do Seletor jamais permitiu cotações dentro :not(). Este seletor também não é novo no Seletor 4, nem foi alterado para permitir cotações. No entanto, ele foi alterado para permitir seletores mais complexos. A menos que eu não tenha entendido seu comentário ...
BoltClock

1
@PeterKrauss Acabei de fazer um benchmark jsPerf que marca querySelectorAllcomo o mais rápido. Não é um benchmark do mundo real, mas é esperado visto que não há sobrecarga do jQuery interno. :not()é de fato mais rápido, provavelmente porque Sizzle sabe que pode otimizá-lo para usoquerySelectorAll()
Bojangles

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

Você poderia simplesmente fazer isso à moda antiga. Não há necessidade de jQuery com algo tão simples.

Dicas profissionais:

Um conjunto de elementos dom é apenas um array, então use seu toArraymétodo favorito em a NodeList.

Adicionar elementos a um conjunto é apenas

set.push.apply(set, arrOfElements);

Remover um elemento de um conjunto é

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

Você não pode remover facilmente vários elementos de uma vez :(


1
Hoje em dia (2017) talvez o uso de Javascript nativo .querySelector()ou .querySelectorAll()com div:not(#myid) seja mais rápido ... É?
Peter Krauss


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

Isso incluirá todos os divs, exceto aquele com id 'myid'


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

isso é o que você precisa, eu acho.



3

Você usa a .notpropriedade da biblioteca jQuery:

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

Veja em ação aqui . O div #myDiv será branco.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.