jQuery:获取以前的标记,嵌套问题

时间:2011-04-23 14:32:34

标签: javascript jquery dom

我正试图从$('#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>

我为了获得带有class =“curPos”的前一个span元素而尝试的所有方法似乎都忽略了span-tag,如果它在其他标记内部,如em。

它将简单地忽略嵌套EM标签中的所有内容,而是在EM之前返回之前的curPos。

任何想法,即使它是嵌套的1-n级别,我怎么能得到之前的标签?

- 编辑:

所有这些都包含在一个容器DIV中,如果它永远不会看到这个div之外,我也会更喜欢 - 除了向div / selector之外没有反转。

也许有办法从两个选择器之间提取所有HTML?如果是这样,我可以用正则表达式解决它并插回来吗?

行动中的

脚本:http://jsfiddle.net/H6fvy/(用于键入“光标”的轨道)

3 个答案:

答案 0 :(得分:0)

尝试选择器

Span[class=curPos]

那应该选择该类的所有跨度。

答案 1 :(得分:0)

这很好用:

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

请参阅http://jsfiddle.net/U2ryA/

答案 2 :(得分:0)

是的,prevAll()只检查兄弟姐妹,这样才能理解嵌套的东西是不匹配的。

是否可以将<em>嵌入<span>而不是相反?在我看来,这可能是一个更好的方法,可以更好地将标记更改为更干净地使用脚本,而不是试图强制使用jQuery。

修改: 好的,所以改变标记是行不通的,没关系。实际上这是一个有趣的小问题。这是一个可行的解决方案,但我仍然不禁认为那里有更好的方法。

鉴于您的初始标记

<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;找到匹配就在循环上保释。希望这可以根据您的需要进行修改。祝你好运。