jQuery:在指定元素之前选择最后一个匹配项

时间:2012-03-05 18:38:01

标签: javascript jquery dom

在jQuery中是否有一种方法,给定一个元素和一个选择器,从DOM树的有序遍历中选择该元素之前的那个选择器的最后一个匹配?

例如,给定DOM树:

<html>
  <body>
    <div class="a" id="div0" />
    <div>
      <div class="a" id="div1"/>
    </div>
    <div class="b" id="div2"/>
    <div id="element"/>
    <div class="a" id="div3"/>
    <div class="b" id="div4"/>
  </body>
</html>

使用选择器.a和元素#element,您将获得#div1,并使用选择器.b和元素#element,您将获得得到#div2

用例是编写一个GreaseMonkey脚本,以便在不同版本的Firefox中使用一些略有损坏的HTML。我有一个可以在所有版本中找到的元素,但是我想要找到的另一个元素是元素祖先的先前兄弟或者元素祖先的先前兄弟的后代(取决于版本) )。

我真正可以依赖的是,它是在我执行DOM树的有序遍历时我所拥有的元素之前发生的选择器的最后一个匹配。

3 个答案:

答案 0 :(得分:3)

这应该是这样做的,使用你的第一个例子:

var $collection = $(".a, #element");

var eleIndex = $collection.index($("#element"));

var prevEl = $collection.eq(eleIndex - 1);

alert(prevEl.attr("id"));

http://jsfiddle.net/WdsGa/

答案 1 :(得分:0)

Sortof。这对兄弟元素很有用:

$("div.a:first").nextUntil("#element").last();

但是,你的嵌套div.a不适用于那个片段,我不确定解决这个问题的有效方法。它选择与div.a匹配的第一个元素,然后选择其后的所有兄弟元素,直到找到与#element匹配的元素,然后获取最后一个选定的元素。但是,同样,它只适用于兄弟姐妹。

答案 2 :(得分:0)

这应该这样做

var last = $(".a, #element").eq($(".a, #element").length-1);