国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

高效的獲取當(dāng)前元素是父元素的第幾個(gè)子元素

2024-05-06 15:46:23
字體:
供稿:網(wǎng)友

JS開發(fā)中,我們可以通過ID找到子元素,然后獲取子元素對(duì)象,并通過parentnode屬性獲取父元素對(duì)象,下面是錯(cuò)新技術(shù)頻道小編帶給大家的高效的獲取當(dāng)前元素是父元素的第幾個(gè)子元素。
從一個(gè)索引序號(hào),很容易得到該索引對(duì)應(yīng)的子節(jié)點(diǎn)或者子元素,直接用parentNode.childNodes[index] 或 parentNode.children[index] 就行。

但反過來,已知一個(gè)節(jié)點(diǎn)或元素對(duì)象,要知道它的索引序號(hào)則沒有那么直接了。

一些特殊的元素,HTML DOM有對(duì)應(yīng)的屬性表示其索引序號(hào),主要是表格的TD 和 TR 元素。

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

表格行TR元素有rowIndex屬性。

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

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

解決方案主要分為兩類:

一、預(yù)先計(jì)算并緩存節(jié)點(diǎn)的索引號(hào)(可以存在節(jié)點(diǎn)屬性或者js變量中)。

二、實(shí)時(shí)計(jì)算,需要遍歷部分節(jié)點(diǎn)。

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

適用方案一的情形:

當(dāng)DOM結(jié)構(gòu)不會(huì)變化,并且需要頻繁的獲取個(gè)別節(jié)點(diǎn)的索引,可采用方案一。

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

適用方案二的情形:

DOM結(jié)構(gòu)可能會(huì)變化,并且不是特別頻繁的獲取個(gè)別節(jié)點(diǎn)的索引,可采用方案二。

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

一般而言,采用方案二是更好的,因?yàn)橥ǔOM樹規(guī)模是比較有限的,一輪的循環(huán)并不會(huì)導(dǎo)致顯著降低整體性能,而其優(yōu)點(diǎn)則是顯著的。

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

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

我寫了一段函數(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ù)只是計(jì)算元素Element,也就是nodeType為1的節(jié)點(diǎn),文本節(jié)點(diǎn)、注釋節(jié)點(diǎn)等將不被統(tǒng)計(jì)。如果需要計(jì)算所有節(jié)點(diǎn)在內(nèi),則不能適用sourceIndex,因?yàn)樵搶傩灾会槍?duì)Element. previousElementSibling也要相應(yīng)的改為previousSibling. 那就要寫成如下的函數(shù)了:

?

?

?


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


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

以上就是關(guān)于高效的獲取當(dāng)前元素是父元素的第幾個(gè)子元素,當(dāng)然除了本文介紹的知識(shí)之外,錯(cuò)新技術(shù)頻道還整理了更多知識(shí),請(qǐng)繼續(xù)關(guān)注js.VeVb.com。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 峨眉山市| 贺州市| 遵义市| 高唐县| 益阳市| 洪江市| 济阳县| 汝南县| 巴马| 高邮市| 忻城县| 年辖:市辖区| 安吉县| 六盘水市| 奈曼旗| 巨鹿县| 呼和浩特市| 炎陵县| 石景山区| 海晏县| 五寨县| 连平县| 南漳县| 祁阳县| 黎平县| 长子县| 上虞市| 凭祥市| 旺苍县| 南溪县| 秀山| 香格里拉县| 鄢陵县| 沙坪坝区| 夏津县| 绿春县| 塘沽区| 吴忠市| 庆元县| 江山市| 扶绥县|