DOM节点关系

定义

  节点中的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱。

属性  

【nodeType、nodeName、nodeValue】

  每个节点都有这三个属性,且节点类型不同,这三个属性的值不同。对于元素节点来说,nodeType的值为1,nodeName保存的始终都是元素的全大小标签名,而nodeValue的值则始终是null

<div class="box" id="box"></div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.nodeType,oBox.nodeName,oBox.nodeValue);//1 DIV null
</script>

【parentNode】

  每个节点都有一个parentNode属性,该属性指向文档树中的父节点

<div class="box" id="box" style ="background-color: red; height: 100px; width: 100px"></div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.parentNode.nodeName);//BODY
</script>

【childNodes】(只计算第一层子节点)

  每个节点都有一个childNodes属性,其中保存着一个NodeList对象。

  【补充】NodeList

    【1】NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点。NodeList对象的独特之处在于它实际上是基于DOM结构动态执行查询的结果,因此DOM结构的变化能够自动反映在NodeList对象中,可以通过方括号[],也可以通过item()方法来访问保存在NodeList中的节点

<div class="box" id="box" style ="background-color: red; height: 100px; width: 100px">
    <ul class="list">
        <li class="in"></li>
        <li class="in"></li>
    </ul>
</div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.childNodes.length);//3,在IE8-浏览器返回1,因为不包含空白文本节点
oBox.removeChild(oBox.childNodes.item(0));
console.log(oBox.childNodes.length);//2,在IE8-浏览器返回0,因为不包含空白文本节点
</script>

    【2】可以使用Array.prototype.slice.call()方法将NodeList对象转换为数组对象

<div class="box" id="box"></div>
<script>
var oBox = document.getElementById(‘box‘);
var arrayOfNodes = Array.prototype.slice.call(oBox.childNodes)
console.log(oBox.childNodes.constructor)//NodeList() { [native code] }
console.log(arrayOfNodes.constructor)//Array() { [native code] }
</script>

      [注意]但在IE8-下报错,因为IE8-将NodeList实现为一个COM对象,不能使用Array.prototype.slice()方法。下面是兼容写法: 

var oBox = document.getElementById(‘box‘);
function convertToArray(nodes){
    var array = null;
    try{
        array = Array.prototype.slice.call(oBox.childNodes)
    }catch(ex){
        array = [];
        var len = nodes.length;
        for(var i = 0; i < len; i++){
            array.push(nodes[i]);
        }
    }
    return array;
}
console.log(convertToArray(oBox.childNodes));    

【children】(全兼容,只计算第一层子节点)

  这个属性是HTMLCollection的实例,只包含元素中同样还是元素的子节点

<div class="box" id="box">
    <!--  注释 -->
    <ul class="list">
        <li class="in"></li>
        <li class="in"></li>
    </ul>
</div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.children.length);//1,在IE8-浏览器下为2,因为还会包括注释节点
</script>    

【previousSibling、previousElementSibling】
  previousSibling:同一节点列表中的前一个节点
  previousElementSibling:同一节点列表中的前一个元素节点(IE8-浏览器不支持)

【nextSibling、nextElementSibling】
  nextSibling:同一节点列表中的后一个节点
  nextElementSibling:同一节点列表中的后一个元素节点(IE8-浏览器不支持)

【firstChild、firstElementChild】
  firstChild:节点列表中的第一个子节点
  firstElementChild:节点列表中的第一个元素子节点

【lastChild、lastElementChild】
  lastChild:节点列表中的最后一个子节点
  lastElementChild:节点列表中的最后一个元素子节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in" id="test">2</li>
    <li class="in">3</li>
</ul>
</div>
<script>
var oTest = document.getElementById(‘test‘);
console.log(oTest.previousSibling.nodeName);//#text,但在IE8-浏览器下返回LI,因为不包含空白文本节点
console.log(oTest.previousElementSibling.nodeName);//LI,但在IE8-浏览器下报错
console.log(oTest.nextSibling.nodeName);//#text,但在IE8-浏览器下返回LI,因为不包含空白文本节点
console.log(oTest.nextElementSibling.nodeName);//LI,但在IE8-浏览器下报错

var oList = document.getElementById(‘list‘);
console.log(oList.firstChild.nodeName);//#text,但在IE8-浏览器下返回LI,因为不包含空白文本节点
console.log(oList.firstElementChild.nodeName);//LI,但在IE8-浏览器下报错
console.log(oList.lastChild.nodeName);//#text,但在IE8-浏览器下返回LI,因为不包含空白文本节点
console.log(oList.lastElementChild.nodeName);//LI,但在IE8-浏览器下报错
</script>
</body>
</html>

【childElementCount】(IE8-浏览器不支持)(只包含第一层子元素)

  childElementCount返回子元素(不包括文本节点和注释)的个数

<div class="box" id="box">
    <ul class="list">
        <li class="in"></li>
        <li class="in"></li>
    </ul>
</div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.childElementCount);//1
</script>

