2009-10-09 10 views
14

Rozważmy następujący kod html:Jak uzyskać tekst przed danym elementem za pomocą jQuery?

<p> 
    Some text followed by <span>a span element</span> 
    and another text followed by <b>a bold text</b>. 
</p> 

Jak mogę uzyskać tekst przed span i b elementów przy użyciu jQuery?

Próbowałem $("span").prev() i $("b").prev(), ale zadziałało, ponieważ tekst nie jest elementem. Próbowałem też $("span").parent(), ale pasował do całego akapitu, podczas gdy ja chcę tylko jego część.

Czy możesz doradzić jakiekolwiek rozwiązanie? Z góry dziękuję :-)

+0

Dosyć duplikat: http://stackoverflow.com/questions/1017330/extract-the-text-in-a-element- with-ququery – peirix

+3

Nie tak podobne. Tutaj chcę wyodrębnić tylko tekst pojawiający się bezpośrednio przed danym elementem, a nie cały tekst. – czuk

Odpowiedz

21

Jak o zbierając je do tablicy zamiast dwóch wezwań do $:

var texts = $('span, b').map(function(){ 
    return this.previousSibling.nodeValue 
}); 
texts[0]; // "Some text followed by " 
texts[1]; // " and another text followed by " 

Referencje:

+0

Doskonała odpowiedź. Dobrze uzasadniony i powołany. – KyleFarris

+0

Dziękuję za rozwiązanie. Jednak nie mogę sprawić, by działał w tym scenariuszu. 'var c = jQuery ('span');' i późniejszy 'c.previousSibling' zwraca' null', ale 'c.context.previousSibling' jest w porządku. Czemu? – czuk

+0

Mówię, nie używaj tego scenariusza ("c.context"). Użyj kodu w mojej odpowiedzi. –

3

Obawiam się, że do tego celu należy użyć wyrażeń regularnych. W celu uzyskania tekst przed elementu przęsła użyć czegoś takiego:

var txt = $('span').parent().html(); 
var regex = /(.*)<span>/; 
txt = txt.match(regex)[1]; 

modyfikowanie regex, aby dopasować inne części łańcucha, jak również.

+0

+1 pokonałeś mnie! – Jared

+2

To nie zadziała, ponieważ text() nie zwraca żadnego html. Po drugie, nawet jeśli zmienisz go na html(), element docelowy może nie być pierwszym span w rodzicu. – Borgar

+0

To tylko wersja demo, jak to zrobić. Nie ma łatwego sposobu na pozbycie się tego tekstu ze wszystkich oznaczonych treści. Musisz używać wyrażeń regularnych. – RaYell

0

mam wymyślić następujące rozwiązanie:

var c = $("span").context.previousSibling; 
alert(c.data); 

Ale nie jestem pewien, jak bezpieczne jest korzystanie z różnych przeglądarek?

+0

Dlaczego po prostu nie skorzystasz z mojego rozwiązania? Robi to samo, ale bez dostępu do '.context'. –

+0

To jest alternatywne rozwiązanie. Twoje rozwiązanie nie może być używane (nie mogłem) w każdej sytuacji. – czuk

1
var textBefore = $('span')[0].previousSibling.nodeValue; 

Szukałem rozwiązania tego i byłem zdezorientowany, dlaczego musiałem mapować do tablicy. Kontekst nie działa dla mnie. W końcu zorientowałem się, jak to napisać.

To jest najbardziej podstawowe rozwiązanie. Umieszczenie [0] zamienia element na elementNode, który pozwala na wywołanie kodu previousSibling. Nie ma potrzeby wstawiania go do tablicy za pomocą funkcji mapy, chyba że jest to wygodniejsze.

Powiązane problemy