value jQuery OU Seletor?




jquery selector tag a (4)

Eu estou querendo saber se há uma maneira de ter lógica "OR" em seletores jQuery. Por exemplo, eu sei que um elemento é descendente de um elemento com classe classA ou classB, e eu quero fazer algo como elem.parents('.classA or .classB') . O jQuery fornece essa funcionalidade?


Daniel A. White Solution funciona muito bem para as aulas.

Eu tenho uma situação onde eu tive que encontrar campos de entrada como donee_1_card onde 1 é um índice.

Minha solução foi

$("input[name^='donee']" && "input[name*='card']")

Embora eu não tenha certeza de como isso é ótimo.


Se você está procurando usar a construção padrão de element = element1 || element2 onde JavaScript irá retornar o primeiro que é verdade, você poderia fazer exatamente isso:

element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');

qual retornaria o primeiro elemento que é encontrado realmente. Mas uma maneira melhor provavelmente seria usar a construção de vírgula do seletor jQuery (que retorna uma matriz de elementos encontrados) desta maneira:

element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];

que retornará o primeiro elemento encontrado.

Eu uso isso de tempos em tempos para encontrar um elemento ativo em uma lista ou algum elemento padrão se não houver nenhum elemento ativo. Por exemplo:

element = $('ul#someList').find('li.active, li:first')[0] 

o qual retornará qualquer li com uma classe de ativo ou, se não houver nenhum, apenas retornará o último li.

Ou vai funcionar. Existem penalidades potenciais de desempenho, no entanto, como o || irá parar o processamento assim que encontrar algo, enquanto a abordagem do array tentará encontrar todos os elementos, mesmo que já tenha encontrado um. Então, novamente, usando o || construct poderia ter problemas de desempenho se tivesse que passar por vários seletores antes de encontrar o que ele retornaria, porque ele tem que chamar o objeto jQuery principal para cada um (eu realmente não sei se isso é um acerto de desempenho ou não, parece lógico que poderia ser). Em geral, porém, uso a abordagem de matriz quando o seletor é uma string longa.


Eu escrevi um plugin incrivelmente simples (5 linhas de código) para exatamente essa funcionalidade:

http://byrichardpowell.github.com/jquery-or/

Ele permite que você diga efetivamente "get this element, ou se esse elemento não existir, use este elemento". Por exemplo:

$( '#doesntExist' ).or( '#exists' );

Embora a resposta aceita forneça uma funcionalidade semelhante a esta, se ambos os seletores (antes e depois da vírgula) existirem, ambos os seletores serão retornados.

Espero que seja útil para qualquer pessoa que possa acessar essa página por meio do google.


Usar uma vírgula pode não ser suficiente se você tiver vários objetos jQuery que precisam ser unidos.

O método .add() adiciona os elementos selecionados ao conjunto de resultados:

// classA OR classB
jQuery('.classA').add('.classB');

É mais detalhado do que '.classA, .classB' , mas permite criar seletores mais complexos como o seguinte:

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));




jquery-selectors