Да, prevAll()
проверяет только братьев и сестер, поэтому имеет смысл, что все вложенное не соответствует.
Возможно ли встраивать <em>
в <span>
, а не наоборот?Это кажется мне случаем, когда было бы лучше изменить разметку, чтобы более аккуратно работать с вашими сценариями, а не пытаться форсировать jQuery.
EDIT : Хорошо, изменитеразметка не будет работать, это нормально.Это небольшая интересная проблема на самом деле.Вот решение, которое будет работать, но я все еще не могу не думать, что есть лучший подход.
Учитывая вашу начальную разметку
<span class="curPos">some text</span>
<em><span class="curPos">more</span></em>
<div id="marker">bla</div>
Этот скрипт выберет предыдущий шкафэлемент, независимо от вложенности
<script type="text/javascript">
$(function () {
$('#marker').prevAll().each(function () {
console.log('Looping...');
var $this = $(this);
var matchedText;
if ($this.hasClass('curPos')) {
matchedText = $this.text();
}
else {
var nested = $this.find('.curPos');
if (nested)
matchedText = nested.text();
}
if (matchedText) {
console.log(matchedText);
return false;
}
});
});
</script>
У меня есть вход в систему, чтобы показать, что он делает то, что должен.Он просматривает все предыдущие элементы, используя each()
, но запускает цикл, как только находит совпадение, используя return false;
Надеюсь, это можно изменить в соответствии с вашими потребностями.Желаем удачи.