Dom分层
文档对象模型采用的分层结构为树形结构,以树节点的方式表示文档中的各种内容。
1.在文档对象中,每一个元素对象都可以称之为节点
2.html可以说是根节点。
3.如果多个节点在同一个层次,并且拥有这相同的父节点,那么这几个节点就称之为兄弟节点。
4.一个节点之上的节点称之为父节点,一个节点之下的节点称之为子节点。
5.在树形结构最底部的节点被称为叶子节点。
示范案例:
1 | <html> <html> |
访问指定节点
访问指定节点有1个方法和3个属性。
1.document.getElementById()方法。
2.nodeName属性。 //获取某一个节点的名称
3.nodeType属性。 //获取某个节点的类型 返回的都是整型,1代表元素节点,2代表属性节点,3代表文本节点
4.nodeValue属性。 //返回节点的值
1 | document.write(document.getElementById("Body").nodeName);//这样写属实用不了,不知道为啥视频教学可以 |
一下是真的正确的代码上面代码运行错误是因为script脚本写body上面,根本读取不到body。
1 | var str; |
返回值:
节点名称:BODY
节点类型:1
节点值:null
遍历文档树
1.parentNode属性,返回当前节点的父节点。
2.firstChild属性,返回当前节点的第一个子节点。
3.lastChild属性,返回当前节点的最后一个子节点。
4.previousSibling属性,返回当前节点的前一个兄弟节点。
5.nbextSibling属性,返回当前节点的后一个兄弟节点。
注意:如果返回的节点不存在,那么返回值会是nulll。
hasChildNodes属性,检查是否拥有子节点,有则返回true无则flase。
1 | <html> |
1 | <script type="text/javascript"> |
细节打磨有待优化,那个返回根节点。
节点操作
创建新节点有3个方法 以下方法要跟着document
1.createElement()方法 创建新元素 elememt翻译:要素;基本部分;典型部分;少量;有点;有些,个人觉得可以翻译成元素啥的。
2.createTextNode()方法 创建文本节点
3.appendChild()方法 将新的子节点添加到当前节点的末尾
appendChild()语法格式:obj.appendChild(newChild)。
obj:在该节点末尾末尾插入新节点。
newChild:新的子节点。
示范案例一:
1 | <html> |
返回值:我是文本节点创造物!
没错,他加粗了,这和createElement内的”b”有关,换成u是下划线,
这玩意儿似乎可以填很多元素属性,反正是元素节点,啥都可以填,如div,p。
注:createElement内似乎是必填?要不显示怎么也得填个null或者”null”(一样没区别)。
创建多个节点:
示范案例二:
1 | <body onload="play()"> |
运行结果:
1号
2号
3号
4号
5号
每次刷新加载页面会使浏览器变的缓慢,让我们看下面这个新方法。
createDocumentFragment() 方法用来创建文件碎片节点。
这个方法本身创建的是一个虚拟的节点对象,可以包含各种类型的节点,在创建之初是空的。
DocumentFragment节点不属于文档树,继承的parentNode属性总是null。
如果要插入DocumentFragment节点,那么插入的不是它自身,而是它的所有子孙节点。
如果把dom元素放documentfragment里再用它来添加到页面可以减少页面渲染dom的次数,效率会提升。
如果使用appendChid方法将原dom树中的节点添加到DocumentFragment中时,会删除原来的节点。//摘的,没测试。
1 | <body onload="play()"> |
乍一看好像没什么,浪费资源套娃,不理解这个东西。
反正这个方法是虚拟节点,appendChild出来的都是他子孙不是他自己。???谁来好像都一样?
不过貌似能提高加载资源(在多用dom元素),也不知道真假。
插入和追加
insertBefore(new,ref)
new:新的子节点。
ref:在该节点前插入新节点。
都是必填。函数本身就是之前,ref又是之前,2个之前插入的。
都是必填。函数本身就是之前,ref又是之前,2个之前插入的。
1 | <h2 id="h">在上面插入节点</h2> |
下面看代码
1 | function run(str){ |
节点复制
语法格式:obj.cloneNode(deep)
obj:要复制的节点。
deep:Boolean值,表示是否为深度复制,true表示要深度复制,false表示简单复制。
深度复制:当前节点的全部子节点也复制。
简单复制:只复制当前节点,不复制子节点。
节点删除
语法格式:obj.removeChild(oldChild)
oldChild:要删除的节点。
1 | <div id="di"> |
先创建div元素,接下来看代码。
1 | function play(){ |
单击按钮就会删除最后一个p元素标签。
替换节点
语法格式:obj.replaChild(new,old)
new:替换后的新节点。
old:需要被替换的旧节点。
1 | <b id="bb">可以添加新内容</b> |
下面看代码。
1 | function run(bj,txt){ |
运行结果:
可以添加新内容,好吧其实是插入?
txt框:用户输入
txt框:用户输入
按钮:value=插入
node.id的存在可以一直让文本替换成功。
题外话
document.documeneElement 属性,居然是返回文档元素,比如html文档返回html元素,
如果缺失元素会返回null,这个元素要用nodeName之类的才能操作查看。
childNodes()方法可以返回其下的子元素的集合。
createElement() 创建一个元素节点 => 接收参数为string类型的nodename
createTextNode() 创建一个文本节点 => 接收参数为string类型的text内容
createAttribute() 创建一个属性节点 => 接收参数为string类型的属性名称
createComment() 创建一个注释节点 => 接收参数为string类型的注释文本
通过元素的name属性获取元素 document.getElementByName()
通过元素的id属性获取元素 document.getElementById()
做个垃圾导航。(getElementByid)
1 | <div> |
1 | function run(par,par2,par3){ |