我正试图从$('#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/(用于键入“光标”的轨道)
答案 0 :(得分:0)
尝试选择器
Span[class=curPos]
那应该选择该类的所有跨度。
答案 1 :(得分:0)
答案 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;
找到匹配就在循环上保释。希望这可以根据您的需要进行修改。祝你好运。