2012-03-05 123 views
0

在给定元素和选择器的情况下,jQuery中有没有一种方法从DOM树的按顺序遍历中选择该元素之前的那个元素的最后一个匹配?jQuery:在指定元素之前选择最后一个匹配

例如,给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树的按顺序遍历时。

+1

我找到真正的HTML更容易阅读这样的伪代码。 – gdoron 2012-03-05 18:46:15

+0

我以前写过一个'realPrev'插件。请参阅:[jQuery .prev()类型,无论它的父母等](http://stackoverflow.com/a/7771241/938089?jquery-prev-of-a-type-regardless-of-its-parent-等等)。在你的情况下,你可以使用:$('#element')。realPrev('。a,#element');' – 2012-03-05 18:46:46

+0

-1因为格式不正确的NOT HTML使得很难确定封闭/在你的例子中的divs。 – 2012-03-05 18:56:57

回答

3

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

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

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

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

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

http://jsfiddle.net/WdsGa/

+0

来想一想,我的答案也很相似。 – Starx 2012-03-05 19:05:03

+0

,无论什么原因,'$ collection.index'在旧的Firefox下不工作(我的猜测是XPCNativeWrappers是相等的),所以我不得不手动做那一点。但仍然非常有帮助。 – rampion 2012-03-05 20:03:39

0

Sortof。这将为兄弟元素就好了工作:

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

但是,您的嵌套div.a不会与该段工作,我不知道的一个有效的方式来解决。它选择与div.a相匹配的第一个元素,然后选择它之后的所有兄弟元素,直到找到与#element匹配的元素,然后获取这些选定元素的最后一个。但是,它只能用于兄弟姐妹。

0

这应该这样做

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

除非我误解了这一点,否则它所做的只是以一种效率较低的方式重现jquery的“last”。 http://api.jquery.com/last/ – 2012-03-05 18:50:32

相关问题