Javascript中的DOM(一) DOM树和节点

Myth丶恋晨 2022-01-09 16:55 474阅读 0赞

DOM是DOM是Document Object Model的简称,中文叫文档对象模型,是针对HTML和XML文档的一个API。是中立于平台和语言的接口,它允许Javascript动态地访问和更新文档的内容、结构和样式。

Javascript包括核心(ECMAScript)和宿主环境提供的API,Web浏览器是Javascript很重要的宿主环境,
其中DOM就是浏览器提供的很重要的一个API,它定义了访问HTML文档对象的一套属性、方法和事件,web浏览器允许javascript通过DOM实现对HTML和XML文档的操作。
简单的说,通过DOM,Javascript能够对网页进行操作,来实现网页的交互性。

当网页被加载时,浏览器会创建页面的DOM文档对象模型(DOM属于浏览器), DOM将 web 页面与JavaScript连接起来。在浏览器中,Document 对象表示整个 HTML 文档,通过Document 对象可以使我们从脚本中对HTML页面中的所有元素进行访问。

DOM树和节点

DOM模型用一个逻辑树来表示一个文档,整个文档本身是一个节点(根节点),树的每个分支(html元素)都是一个元素节点,html元素的属性是属性节点,html元素的文本是文本节点,文档中的注释是注释节点,而每个节点都是对象。
DOM提供的方法让我们可以操作这个树,可以改变文档的结构、样式或者内容。

在这里插入图片描述
通过这张图我们可以看到,DOM树和家谱类似,除了根节点,所有的节点都有父节点,一个节点可拥有任意数量的子节点。
根据家谱的特点相信很容易明确这几个概念,祖先节点,父节点,子节点,子孙节点,同胞节点(兄弟节点)。

DOM节点类型

在DOM中一切都是Node对象,如果我们查看Node类的原型你会看到:
在这里插入图片描述
这些属性会被DOM中的每个节点继承,其中的属性nodeType代表着节点的类型。

共有12种DOM节点类型,重点介绍以下几种




































nodeType 类型 说明
1 ELEMENT_NODE 元素节点
2 ATTRIBUTE_NODE 属性节点,相当于元素的attributes属性中的节点
3 TEXT_NODE 文本节点
8 COMMENT_NODE 注释节点,表示HTML文档中的注释
9 DOCUMENT_NODE Document节点,代表是整个文档,它是DOM的根节点
  1. <button id="btn">按钮<!--按钮的注释--></button>
  2. <script type="text/javascript"> console.dir(document); //打印根节点 var btn = document.getElementById('btn'); //获取元素节点 console.dir(btn); var attrNode = btn.getAttributeNode('id'); //获取属性节点 console.dir(attrNode); var textNode = btn.childNodes[0]; //获取文本节点 console.dir(textNode); var commentNode = btn.childNodes[1]; //获取注释节点 console.dir(commentNode); </script>

在控制台中能看到打印出5个不同种类的节点对象
在这里插入图片描述
查看这些对象的原型链,对DOM模型可能会有更深刻的理解

根节点(document):HTMLDocument —> Document —> Node —> EventTarget —> Object
元素节点(button):HTMLButtonElement —> HTMLElement —> Element —> Node —> EventTarget -> Object
属性节点(id):Attr —> Node—> EventTarget —> Object
文本节点:Text —> CharacterData —> Node —> EventTarget —> Object
注释节点:Comment —> CharacterData —> Node—> EventTarget —> Object

实际上在DOM中的对象都继承Node对象。

节点的通用属性

节点的属性非常多,这里只列出一些通用的属性
使用下面的代码验证节点属性

  1. <div class="container">
  2. <h1>我的标题</h1>
  3. <p id="intro" class="ellipsis" style="font-size: 14px;color: red">这是一段<strong>文字</strong></p>
  4. <p>另一段文字</p>
  5. </div>

在Javascript中通过document.getElementById(),可以获取一个节点,通过这个节点来查看节点的属性

  1. var intro=document.getElementById('intro');

在css中设置样式

  1. ::-webkit-scrollbar { width: 10px; height: 10px; }
  2. #intro{
  3. box-sizing: border-box;
  4. width:300px;
  5. height: 200px;
  6. padding: 10px;
  7. margin: 20px;
  8. border: 1px solid blue;
  9. overflow-x: hidden;
  10. overflow-y: scroll;
  11. }

为了方便记忆,按照用途简单的进行了分类:

1、关于节点信息相关的属性






































属性 说明
nodeName 返回节点的大写字母标签名
nodeType 返回结点的节点类型,1表示元素节点 2表示属性节点…
nodeValue 返回节点的value值,元素节点的该值为null
id 设置或返回元素的 id。
className 设置或者 返回元素的类名
tagName 返回元素的标签名(大写)
style 设置或返回元素的样式属性

在这里插入图片描述
2、返回文本和属性






















属性 说明
innerHTML 设置或者返回元素的内容,可包含节点中的子标签以及内容
innerText 设置或者返回元素的内容,不包含节点中的子标签以及内容
attributes 返回元素属性的 NamedNodeMap。

在这里插入图片描述

3、返回父、子、兄弟节点










































