jQuery: получить предыдущий тег, проблема с вложением - PullRequest
0 голосов
/ 23 апреля 2011

Я пытаюсь получить предыдущий тег из $ ('# marker'). PrevAll ("span.curPos: eq (1)");

Проблема в том, что HTML может выглядеть так:

<span class="curPos">some text</span><em><span class="curPos">more</span></em>
<div id="marker">bla</div>
<span class="curPos">... text</span>

И все методы, которые я пробовал, чтобы получить предыдущий элемент span с class = "curPos", похоже, игнорируют тег span, если он находится внутри другого тега, такого как em.

Он просто игнорирует все, что находится во вложенном теге EM, и вместо этого возвращает предыдущие значения curPos до EM.

Есть идеи, как получить предыдущий тег, даже если он вложен в 1-n уровни?

- Редактирование:

все это упаковано в контейнер DIV, я бы также предпочел, чтобы он никогда не смотрел за пределы этого div - не возвращался назад дальше, чем к этому div / selector.

может быть, есть способ извлечь весь HTML из двух селекторов? если так, я мог бы решить это с помощью регулярных выражений и вставить обратно?

скрипт в действии: http://jsfiddle.net/H6fvy/ (используется для ключевой дорожки «курсора»)

Ответы [ 3 ]

0 голосов
/ 23 апреля 2011

Это работало нормально:

$('#marker').prev().css("background", "yellow")

см. http://jsfiddle.net/U2ryA/

0 голосов
/ 23 апреля 2011

Да, 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; Надеюсь, это можно изменить в соответствии с вашими потребностями.Желаем удачи.

0 голосов
/ 23 апреля 2011

Попробуйте селектор

Span[class=curPos]

Это должно выбрать все промежутки с этим классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...