例如處理事件的時候,有時候需要知道目前點擊的是第幾個子節點,而HTML DOM本身並沒有直接提供對應的屬性,需要自己來計算。
從一個索引序號,很容易得到該索引對應的子節點或子元素,直接用parentNode.childNodes[index] 或 parentNode.children[index] 就行。
但反過來,已知一個節點或元素對象,要知道它的索引序號則沒有那麼直接了。
一些特殊的元素,HTML DOM有對應的屬性表示其索引序號,主要是表格的TD 和 TR 元素。
表格儲存格TD元素有 cellIndex 屬性。
表格行TR元素有rowIndex屬性。
如果你的處理目標剛好就是表格,則優先使用這兩個屬性。
但一般的節點或元素並沒有 childNodeIndex 或 childElementIndex 之類的屬性。
解決方案主要分為兩類:
一、預先計算並快取節點的索引號(可以存在節點屬性或js變數中)。
二、即時計算,需要遍歷部分節點。
應用中,可依不同的實際情況,選用上述兩類方案之一。
適用方案一的情形:
當DOM結構不會變化,並且需要頻繁的獲取個別節點的索引,可採用方案一。
優點是後續讀取快,缺點是初始化需要開銷,DOM結構變化後需要重新初始化。
適用方案二的情形:
DOM結構可能會變化,並且不是特別頻繁的獲取個別節點的索引,可採用方案二。
優點是不受DOM結構變化的影響,不會污染DOM結構,沒有初始化開銷。缺點是不適合高頻率呼叫。
一般而言,採用方案二是更好的,因為通常DOM樹規模是比較有限的,一輪的循環並不會導致顯著降低整體性能,而其優點則是顯著的。
對於IE瀏覽器,則有更直接的方法。
從IE4到IE11,都有sourceIndex屬性,這個屬性表示了元素在DOM樹的順序,比較元素和父元素的sourceIndex的差就很容易知道元素是第幾個子元素了。
我寫了一段函數來區分處理,在IE下採用sourceIndex高效判斷,非IE則採用一般遍歷。