最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

從一個(gè)索引序號(hào),很容易得到該索引對(duì)應(yīng)的子節(jié)點(diǎn)或者子元素,直接用parentNode.childNodes[index] 或 parentNode.children[index] 就行。

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

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

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

表格行TR元素有rowIndex屬性。

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

但一般的節(jié)點(diǎn)或元素并沒(méi)有 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)是初始化需要開(kāi)銷,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),沒(méi)有初始化開(kāi)銷。缺點(diǎn)是不適合高頻率調(diào)用。

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

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

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

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

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ù)了:
復(fù)制代碼 代碼如下:

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

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

最后的總結(jié):

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

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

其它情形使用previousElementSibling 或 previousSibling 進(jìn)行遍歷。

compareDocumentPosition 方法的性能非常差。

相關(guān)文章

  • 函數(shù)四種調(diào)用模式以及其中的this指向

    函數(shù)四種調(diào)用模式以及其中的this指向

    本文主要介紹了函數(shù)四種調(diào)用模式以及其中的this指向的相關(guān)知識(shí),具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 微信小程序:數(shù)據(jù)存儲(chǔ)、傳值、取值詳解

    微信小程序:數(shù)據(jù)存儲(chǔ)、傳值、取值詳解

    這篇文章主要介紹了微信小程序:數(shù)據(jù)存儲(chǔ)、傳值、取值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • jfreechart插件將數(shù)據(jù)展示成餅狀圖、柱狀圖和折線圖

    jfreechart插件將數(shù)據(jù)展示成餅狀圖、柱狀圖和折線圖

    閑暇之余,學(xué)習(xí)了一下jfreechart圖表生成,結(jié)合大蝦們的著作,小弟進(jìn)行了系統(tǒng)的總結(jié),真是獲益匪淺,這里推薦給小伙伴們,有需要的朋友可以參考下。
    2015-04-04
  • JS中Symbol類型的介紹與基本用法

    JS中Symbol類型的介紹與基本用法

    Symbol是一種特殊的、不可變的數(shù)據(jù)類型,可以作為對(duì)象屬性的標(biāo)識(shí)符使用,表示獨(dú)一無(wú)二的值,這篇文章主要給大家介紹了關(guān)于JS中Symbol類型的介紹與基本用法的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • JS延遲加載的幾種方式小結(jié)

    JS延遲加載的幾種方式小結(jié)

    JS延遲加載,也就是等頁(yè)面加載完成之后再加載 JavaScript 文件,JS延遲加載有助于提高頁(yè)面加載速度,本文小編給大家介紹了JS延遲加載的幾種方式小結(jié),感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-08-08
  • js實(shí)現(xiàn)select組件的選擇輸入過(guò)濾代碼

    js實(shí)現(xiàn)select組件的選擇輸入過(guò)濾代碼

    如何實(shí)現(xiàn)select組件的選擇輸入過(guò)濾作用,下面有一段js代碼,很實(shí)用,需要的朋友可以看看
    2014-10-10
  • javascript-表格排序(降序/反序)實(shí)現(xiàn)介紹(附圖)

    javascript-表格排序(降序/反序)實(shí)現(xiàn)介紹(附圖)

    使用了Array方法、sort:降序、reverse:反序完成了基本功能,對(duì)于聯(lián)合排序沒(méi)有實(shí)現(xiàn),感興趣的朋友可以參考下哈
    2013-05-05
  • js 下拉菜單實(shí)現(xiàn)代碼

    js 下拉菜單實(shí)現(xiàn)代碼

    js 下拉菜單實(shí)現(xiàn)代碼,原理比較簡(jiǎn)單,需要的朋友可以參考下,具體的美化要靠自己。
    2010-05-05
  • 前端實(shí)現(xiàn)水印功能的幾種方法及優(yōu)缺點(diǎn)

    前端實(shí)現(xiàn)水印功能的幾種方法及優(yōu)缺點(diǎn)

    這篇文章主要介紹了前端開(kāi)發(fā)中實(shí)現(xiàn)網(wǎng)頁(yè)或圖像水印的六種方法,包括使用CSS背景圖、HTML5?Canvas、SVG、圖片處理庫(kù)、HTML?DOM元素以及后端生成,每種方法都有其優(yōu)缺點(diǎn),適用于不同的場(chǎng)景,需要的朋友可以參考下
    2025-01-01
  • JS裝飾者模式和TypeScript裝飾器

    JS裝飾者模式和TypeScript裝飾器

    學(xué)習(xí)的目的是對(duì)裝飾者模式模式有進(jìn)一步的理解,并運(yùn)用在自己的項(xiàng)目中;對(duì)TypeScript裝飾器的理解,更好的使用裝飾器,例如在nodejsweb框架中、vue-property-decorator中,或者是自定義裝飾器,能熟練運(yùn)用并掌握其基本的實(shí)現(xiàn)原理。
    2021-04-04

最新評(píng)論

绥滨县| 尼木县| 黄冈市| 伊金霍洛旗| 易门县| 图们市| 扎赉特旗| 乌苏市| 榆社县| 岗巴县| 乃东县| 互助| 长武县| 壤塘县| 桦南县| 瑞安市| 刚察县| 建阳市| 广宁县| 宣化县| 新郑市| 定边县| 长兴县| 资溪县| 马关县| 华亭县| 宝坻区| 卢龙县| 安仁县| 镇远县| 遂宁市| 中山市| 茶陵县| 井陉县| 珠海市| 宁乡县| 扎兰屯市| 乃东县| 灌南县| 乌拉特后旗| 永寿县|