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

JS獲取子、父、兄節(jié)點方法小結(jié)

 更新時間:2017年08月14日 14:18:46   作者:OkayChen  
這篇文章主要介紹了JS獲取子、父、兄節(jié)點方法總結(jié)及JS獲取兄弟節(jié)點的兩種方法,需要的朋友可以參考下

我們在實際的開發(fā)中,經(jīng)常要獲取頁面中某個html元素,動態(tài)更新元素的樣式、內(nèi)容屬性等。

 我們已經(jīng)知道在JavaScript中提供下面的方法獲取子、父、兄節(jié)點的方法:

  常規(guī)

通過父節(jié)點獲取子節(jié)點:

parentObj.firstChild                                            獲取已知父節(jié)點的第一個子節(jié)點
parentObj.lastChild                                            獲取已知父節(jié)點的最后一個子節(jié)點
parentObj.childNodes                                             獲取已知父節(jié)點的子節(jié)點數(shù)組(這里我在IE 7中獲取的是所有直接的子節(jié)點)
parentObj.children                                                  獲取已知節(jié)點的直接子節(jié)點數(shù)組(在IE7中和childNodes效果一樣)
parentObj.getElementsByTagName(tagName)     返回已知子節(jié)點中類型為指定值的子節(jié)點數(shù)組

通過臨近節(jié)點獲取兄弟節(jié)點:

neighbourNode.previousSibing                              獲取已知節(jié)點的前一個兄弟節(jié)點
neighbourNode.nextSibing                                      獲取已知節(jié)點的下一個兄弟節(jié)點

通過子節(jié)點獲取父節(jié)點:

   1、childNode.parentNode                                             獲取已知節(jié)點的父節(jié)點

上面的方法基本都是可以遞歸是使用的,parentObj.firstChild.firstChild.firstChild...但是這樣的代碼有一種傻傻的趕腳。。

  擴展

在擴展之前,我們需要知道一些關(guān)于節(jié)點基礎(chǔ)的知識:Dom節(jié)點中,每個節(jié)點都擁有不同的類型

     W3C規(guī)范中常用的Dom節(jié)點的類型有以下幾種

節(jié)點類型 說明
元素節(jié)點 每一個HTML標簽都是一個元素節(jié)點 1
屬性節(jié)點 元素節(jié)點(HTML標簽)的屬性,如id,class,name等 2
文本節(jié)點 元素節(jié)點或?qū)傩怨?jié)點中的文本內(nèi)容 3
注釋節(jié)點 便是文檔的注釋,形式如<!--comment Text--> 8
文檔節(jié)點 表示整個文檔(Dom樹的根節(jié)點,即document) 9

   關(guān)于節(jié)點的名稱,不同類型的節(jié)點對應(yīng)不同的名稱

節(jié)點類型 節(jié)點名稱
元素節(jié)點 HTML的名稱(大寫)
屬性節(jié)點 屬性的名稱
文本節(jié)點 它的值永遠的都#text
文檔節(jié)點 它的值永遠都是#document

   可以分別通過nodeType(節(jié)點類型),nodeName(節(jié)點名稱),以及nodeValue(節(jié)點值)分別返回節(jié)點的類型、節(jié)點名稱以及節(jié)點值(比如元素節(jié)點返回1,屬性節(jié)點返回2)

JS獲取兄弟節(jié)點的兩種方法

  方法一:通過父元素的子元素先找到含自己在內(nèi)的“兄弟元素”,然后在剔除自己

function sibling(elem){
 var a = [];
 var b = elem.parentNode.children;
 for (var i = 0 ; i < b.length ; i++){
  if(b[i] !== elem) a.push(b[i]);
 }
 return a;
}

方法二:jQuery中實現(xiàn)方法,先通過查找元素的第一個子元素,然后在不斷往下找下一個緊鄰元素,判斷并剔除自己。

siblings:function(elem)
{
  return JQuery.sibling(elem.parentNode.firstNode,elem);
}
JQuery.sibling = function(n,elem){
  var r = [];
  for (;n;n= n.nextSibling){
  if(n.nodeType == 1 && (!elem || elem != elem))
  r.push(n);
 } 
  return r;
}

在jQuery 1.2多的版本中都可以找到這段代碼,我看的jQuery1.2.3的版本,在1800行可以找到這段代碼:

把這個方法轉(zhuǎn)化為獨立可用的函數(shù):

fucntion sibling(elem){
 var r = [];
 var n = elem.parentNode.firstChild;
 for(;n;n = n.nextSibling) {
  if(n.nodeType === 1 && n !== elem) {
   r.push(n);
  }
 } 
  return r;
}

很顯然通過這種方法查找特定節(jié)點的兄弟元素,可以很方便的避免的使用遞歸的冗余。

獲取所有元素子節(jié)點

  在JavaScript中,可以通過children來獲取所有的子節(jié)點(只返回HTML中,甚至不返回子節(jié)點),幾乎得到了所有瀏覽器的支持,但是在Firefox有的版本中不支持。

  注意:在IE中,children包含注釋節(jié)點

  所以因為特殊情況的存在,有時候我們需要只獲取元素節(jié)點,這樣我們就可以通過nodeType屬性來進行篩選,用上面的知識:nodeType == 1的節(jié)點為元素節(jié)點。

