DOM笔记
什么是DOM?
- DOM文档对象模型,一个HTML文件就是一个DOM树(文档树).
- node节点,每个节点就是DOM树的树杈,树叶等.节点分类:1.元素节点(html的标签),2.文本节点,3.属性节点.
一、节点(node)类型
<p title="我是mjj" class="" id="">mjj</p>
1.元素节点(element node)
整个<p></p>
2.文本节点(txt node)
mjj
3.属性节点(attribue node)
title="我是mjj" class="" id=""
二、获取元素节点对象的方法
<h2>你要买什么课程?</h2> <p title="请选择购买的课程">本课程是WEB全栈课程,期待你的购买</p> <ul id="classlist"> <li class="item">JavaScript</li> <li class="item">css</li> <li class="item">DOM</li> </ul>
1. document.getElementById() 通过ID获取单个对象
<script type="text/javascript"> var elenode = document.getElementById('classlist'); console.log(elenode) </script>
获取到整个<ul></ul>标签对象
2. document.getElementsByTagName() 通过标签名获取出来的是一个节点对象集合
var olis = document.getElementsByTagName('li')
console.log(olis)
结果:
HTMLCollection(3) [li.item, li.item, li.item]
0: li.item
1: li.item
2: li.item
length: 3
__proto__: HTMLCollection
通过for循环遍历对象,可得到每一个li标签 for(var i=0; i<olis.length; i++){ console.log(olis[i]); }
通过下标方式获取li标签
console.log(olis[0]);
3. document.getElementsByClassName() 通过类名获取节点对象
var oitems = document.getElementsByClassName('item')
console.log(oitems)
结果如下:
HTMLCollection(3) [li.item, li.item, li.item]
可通过下标访问,或for循环遍历访问.
四、获取标签的某个属性值、设置标签的属性
1.getAttribute()
var oP = document.getElementsByTagName('p')[0]; //获取p标签
var title = oP.getAttribute('title'); //获取p标签的title属性值
console.log(title);
输出结果:
请选择购买的课程
如果没有该属性值,则输出:
null
2.setAttribute(name, value) 对html文档的修改不会显示客户端的网页源码中,动态刷新不会影响静态文档
<style type="text/css"> #box{ color: red; } </style>
oP.setAttribute('id', 'box');
通过setAttribute为标签添加属性,使<p>标签中的文字颜色变为红色.(动态改变)
DOM工作方式,先加载静态文档内容,再以动态内容进行刷新,动态刷新不影响静态内容.
五、DOM节点的三个重要属性
nodeName:节点名称 nodeValue:节点的值 nodeType:节点的类型
1. nodeName属性:节点的名称,是只读
-1. 元素节点的nodeName与标签名相同
-2. 属性节点的nodeName与属性名称相同
-3. 文本节点的nodeName永远是#text
-4. 文档节点的nodeName永远是#document
2. nodeValue属性:节点的值
-1. 元素节点的nodeValue是或null
-2. 文本节点的nodeValue是文本自身
-3. 属性节点的nodeValue是属性的值
3. nodeType属性:节点的类型,是只读的.
以下常用的几种节点类型:
元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9
4.实例说明
<div id="box">我是一个文本节点<!--我是注释--></div> <script type="text/javascript"> <!--获取元素节点的三个属性--> var oDiv = document.getElementById('box'); console.log(oDiv.nodeName); //输出:DIV console.log(oDiv.nodeValue); //输出:null console.log(oDiv.nodeType); //输出:1 <!--获取属性节点对象--> var oAttr = oDiv.attributes; console.log(oAttr); <!--输出如下:--> //NamedNodeMap {0: id, id: id, length: 1} // 0: id // length: 1 // id: id // __proto__: NamedNodeMap <!--获取ID属性节点的三个属性--> var attrId = oDiv.attributes[0]; //下标为0 console.log(attrId.nodeName); //输出:id console.log(attrId.nodeValue); //输出:box console.log(attrId.nodeType); //输出:2 <!--获取文本节点的三个属性--> var textNode = oDiv.childNodes[0]; //文本节点是元素节点的子节点 console.log(textNode.nodeName); //输出:#text console.log(textNode.nodeValue); //输出:我是一个文本节点 console.log(textNode.nodeType); //输出:3 <!--获取注释节点三个属性--> var commentNode = oDiv.childNodes[1]; console.log(commentNode.nodeName); //输出:#comment console.log(commentNode.nodeValue); //输出:我是注释 console.log(commentNode.nodeType); //输出:8 <!--判断文档节点的类型--> console.log(document.nodeType); //输出:9
七、节点属性对象在浏览器中的兼容性解决方法
(去除换行空格等,从而获取到真正需要的节点对象)
1 //获取所有的子节点对象函数(去除换行的干扰) 2 function get_childNodes(fatherNode) { 3 var nodes = fatherNode.childNodes; 4 var arr = []; //保存已经获取的元素节点对象 5 for (var i=0; i<nodes.length; i++){ 6 if (nodes[i].nodeType===1){ 7 arr.push(nodes[i]); 8 } 9 } 10 return arr; 11 } 12 //函数调用 13 var childnodes = get_childNodes(oFather); //oFather是已经获取到的元素节点对象 14 console.log(childnodes[0]); //获取第一个子节点对象 15 16 //获取下一个兄弟节点对象函数 17 function get_nextSibling(n) { 18 var x = n.nextSibling; 19 while(x && x.nodeType !== 1){ 20 x = x.nextSibling; 21 } 22 return x; 23 } 24 //函数调用 25 console.log(get_nextSibling(oFather)); ////oFather是已经获取到的元素节点对象
八、元素节点对象的增删改查方法
动态的操作节点
1. 创建节点 createElement()
2. 插入节点 appendChild()
insertBefore(newNode, node)
3. 删除节点 removeChild()
4. 替换节点 replaceChild(newNode, node)
5. 创建文本节点 createTextNode()
1 <div id="box"> 2 <p id="active">mjj</p> 3 4 </div> 5 <script type="text/javascript"> 6 //在DIV标签中插入一个新标签 7 var oDiv = document.getElementById('box'); //获取div标签节点 8 var newNode = document.createElement('p'); //创建p标签 9 newNode.setAttribute('class', 'active'); //设置新建标签的class属性 10 oDiv.appendChild(newNode); //将创建的p标签节点插入到div标签中 11 /* 12 var textNode = document.createTextNode('alex'); //创建文本节点 13 newNode.appendChild(textNode); //将新建的文本节点加入到新建的P标签节点中 14 */ 15 newNode.innerHTML = 'alex'; //采用innerHTMl属性插入文本节点 16 newNode.innerHTML = '<a href="#">百度一下</a>'; ////采用innerHTMl属性插入新标签节点 17 newNode.innerText = 'alex'; //该属性只能插入文本节点 18 19 //newNode = null; //释放对象(从内存中释放) 20 21 //在P标签前面插入一个新的标签 22 var oAtive = document.getElementById('active'); //获取原代码中的老的P标签 23 var newNode2 = document.createElement('p'); //创建新的p标签 24 newNode2.innerHTML = '<a href="#">mjj</a>'; //向新P标签中添加内容 25 oDiv.insertBefore(newNode2, oAtive); //在老的P标签前面插入新的P标签 26 27 //删除对象 28 oDiv.removeChild(oAtive); //删除oAtive对象,即老的P标签 29 30 //替换对象 31 var newNode3 = document.createElement('a'); //创建新的a标签 32 newNode3.setAttribute('href', 'http://www.baidu.com'); //设置a标签的属性 33 newNode3.innerHTML = '百度一下'; //为a标签增加文本 34 oDiv.replaceChild(oAtive, newNode3); //替换原来的p标签
九、动态样式设置
有两种方法来动态的设置样式:
1. 直接操作样式属性(相当于行内式)
2. 通过控制属性的类名来控制样式(前提是在样式中已经有定义好的)
1 var para = document.getElementById('box'); //获取一个标签节点 2 // 1. 直接操作样式属性(行内式) 3 para.style.color = 'white'; 4 para.style.fontSize = '30px'; 5 6 // 2. 通过控制属性的类名来控制样式 7 // 之前已经有设置好的样式 8 <style type="text/css"> 9 .highLight{ 10 color: white; 11 font-size: 30px; 12 } 13 </style> 14 // 为标签新设置一个类属性,也就设置了该标签的样式 15 para.setAttribute('class', 'highLight');
十、事件介绍和onclick事件
常用的事件:
onclick 鼠标单击事件
onmouseover 鼠标经过事件
onmouseout 鼠标移开事件
onchange 文本框内容改变事件 //与表单有关
onselect 文本框内容被选中事件
onfocus 光标聚焦事件
onblur 光标失焦事件
onload 网页加载事件
绑定事件示范:
事件需要定义为函数
1 <style type="text/css"> 2 #box{ 3 width: 100px; 4 height: 100px; 5 background-color: blue; 6 } 7 </style> 8 9 10 <div id="box"></div> 11 <script type="text/javascript"> 12 var oDiv = document.getElementById('box'); //获取div对象 13 oDiv.onclick = function () { //为div对象绑定事件 14 alert('事件被触发了') //弹出网页消息框 15 } 16 </script>
<div id="box" onclick="add();"></div> //另一种调用事件的方法(不建议使用这种方法) <script type='text/javascript'> function add() { //定义事件函数 alert('事件被触发了') //弹出网页消息框 }
</script>
修改div的背景色:
1 <script type="text/javascript"> 2 var oDiv = document.getElementById('box'); //获取div对象 3 var isBlue = true; //默认是蓝色背景 4 //实现点击div格子,背景颜色不停变换 5 oDiv.onclick = function () { 6 if(isBlue) { 7 //this指的是div标签本身,相当于python类中的self 8 this.style.backgroundColor = 'red'; 9 isBlue = false; 10 }else{ 11 this.style.backgroundColor = 'blue'; 12 isBlue = true; 13 } 14 }; 15 </script>
十一、鼠标悬浮事件
一般做一个事件需要三步:
1. 找到触发的事件对象 2. 对象绑定事件 3. 事件处理具体程序
1 <style type="text/css"> 2 #box{ 3 background-color: red; 4 width: 300px; 5 height: 300px; 6 } 7 </style> 8 9 10 11 <div id="box"></div> 12 <script type="text/javascript"> 13 // 1. 找到触发事件的对象 14 var oDiv = document.getElementById('box'); 15 // 2. 绑定鼠标滑过事件 16 oDiv.onmouseover = function () { 17 // 3. 事件具体的处理过程 18 this.style.backgroundColor = 'green'; 19 } 20 21 // 2. 鼠标移开事件 22 oDiv.onmouseout = function () { 23 // 3. 事件具体的处理过程 24 this.style.backgroundColor = 'red'; 25 } 26 </script>
十二、光标聚焦和失焦事件
聚焦: 节点对象.onfocus 失焦: 节点对象.onblur
<style type="text/css"> .text{ color: red; font-size: 12px; } </style> <form action=""> <p class="name"> <label for="username">用户名:</label> <input type="text" name="user" id="username"> </p> <p class="pwd"> <label for="pwd">密码:</label> <input type="password" name="pwd" id="pwd"> </p> <input type="submit" name=""> </form> <script type="text/javascript"> var userName = document.getElementById('username'); //获取用户名输入框节点 var newNode = document.createElement('span'); //在用户名输入框后创建span标签 //获取焦点的事件 userName.onfocus = function () { newNode.innerHTML = '请输入用户名'; //在span标签中添加文本 newNode.setAttribute('class', 'text'); //设置span标签的样式 //先获取输入框的父标签,再在父标签下添加span标签 userName.parentNode.appendChild(newNode); //把span标签添加到P标签下,即输入框后. } //失去焦点的事件 userName.onblur = function () { newNode.innerHTML = '必须输入正确的用户名'; newNode.setAttribute('class', 'text'); userName.parentNode.appendChild(newNode); } </script>
十三、表单控件上内容选中和改变事件
选中: 节点对象.onselect 改变: 节点对象:onchange 实时监测内容改变情况: oninput
1 //报错 2 <textarea cols="30" rows="10">请写入个人简介,字数不少于200字</textarea> 3 <input type="text" name="" value="mjj"> 4 <script type="text/javascript"> 5 var textArea = document.getElementsByName('textarea')[0]; 6 var inputObj = document.getElementsByName('input')[0]; 7 8 textArea.onselect = function () { 9 console.log('内容被选中了'); 10 } 11 inputObj.onchange = function () { 12 console.log('内容被改变了'); 13 } 14 inputObj.onchange = function () { 15 console.log(this.value) //实时显示修改后的内容 16 }
17 </script>
十四、窗口加载事件
窗口加载事件: window.onload
为啥使用onload: 通常js代码会编写在head中,根据网页加载的顺序,head是先加载,body后加载.所以js不会作用于body,也就失去了作用.
采用onload后,就改变了加载执行的顺序,先执行body,再执行js.
1 <head> 2 //js代码位于网页文档的head里面,传统的加载方法,使用延时器等待,等待body中网页加载完毕,再执行 3 <script type="text/javascript"> 4 setTimeout(function () { //使用延时器 5 var oDiv = document.getElementById('box'); 6 console.log(oDiv); 7 oDiv.onclick = function () { 8 this.innerHTML = 'alex'; 9 } 10 }, 0) 11 </script> 12 </head> 13 <body> 14 <div id="box">Mjj</div> 15 16 </body>
1 <head> 2 //正确的方法,使用onload,等待文档元素加载完成后才会调用onload() 3 <script type="text/javascript"> 4 window.onload = function () { 5 var oDiv = document.getElementById('box'); 6 console.log(oDiv); 7 oDiv.onclick = function () { 8 this.innerHTML = 'alex'; 9 } 10 } 11 </script> 12 </head> 13 <body> 14 <div id="box">MJJ</div> 15 16 </body>