【ownerDocument】

  所有节点都有一个ownerDocument的属性,指向表示整个文档的文档节点

<div class="box" id="box"></div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.ownerDocument.nodeName);//#document
</script>

方法

【hasChildNodes()】(全兼容)

  hasChildNodes()方法在包含一个或多个节点时返回true,比查询childNodes列表的length属性更简单

<div class="box" id="box">
    <ul class="list">
        <li class="in"></li>
    </ul>
</div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.hasChildNodes());//true
</script>

【contains()】(只要是后代即可,不一定是第一级子元素)

  contains()方法接收一个参数,即要检测的后代节点,如果是则返回true,如果不是则返回false

    [注意]IE和safari不支持document.contains()方法,只支持元素节点的contains()方法

<div class="box" id="box"></div>
<script>
//在IE和safari中报错,在其他浏览器中返回true
console.log(document.contains(document.getElementById("box")))
</script>

【compareDocumentPostion()】(IE8-浏览器不支持)

  compareDocumentPostion()方法能够确定节点间的关系,返回一个表示该关系的位掩码

<div class="box" id="box"></div>
<script>
//因为document包含box,所以为16;而又在box之前,所以为4,两者相加为20
var result = document.compareDocumentPosition(document.getElementById("box"));
console.log(result);//20
//通过按位与,说明20是由16+4组成的,所以box被包含在document中
console.log(result & 16);//16
</script>    
时间: 2024-08-22 14:47:15

DOM节点关系的相关文章

javascript学习笔记:DOM节点关系和操作

0x01:前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构.节点分为12种不同类型,每种类型分别表示文档中不同的信息及标记.每个节点都拥有各自的特点.数据和方法,也与其他节点存在某种关系.节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构.本文将详细描述DOM间的节点关系和基础的DOM操作.节点中的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱.接下来,将把DOM节点关系分为属性和方法两部分进行详细说明. 0x02:属性 父级属性par

jacascript DOM节点——节点关系与操作

前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 节点关系 DOM可以将任何HTML描绘成一个由多层节点构成的结构.每个节点都拥有各自的特点.数据和方法,也与其他节点存在某种关系.节点之间的关系构成了层次,而所有页面标签则表现为一个以特定节点为根节点的树形结构,也就是DOM树.下图为各节点之间的关系: 父级属性 parentNode 和 parentElement 每个节点都有一个 parentNode 属性,该属性指向文档树中的父节点.对于一个节点来

深入理解DOM节点操作

× 目录 [1]创建节点 [2]插入节点 [3]移除节点[4]替换节点[5]复制节点 前面的话 一般地,提起操作会想到“增删改查”这四个字,而DOM节点操作也类似地对应于此,接下来将详细介绍DOM的节点操作方法 前提 DOM提供节点操作的方法是因为DOM节点关系指针都是只读的 下列代码中想通过修改myUl的父级节点来修改其节点关系,但由于parentNode属性是只读的,所以修改无效,在IE8-浏览器下甚至会报错 <div id="myDiv"></div> &

JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结

JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode    父节点 childNodes    子节点 firstChild    父节点里的第一个子节点 lastChild     父节点里的最后一个子节点 nextSibling    与子节点并列的下一个兄弟节点 previousSibling   与子节点并列的上一个兄弟节点 火狐与谷歌支持而ie8不支持的节点关系有: previous

Day53:DOM对象(节点关系、查找、操作)

一.DOM对象 1.什么是HTML DOM HTML  Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML 文档呈现为带有元素.属性和文本的树结构(节点树) 2.DOM树          画dom树是为了展示文档中各个对象之间的关系,用于对象的导航. 3.DOM节点 3.1 节点类型: HTML 文档中的每个成分都是一个节点. DOM 是这样规定的:    整个文档是一个文档节点 .(docume

jQuery DOM 节点操作

DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面中的元素结构就是通过这种节点模型来互相对应着的,我们只需要通过这些节点关系,可以创建.插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. $('div').append('<strong>节点</strong>'); //向 div 内部插入 strong 节点 $('di

DOM 节点操作

DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面中的元 素结构就是通过这种节点模型来互相对应着的,我们只需要通过这些节点关系,可以创建. 插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. //创建一个节点  var box=$('<div id="box">节点</div>'); //将节点插入到&

DOM节点操作方法

只读的关系指针 DOM中的关系指针都是只读的 <div class="box" id="box"></div> <script> var oBox = document.getElementById('box'); console.log(oBox.parentNode.nodeName);//BODY //在IE8-浏览器下会报错,在其他浏览器下忽略此条语句 oBox.parentNode = document; console

HTML DOM 节点

在 HTML DOM 中,所有事物都是节点.DOM 是被视为节点树的 HTML. DOM 节点 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 每个 HTML 元素是元素节点 HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点 注释是注释节点 整个html文档也可以看作是一个节点,一个根节点,一个文档节点,document 节点 HTML 文档是由 HTML 元素定义的. 每个 HTML 元素是元素节点,什么是HTML 元素?