jQuery OF Selector?

Ik vraag me af of er een manier is om “OF”-logica in jQuery-selectors te hebben. Ik weet bijvoorbeeld dat een element ofwel een afstammeling is van een element met klasse classA of classB, en ik wil iets doen als elem.parents('.classA or .classB'). Biedt jQuery dergelijke functionaliteit?


Antwoord 1, autoriteit 100%

Gebruik een komma.

'.classA, .classB'

Je kunt ervoor kiezen om de spatie weg te laten.


Antwoord 2, autoriteit 15%

Het gebruik van een komma is mogelijk niet voldoende als u meerdere jQuery-objecten heeft die moeten worden samengevoegd.

De .add()methode voegt de geselecteerde elementen toe aan de resultatenset:

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

Het is uitgebreider dan '.classA, .classB', maar je kunt complexere selectors bouwen, zoals de volgende:

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

Antwoord 3, autoriteit 4%

Ik heb een ongelooflijk eenvoudige (5 regels code) plug-in geschreven voor precies deze functionaliteit:

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

Het stelt je in staat om effectief te zeggen “haal dit element, of als dat element niet bestaat, gebruik dit element”. Bijvoorbeeld:

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

Hoewel het geaccepteerde antwoord vergelijkbare functionaliteit biedt, worden beide selectors geretourneerd als beide selectors (voor & na de komma) bestaan.

Ik hoop dat het nuttig is voor iedereen die via Google op deze pagina terechtkomt.


Antwoord 4, autoriteit 3%

Als u de standaardconstructie van element = element1 || . wilt gebruiken element2 waar JavaScript de eerste teruggeeft die waarheidsgetrouw is, u zou precies dat kunnen doen:

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

die het eerste element dat daadwerkelijk wordt gevonden zou retourneren. Maar een betere manier zou waarschijnlijk zijn om de kommaconstructie jQuery selector (die een reeks gevonden elementen retourneert) op deze manier te gebruiken:

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

die het eerst gevonden element retourneert.

Ik gebruik dat van tijd tot tijd om een ​​actief element in een lijst te vinden of een standaardelement als er geen actief element is. Bijvoorbeeld:

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

die elke li retourneert met een klasse van actief of, als er geen is, alleen de laatste li retourneert.

Beide zullen werken. Er zijn echter mogelijke prestatiestraffen, aangezien de || zal de verwerking stoppen zodra het iets waarheidsgetrouws vindt, terwijl de array-benadering zal proberen alle elementen te vinden, zelfs als het er al een heeft gevonden. Nogmaals, met behulp van de || construct kan mogelijk prestatieproblemen hebben als het door verschillende selectors moet gaan voordat het degene vindt die het zal retourneren, omdat het voor elk het belangrijkste jQuery-object moet aanroepen (ik weet echt niet of dit een prestatiehit is of niet, het lijkt gewoon logisch dat het zou kunnen zijn). Over het algemeen gebruik ik echter de array-benadering wanneer de selector een vrij lange string is.


Antwoord 5

Eindelijk heb ik een hack gevonden hoe het moet:

div:not(:not(.classA,.classB)) > span

(selecteert div met klasse classAOF classBmet directe onderliggende span)


Antwoord 6

Daniel A. White Solution werkt uitstekend voor lessen.

Ik heb een situatie waarin ik invoervelden moest vinden zoals donee_1_cardwaarbij 1 een index is.

Mijn oplossing is

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

Hoewel ik niet zeker weet hoe optimaal het is.

Other episodes