DOM基础

一、概念

  • 是JavaScript操作HTML文档的接口 全称为 文档对象模型 (Doucment Object Model)
  • 作用:把文档中的代码翻译成一个对象模型 从而可以用脚本进行各种操作
  • 该模型中所有相关的标签属性注释文本等12种数据都会翻译为一种类型的对象 统称节点对象
  • 浏览器根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组成一个树状结构
  • DOM的最小组成单位是节点(node),文档的树形结构(DOM树)由12种类型的节点组成

12种节点:元素节点、文档节点、文档类型节点、文档片段节点、文本节点、注释节点、特性节点、CDATA节点、实体名称节点、实体引用名称节点、处理指令节点、DTD声明节点

 DOM树:

7f5bf12ef4704e86badbd88c670b13aa.png

二、获取元素的方式

(一)系统提供的方法

  旧方法

  • document.getElementById
<div id="box1"> 盒子box1</div>

<script>
var div1=document.getElementById("box1") //如果没有就返回null
console.log(div1)   //返回某一具体元素
</script>
  • document.getElementsByClassName
<div class="box2">盒子2-1</div>
<div class="box2">盒子2-2</div>
<div class="box2">盒子2-3</div>

<script>
var arr = document.getElementsByClassName("box2")
console.log(arr) //返回值是类数组 是一个数据容器 装了3个类名为box2的div
</script>
  • document.getElementsByName
<input type="radio" name="rad">
<input type="radio" name="rad">
<input type="radio" name="rad">

<script>
var name = document.getElementsByName("rad")
console.log(name)
</script>
  • document.getElementsByTagName
<div>盒子1</div>
<div>盒子2</div>
<div>盒子3</div>

<script>
var tag = document.getElementsByTagName("div")
console.log(tag) //返回值是类数组 是一个数据容器 装了3个div
</script>

   H5出的新方法

  • document.querySelector
<div id="box">盒子1</div>
<div id="box">盒子2</div>
<div id="box">盒子3</div>

<script>
var el = document.querySelector("#box") //选择符合选择器的第一个元素 没有就返回null
console.log(el) //第一个div 盒子1
</script>
  • document.querySelectorAll
<div id="box">盒子1</div>
<div id="box">盒子2</div>
<div id="box">盒子3</div>

<script>
var els = document.querySelectorAll(".box2") //符合选择器的所有元素 没有返回null
console.log(els) //全部的div 盒子1、2、3
</script>

    注:h5新出的方法更好用 但是document.getElementsById()是最快的

(二)系统提供的直接获取的方法

  • document.body        //body标签 (常用)
  • document.forms       //form表单集
  • document.anchors   //a标签集
  • document.images    //图片集
  • document.links        //连接集
  • document.URL        //当前文档的网址

(三)通过关系获取的方法

   示例的html代码:

<div id="box1">
  <div class="box2" id="box">2</div>
  <div class="box2">
     <div class="box3" id="box3">3</div>
  </div>
  <div class="box2" id="box4">4</div>
</div>
  • 父级 父元素和父节点是同一个
//以id为box的div为基准 获取它的父节点
var box = document.querySelector('#box')
var boxpe = box.parentElement  //父元素
var boxpd = box.parentNode    //父节点
  • 子级 子元素和子节点不一定是同一个
//以id为box1的div为基准 获取它的子节点
var box1 = document.querySelector('#box1')
var els = box1.children //子元素们 是类数组 包括3个div元素
console.log(els)    //HTMLCollection(3) 0: div#box.box2  1: div.box2  2: div#box4.box2
var nodes = box1.childNodes //子节点们 是类数组 包括3个div元素节点和文档节点等
console.log(nodes)  //NodeList(7) 0: text  1: div#box.box2   2: text  3: div.box2
                    //            4: text  5: div#box4.box2  6: text
以id为box的div为基准 获取它的子节点
var box = document.querySelector('#box')
var bc = box.children
console.log(bc) //HTMLCollection(0) 返回空的数据容器
  • 兄弟节点

   上一个兄弟: previousElementSibling  上一个兄弟元素 没有返回null

                          previousSibling                上一个兄弟节点 没有返回null

//以id为box4的div为基准 获取它的哥哥(上一个)节点
var box4 = document.querySelector('#box4')
var bel = box4.previousElementSibling //上一个元素
console.log(bel)   // class="box2"的div
var bnode = box4.previousSibling //上一个节点
console.log(bnode) //#text

  下一个兄弟 : nextElementSibling    下一个兄弟元素 没有返回null

                          nextSibling                  下一个兄弟节点 没有返回null

//以id为box的div为基准 获取它的弟弟(下一个)节点
var box = document.querySelector('#box')
var bne = box.nextElementSibling //下一个元素
console.log(bne)
var bns = box.nextSibling //下一个节点
console.log(bns)

//以id为box4的div为基准 获取它的弟弟(下一个)节点
var box4 = document.querySelector('#box4')
var bne = box4.nextElementSibling //下一个元素
console.log(bne) //null
  • 第1个子节点
var box=document.getElementById("#box")
var fs1=box.firstChild           //第1个子节点
var fs11=box.firstElementChild   //第1个子元素
console.log(fs1,fs11)  // "2"  null
  • 最后一个子节点
var box4=document.getElementById("#box4")
var ls1=box4.lastChild           //最后一个子节点
var ls11=box4.lastElementChild   //最后一个子元素
console.log(ls1,ls11)   // "4"  null
  • 获取自己是父元素中的第几个子元素/节点
//自己实现这个方法:调用者是父元素中的第几个元素 .index()                        
 Object.prototype.index1=function() {
     console.log(this)
     var arr=this.parentElement.childNodes
     for (let i = 0;i<arr.length;i++) {
         if(this==arr[i]){
             return i
            }
     }
 }
 var index=document.getElementById("box").index1()
console.log(index)

//另一种方法
var son1=document.getElementById("box1").children[1]   //第二个子元素
var son2=document.getElementById("box1").childNodes[1] //第二个子节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈ha~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值