Как получить текст перед данным элементом с помощью jQuery?

Рассмотрим следующий html-код:

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

Как я могу получить текст перед элементами span и b с помощью jQuery?

Я пробовал $("span").prev() и $("b").prev(), но он работал, потому что текст не является элементом. Я также пробовал $("span").parent(), но он соответствовал целым абзацем, в то время как я хочу только его часть.

Не могли бы вы посоветовать какое-либо решение? Заранее спасибо: -)

Ответы

Ответ 1

Как собирать их в массив вместо двух вызовов $:

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

Литература:

Ответ 2

Я боюсь, вам нужно будет использовать для этого регулярные выражения. Чтобы получить текст перед элементом span, используйте что-то вроде этого:

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

Измените регулярное выражение так же, как и другие части строки.

Ответ 3

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

Я искал решение этого вопроса и был смущен, почему мне нужно было сопоставить массив. Контекст не работал у меня. Я наконец понял, как это записать.

Это самое основное решение. Помещение [0] преобразует элемент в элементNode, что позволяет вам вызвать предыдущий код. Нет необходимости помещать его в массив, используя функцию карты, если это не удобно.

Ответ 4

У меня появилось следующее решение:

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

Но я не уверен, насколько это безопасно при использовании разных браузеров?