亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

高效的獲取當前元素是父元素的第幾個子元素

 更新時間:2013年10月15日 16:46:47   作者:  
例如處理事件的時候,有時候需要知道當前點擊的是第幾個子節(jié)點,而HTML DOM本身并沒有直接提供相應的屬性,需要自己來計算。感興趣的朋友可以了解下本文
例如處理事件的時候,有時候需要知道當前點擊的是第幾個子節(jié)點,而HTML DOM本身并沒有直接提供相應的屬性,需要自己來計算。

從一個索引序號,很容易得到該索引對應的子節(jié)點或者子元素,直接用parentNode.childNodes[index] 或 parentNode.children[index] 就行。

但反過來,已知一個節(jié)點或元素對象,要知道它的索引序號則沒有那么直接了。

一些特殊的元素,HTML DOM有對應的屬性表示其索引序號,主要是表格的TD 和 TR 元素。

表格單元格TD元素有 cellIndex 屬性。

表格行TR元素有rowIndex屬性。

如果你的處理目標剛好就是表格,則優(yōu)先使用這兩個屬性。

但一般的節(jié)點或元素并沒有 childNodeIndex 或者 childElementIndex 之類的屬性。

解決方案主要分為兩類:

一、預先計算并緩存節(jié)點的索引號(可以存在節(jié)點屬性或者js變量中)。

二、實時計算,需要遍歷部分節(jié)點。

應用中,可根據(jù)不同的實際情況,選用上述兩類方案之一。

適用方案一的情形:

當DOM結構不會變化,并且需要頻繁的獲取個別節(jié)點的索引,可采用方案一。

優(yōu)點是后續(xù)讀取快,缺點是初始化需要開銷,DOM結構變化后需要重新初始化。

適用方案二的情形:

DOM結構可能會變化,并且不是特別頻繁的獲取個別節(jié)點的索引,可采用方案二。

優(yōu)點是不受DOM結構變化的影響,不會污染DOM結構,沒有初始化開銷。缺點是不適合高頻率調(diào)用。

一般而言,采用方案二是更好的,因為通常DOM樹規(guī)模是比較有限的,一輪的循環(huán)并不會導致顯著降低整體性能,而其優(yōu)點則是顯著的。

對于IE瀏覽器,則有更直接的方法。

從IE4到IE11,都有sourceIndex屬性,這個屬性表示了元素在DOM樹的順序,比較元素和父元素的sourceIndex的差值就很容易知道元素是第幾個子元素了。

我寫了一段函數(shù)來區(qū)分處理,在IE下采用sourceIndex高效判斷,非IE則采用一般遍歷。
復制代碼 代碼如下:

function getChildrenIndex(ele){
//IE is simplest and fastest
if(ele.sourceIndex){
return ele.sourceIndex - ele.parentNode.sourceIndex - 1;
}
//other browsers
var i=0;
while(ele = ele.previousElementSibling){
i++;
}
return i;
}

上面的函數(shù)只是計算元素Element,也就是nodeType為1的節(jié)點,文本節(jié)點、注釋節(jié)點等將不被統(tǒng)計。如果需要計算所有節(jié)點在內(nèi),則不能適用sourceIndex,因為該屬性只針對Element. previousElementSibling也要相應的改為previousSibling. 那就要寫成如下的函數(shù)了:
復制代碼 代碼如下:

function getNodeIndex(node){
var i=0;
while(ele = ele.previousSibling){
i++;
}
return i;
}

后記:在非IE下,有 compareDocumentPosition 方法用于比較節(jié)點的位置關系,但經(jīng)過測試該方法的性能非常差,其內(nèi)部的實現(xiàn)機制肯定不是像IE那樣緩存了資源索引號的,如果這個方法極高效,那就可采用二分法進行計算,從而提高效率,但目前還不可能。

最后的總結:

對于表格TD和TR元素優(yōu)先使用cellIndex和rowIndex屬性。

對于IE優(yōu)先使用sourceIndex屬性。

其它情形使用previousElementSibling 或 previousSibling 進行遍歷。

compareDocumentPosition 方法的性能非常差。

相關文章

最新評論