下面,自定義一個函數(shù)來獲取所有的元素子節(jié)點:

var getChildNodes = function(elem) {
 var childArr = elem.children || elem.childNodes, 
   childArrTem = new Array();
  for (var i = 0 ; i < childArr.length; i ++ ) {
   if (childArr[i].nodeType == 1){
   childArrTem.push(childArr[i]); 
  }
 } 
 return childArrTem;
}

獲取所有的父節(jié)點

同樣的,我們可以獲取當前節(jié)點所有的父節(jié)點:

function getParents (elem){
 var parents = [];
 while(elem.parentNode){
  parents.push(elem.parentNode)
  elem = elem.parentNode;
 } 
 return parents;
}

這樣我們可以接受一個dom節(jié)點,最終會獲取到document對象,如果只要獲取到最上層是body,可以把while里的判斷改為:  while(elem.parentNode && elem.parentNode.tagName == 'BODY'

依據(jù)JavaScript中的提供的獲取節(jié)點的方法和相關(guān)的知識,我們可以寫出很多封裝的方法,嘗試一下,你可以寫出多少種獲取節(jié)點的方法呢?

當我們寫出了一些操作節(jié)點的封裝之后在去看jQuery中Dom操作節(jié)點方法的源碼會輕松很多呢。

總結(jié)

以上所述是小編給大家介紹的JS獲取子、父、兄節(jié)點方法小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • js圖片輪播手動切換特效

    js圖片輪播手動切換特效

    這篇文章主要為大家詳細介紹了js圖片輪播手動切換特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 快速對接payjq的個人微信支付接口過程解析

    快速對接payjq的個人微信支付接口過程解析

    這篇文章主要介紹了快速對接payjq的個人微信支付接口過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • JavaScript實現(xiàn)給按鈕加上雙重動作的方法

    JavaScript實現(xiàn)給按鈕加上雙重動作的方法

    這篇文章主要介紹了JavaScript實現(xiàn)給按鈕加上雙重動作的方法,可實現(xiàn)文本框元素值添加及頁面跳轉(zhuǎn)的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 原生JavaScript制作計算器

    原生JavaScript制作計算器

    本文給大家匯總了2個原生JavaScript實現(xiàn)的計算器功能的代碼,一個簡單一個稍微復(fù)雜些,小伙伴們根據(jù)自己的需要來選擇吧
    2016-10-10
  • layer提示框添加多個按鈕選擇的實例

    layer提示框添加多個按鈕選擇的實例

    今天小編就為大家分享一篇layer提示框添加多個按鈕選擇的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 微信小程序?qū)崿F(xiàn)手勢解鎖的示例詳解

    微信小程序?qū)崿F(xiàn)手勢解鎖的示例詳解

    手勢解鎖是生活中常用的解鎖方式,本文將通過微信小程序?qū)崿F(xiàn)手勢解鎖這一功能,本實例以工具的形式可以嵌入到不同的項目之中,感興趣的可以了解一下
    2022-04-04
  • 關(guān)于iframe跨域POST提交的方法示例

    關(guān)于iframe跨域POST提交的方法示例

    這篇文章主要給大家介紹了關(guān)于iframe跨域POST提交的相關(guān)資料,文中給出了詳細的介紹與示例代碼,相信對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以一起來學(xué)習(xí)學(xué)習(xí)。
    2017-01-01
  • JavaScript類型檢測的方法實例教程

    JavaScript類型檢測的方法實例教程

    這篇文章主要給大家介紹了關(guān)于JavaScript類型檢測的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解自定義ajax支持跨域組件封裝

    詳解自定義ajax支持跨域組件封裝

    本篇文章給大家詳細分析了自定義ajax支持跨域組件封裝相關(guān)的知識點,對此有興趣的朋友參考學(xué)習(xí)下。
    2018-02-02
  • 在vs2010中調(diào)試javascript代碼方法

    在vs2010中調(diào)試javascript代碼方法

    只在IE瀏覽器中測試成功了,在谷歌瀏覽中沒有測試成功,其他瀏覽器沒有測試。
    2011-02-02

最新評論

舒兰市| 莱西市| 泸定县| 胶州市| 包头市| 勃利县| 镇雄县| 涞水县| 藁城市| 鄯善县| 霍林郭勒市| 广河县| 墨竹工卡县| 海原县| 井陉县| 昌邑市| 新巴尔虎右旗| 濮阳市| 容城县| 余江县| 明溪县| 东乡族自治县| 罗江县| 湖口县| 丁青县| 铁力市| 比如县| 桂平市| 鄂温| 徐水县| 翁牛特旗| 鹤峰县| 潍坊市| 嘉荫县| 天柱县| 峨山| 景谷| 汨罗市| 都昌县| 阜宁县| 康平县|