2012-03-05 126 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

相關問題