2011-04-16 178 views
26

在div中,具有屬性move_id的元素(不一定是第二代)。:如何獲取第一個並獲取最後一個元素?在dom中使用什麼遍歷順序?

首先,想取集的第一個和最後一個元素

試圖獲得第一個和最後通過的最直接的方法:

var first = div.querySelector('[move_id]:first'); 
var last = div.querySelector('[move_id]:last'); 

這個炸彈是因爲:第一,:最後是一廂情願的想法對我(?)部分

不能使用的querySelectorAll陣列方法,因爲NodeList不是數組:

var first = (div.querySelectorAll('[move_id]'))[0]; 
var last = (div.querySelectorAll('[move_id'])).pop(); 

這個炸彈,因爲NodeList沒有辦法pop()

(是的,我們可以可以在節點列表的頂部使用Array方法:

var first = div.querySelector('[move_id]'); 
var last = Array.prototype.pop.call(div.querySelectorAll('[move_id'])); 

這個工作的,是我現在使用什麼,但認爲必須有更直接的東西,我只是缺少)

其次,需要驗證的元素是按照http://en.wikipedia.org/wiki/Tree_traversal

前置或深度優先遍歷

回答

39

要訪問第一個和最後一個元素,請嘗試。

var nodes = div.querySelectorAll('[move_id]'); 
var first = nodes[0]; 
var last = nodes[nodes.length- 1]; 

爲了健壯性,請添加索引檢查。

是的,節點的順序是預先深度優先。 DOM的document order被定義爲,

有一個順序,文檔順序,所有的文件中對應於其中每一個節點的XML表示的第一個字符在的XML表示發生順序的節點上限定的一般實體擴展後的文件。因此,文檔元素節點將成爲第一個節點。元素節點出現在他們的子女面前因此,文檔順序命令元素節點按XML中的起始標籤的出現順序(在擴展實體之後)。元素的屬性節點發生在元素之後,並在其子元素之前。屬性節點的相對順序依賴於實現。

+0

再穿越 - 感謝 - 我很佩服那些誰能夠記住並找到支持doc對於這些問題 – 2011-04-16 07:18:10

+0

但對於代碼,對於我自己的審美意識,更喜歡我的解決方案:它不需要聲明節點變量例如,但這僅僅是個人喜好。我所希望的是,有一些正確的用法:第一次和最後一次我錯過了。 – 2011-04-16 07:22:41

40

:last不是css規範的一部分,這是jQuery特有的。

你應該尋找last-child

var first = div.querySelector('[move_id]:first-child'); 
var last = div.querySelector('[move_id]:last-child'); 
+0

不錯,當我們想要最後一個div時不需要使用querySelectorAll。除了它只在最後一個子節點具有屬性[move_id]時才起作用,否則它將返回null,並且需要再次使用querySelectorAll。 – 2013-03-25 12:55:45

+9

':最後一個孩子'和':第一個孩子'與父元素有關,而不是列表!這意味着可能有幾個第一個孩子和幾個最後孩子,這不是要求的。 請看這裏:http://jsfiddle.net/r61tcvc3/ – oriadam 2015-11-10 09:35:55

+0

:最後和:最後一個孩子是不一樣的。它可以給你相同的結果,但它取決於html結構。 – 2018-03-08 09:34:42

1

例得到最後輸入元素:

document.querySelector(".groups-container >div:last-child input")

相關問題