2016-04-18 8 views
3

Ich arbeite mit einer Seite, die den Preis eines Produkts anzeigt. Normalerweise sieht es wie folgt aus:jQuery Selektor für verschiedene HTML-Struktur

<span id="priceText"> 
    $26.94 
</span> 

Wenn der Artikel zum Verkauf, es sieht dies wie:

<span id="priceText"> 
    <strike>$26.94</strike> 
    <span class="salePrice">$25.00</span> 
</span> 

ich eine generische Funktion haben, die den Preis von jeder Seite extrahiert etwa so:

var getPrice = function(price_id) { 
    return jQuery(price_id).text(); 
}; 

Dabei ist price_id die ID des Elements, das den Preis enthält.

Wie klar ersichtlich ist, wird dies nicht mit der obigen Struktur arbeiten, da die „Verkauf“ -Version beide kehren $ 26,94 und 25,00 $, wenn ich price_id zu priceText gesetzt

Ich habe keine Kontrolle über den HTML-Code auf dem Produkt Seite, also kann ich die Struktur nicht ändern. Ich muss die getPrice Funktion auf anderen Seiten verwenden, die diese HTML-Struktur nicht haben, also will ich auch vermeiden, es zu ändern.

Was ich suche ist eine Art von jQuery Selektor, die $ 25,00 zurückgibt, wenn der Artikel im Verkauf ist, oder $ 26,94, wenn es nicht ist. So etwas wie „Rückkehr der gesamten Textes innerhalb von priceText NICHT in einem Streik-Tag“

ich zur Zeit einen eigenen Schnipsel habe, die machen folgend:

jQuery('#priceText .salePrice').length ? jQuery('#priceText .salePrice').text() : jQuery('#priceText strike').text() 

Allerdings mag ich benutzerdefinierte Code-Zeilen wie diese vermeiden. Ich denke, das ist vielleicht nicht möglich mit nur jQuery Selektoren, aber ich hoffe, jemand beweist mich falsch!

Antwort

3

Sie können eine multiple selector verwenden.

jQuery('#priceText .salePrice, #priceText:not(:has(.salePrice))').text() 

DEMO

+0

oh, das ist eine Sache der Schönheit! lass es mich versuchen, aber ich denke, das ist genau das, was ich gesucht habe – Pabs123

+1

Gute Lösung! Plunker https://plnkr.co/edit/2wNRMNAnywtPcEOuU4ri?p=preview –

+0

das funktionierte großartig, ich hatte nicht gedacht, mehrere Selektoren zu verwenden UND: keine Selektoren zur gleichen Zeit. das macht sehr viel Sinn. Danke! – Pabs123

1

Vielleicht könnten Sie Ihren Zustand durch diese reduzieren:

($('#priceText .salePrice') || $('#priceText strike')).text() 
+0

dies als meine aktuelle Snippet sicherlich besser ist. Die ideale Lösung wäre immer noch eine Art "bedingter" Selektor, aber ich bin mir nicht sicher, ob das wirklich existiert. – Pabs123