属性 说明
childNodes 返回元素的子节点的NodeList对象,NodeList是类似数组的对象。
firstChild/lastChild 返回元素的第一个/最后一个子节点(包含注释节点和文本节点)
firstElementChild /lastElementChild 返回第一个/最后一个子元素(不包括文本节点以及注释节点)
parentNode 返回该结点的父节点
previousSibling 返回与当前节点同级的上一个节点(包含注释节点和文本节点)
nextSibling 返回与当前节点同级的下一个节点(包含注释节点和文本节点)
previousElementSibling/nextElementSibling 返回前一个/后一个兄弟元素(不包括文本节点以及注释节点)
childElementCount 返回子元素(不包括文本节点以及注释节点)的个数

在这里插入图片描述
4、返回节点位置信息






























属性 说明
clientWidth/clientHeight 返回内容的可视宽度/高度
offsetWidth/offsetHeight 返回元素的可视宽高宽度/高度
scrollWidth/scrollHeight 返回内容的实际高度(包含溢出、看不见或被遮挡的部分)
offsetLeft/offsetTop 返回元素内容区域的左上角相对于父元素左上角的左偏移/上偏移
scrollTop/element.scrollLeft 返回垂直/水平滚动条滚动的距离

这一次给元素增加一些文字使其内容溢出容器,在CSS中已经设置滚动条的宽度为10px。
在这里插入图片描述
PS:滚动条会压缩内容的宽度和高度

节点的常用方法

  1. <p id="intro" class="ellipsis" style="font-size: 14px;color: red">这是一段文字</p>
  2. <p name="txt" class="ellipsis" >另一段文字</p>

一、访问/获取节点


































方法 说明
document.getElementById 根据元素id返回元素,一个元素节点,如果不存在该元素,则返回null。
document.getElementsByTagName 根据元素标签名获取元素,返回包含多个元素的HTMLCollection对象
document.getElementsByClassName 根据元素的class返回返回包含多个元素的HTMLCollection对象,可以传入多个classname,中间需要加空格
document.getElementsByName 通过指定的name属性来获取元素,它返回一个NodeList对象。
document.querySelector 返回第一个匹配的元素节点,如果没有匹配的元素,则返回null。
document.querySelectorAll 返回的是所有匹配的元素节点(NodeList对象),可以匹配多个选择符

通过方法名,就可以看出哪些getElementById和querySelector返回一个元素节点,而其他方法返回多个节点(对象,一个节点的集合),DOM提供两种集合对象,HTMLCollection和NodeList。
在这里插入图片描述
PS:当前的测试环境是火狐浏览器,不同的浏览器返回的节点集合类型可能不同。

二、创建节点/属性






















方法 作用
document.createElement(eName) 创建一个元素节点
document.createAttribute(attrName) 创建一个属性节点
document.createTextNode(text); 创建一个文本节点

在这里插入图片描述

三、添加节点


















方法 作用
parentNode.insertBefore(newNode, referenceNode) 在某个节点前插入一个拥有指定父节点的子节点
parentNode.appendChild(newNode) 给某个节点添加子节点

四、复制节点














方法 作用
cloneNode(true | false); 复制某个节点 参数:是否复制原节点的所有属性

五、删除节点














方法 作用
parentNode.removeChild(node) 删除某个节点的子节点 node是要删除的节点

注意:为了保证兼容性,要判断元素节点的节点类型(nodeType),若nodeType为1,再执行删除操作。通过这个方法,就可以在 IE和 Mozilla 完成正确的操作。

六、修改文本节点


































方法 作用
appendData(data) 将data加到文本节点后面
deleteData(start,length) 将从start处删除length个字符
insertData(start,data) 在start处插入字符,start的开始值是0;
replaceData(start,length,data) 在start处用data替换length个字符
splitData(offset) 在offset处分割文本节点
substringData(start,length) 从start处提取length个字符

七、属性操作






















方法 作用
element.getAttribute(name) 通过属性名称获取某个节点属性的值
element.setAttribute(name,value) 为元素添加指定的属性,并为其赋指定的值
element.removeAttribute(name) 删除某个属性

八、替换节点














方法 作用
replaceChild(newNode,oldNode) 将一个给定父元素里面的一个子节点替换为另一个子节点
  1. var intro=document.getElementById('intro');
  2. var a=document.createElement("A"); //创建一个元素节点
  3. a.appendChild(document.createTextNode("链接")); //创建一个文本节点
  4. var attr=document.createAttribute("href"); //创建一个属性节点
  5. attr.value="#";
  6. a.setAttributeNode(attr); //为元素添加指定的属性,并为其赋指定的值
  7. var _a=a.cloneNode(true); //复制一个节点包含原节点的所有属性
  8. intro.appendChild(a); //给节点内部的最后添加子节点
  9. intro.insertBefore(_a,intro.childNodes[0]); //在节点前插入一个拥有指定父节点的子节点

发表评论

表情:
评论列表 (有 0 条评论,474人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaScriptDOM创建节点

    上几篇文章中我们罗列了一些获取HTML页面DOM对象的方法,当我们获取到了这些对象之后,下一步将对这些对象进行更改,在适当的时候进行对象各属性的修改就形成了我们平时看到的动态效

    相关 JavaScript DOM 删除子节点

    这些天一直在学习JavaScript,但由于工作繁忙,导致学习的兴致不高,一个对象都看了好几天视频,所以想以写博客的方式督促自己,希望能做到不管什么知识,每日一更。 一个元