亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 21:53:22
字體:
來源:轉載
供稿:網友
例如處理事件的時候,有時候需要知道當前點擊的是第幾個子節點,而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則采用一般遍歷。
復制代碼 代碼如下:

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;
}

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

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

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

最后的總結:

對于表格TD和TR元素優先使用cellIndex和rowIndex屬性。

對于IE優先使用sourceIndex屬性。

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

compareDocumentPosition 方法的性能非常差。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线国产精品视频| 欧美肥婆姓交大片| 97视频在线播放| 欧美电影在线观看网站| 国产一区二区三区在线观看网站| 日本不卡视频在线播放| 久久亚洲国产成人| 久久精品国产91精品亚洲| 91av在线免费观看视频| 国产日韩综合一区二区性色av| 欧美成aaa人片在线观看蜜臀| 国产美女久久久| 另类图片亚洲另类| 在线视频日韩精品| 亚洲第一二三四五区| 国产男女猛烈无遮挡91| 国产成人精品电影久久久| 欧美激情精品久久久久久久变态| 欧美精品18videos性欧美| 久久精品小视频| 亚洲人成电影网站色www| 97不卡在线视频| 亚洲福利视频久久| 热久久免费视频精品| 在线播放国产一区二区三区| 日韩毛片中文字幕| 国产精品影院在线观看| 亚洲视频在线视频| 亚洲国产又黄又爽女人高潮的| 97在线视频免费| 日韩在线国产精品| 日韩中文字幕在线精品| 国产成人综合久久| 久热精品视频在线观看一区| 亚洲一级黄色av| 国产日韩换脸av一区在线观看| 综合网日日天干夜夜久久| 久热精品视频在线观看| 亚洲精品之草原avav久久| 欧美限制级电影在线观看| 欧美日韩中文字幕| 亚洲国产免费av| 精品电影在线观看| 欧美成人精品h版在线观看| 精品国产网站地址| 成人黄色大片在线免费观看| 上原亚衣av一区二区三区| 国产精品高潮呻吟久久av黑人| 美日韩丰满少妇在线观看| 亚洲国产精品福利| 日韩精品视频免费| 国产成人精品午夜| 亚洲精品永久免费精品| 国产+人+亚洲| 日韩中文av在线| 清纯唯美日韩制服另类| 欧美国产激情18| 欧美日韩国内自拍| 精品国产拍在线观看| 亚洲国产婷婷香蕉久久久久久| 亚洲成在人线av| 久久影院免费观看| 91精品国产99| 久热国产精品视频| 亚洲精品国产suv| 亚洲一区二区久久| 情事1991在线| 在线视频日韩精品| 亚洲精品第一国产综合精品| 国内精品久久久| 精品国产网站地址| 亚洲男人天堂九九视频| 日韩精品在线第一页| 最新69国产成人精品视频免费| 国产精品永久在线| 95av在线视频| 中文字幕在线观看亚洲| 91精品久久久久久久久久入口| 中文字幕成人精品久久不卡| 欧美日韩国产精品一区| 精品在线欧美视频| 国产中文字幕亚洲| 2018中文字幕一区二区三区| 懂色av影视一区二区三区| 日本欧美中文字幕| 亚洲aⅴ男人的天堂在线观看| 色诱女教师一区二区三区| 97av在线影院| 国产精品无av码在线观看| 国产剧情日韩欧美| 国产在线视频不卡| 日韩精品极品在线观看| 成人精品视频在线| 在线观看国产精品日韩av| 亚洲第一男人av| 欧美一区二三区| 久久福利网址导航| 伊人精品在线观看| 中文字幕在线观看亚洲| 亚洲视频在线观看免费| 热久久这里只有精品| 69久久夜色精品国产7777| xvideos亚洲| 亚洲无av在线中文字幕| 国产精品免费视频久久久| 国产免费观看久久黄| 久久久免费电影| 国产精品69久久久久| 欧美日韩中文字幕在线视频| 中文字幕不卡av| 日韩一级黄色av| 日韩中文娱乐网| 国产欧美一区二区三区久久| 亚洲精品成a人在线观看| 久久久久久久久久久免费精品| 亚洲黄色有码视频| 日韩精品免费观看| 国产福利视频一区二区| 91国产美女视频| 亚洲免费精彩视频| 日韩中文综合网| 亚洲风情亚aⅴ在线发布| 久久躁日日躁aaaaxxxx| 国产suv精品一区二区| 欧美性猛交xxxx富婆| 国产精品久久av| 亚洲女人初尝黑人巨大| 欧美电影免费在线观看| 欧美国产视频一区二区| 国产精品美女久久久久久免费| 亚洲另类图片色| 在线观看日韩欧美| 亚洲精品电影网| 亚州欧美日韩中文视频| 午夜精品久久久久久久白皮肤| 欲色天天网综合久久| 欧美特级www| 日本欧美爱爱爱| 亚洲福利在线播放| 欧美日韩国内自拍| 欧美性精品220| 91精品在线播放| 黄色一区二区在线观看| 久久人人97超碰精品888| 亚洲天堂成人在线| 久久久99久久精品女同性| 亚洲区bt下载| 成年无码av片在线| 国产精品爽爽ⅴa在线观看| 日韩精品视频观看| 国产91在线高潮白浆在线观看| 国产日韩欧美中文| 欧美精品少妇videofree| 久久伊人色综合| 亚洲性生活视频在线观看| 精品高清一区二区三区| 日本免费久久高清视频| 亚洲欧洲国产精品| 国产在线久久久| 欧美精品第一页在线播放| 91av视频在线播放| 欧美精品久久久久a| 国产日本欧美一区二区三区| 欧美成人中文字幕在线|