一、结点
文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展标记语言的标准编程接口。js的DOM操作可以改变网页的内容、结构和样式,可以利用DOM操作来改变元素里面的内容、属性等。
1、html的DOM树
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body bgcolor="white"> <h5 align="middle">文字链接和图片链接</h5> <center> <a href="https://www.baidu.com/" title="百度一下">百度</a><br><br><br><br><br><br> <a href="https://www.baidu.com/" title="百度一下"><img src="img/百度图标.png" /></a> </center> </body> </html>
上面的HTML文件可以转化为如下的DOM树:
Document: 整个HTML文件称为一个Document文档。
Element:标签称为Element元素,例如:head、title、body、h5等。
Attribute:标签里面的属性,例如:href、title等。
Text:text文本、空格、换行,例如:<h5>之间的文本内容。
Node:Document、Element、Attribute、Text统称为Node。
2、DOM对象的常用方法:
getElementById() 返回带有指定 ID的元素 getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组) getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表 appendChild() 把新的子节点添加到指定节点 removeChild() 删除子节点 replaceChild() 替换子节点 insertBefore() 在指定的子节点前面插入新的子节点 createAttribute() 创建属性节点 createElement() 创建元素节点 createTextNode() 创建文本节点 getAttribute() 返回指定的属性值 setAttribute() 把指定属性设置或修改为指定的值
应用举例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="d1"> </div> <script> var para=document.createElement("p"); var node=document.createTextNode("23日,@电影熊出没 发布撤档声明,
“我们不愿看到观众朋友们因为观看《熊出没·狂野大陆》承担任何健康风险,更不愿看到疫情进一步扩散的可能。
没有什么比家人和孩子的安全更加重要!我们特此宣布,《熊出没·狂野大陆》将正式退出春节档,择日再映。”"); para.appendChild(node); var element=document.getElementById("d1"); element.appendChild(para); </script> </body> </html>
首先创建段落元素结点,然后创建文本结点,最后将文本结点放入段落中。
3、结点操作(父子节点)
(1)获取子结点
普通方式:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myul=document.querySelector(".fu");
var myli=document.querySelector(".zi");
</script>
</body>
需要分别获取父节点和子节点
通过结点操作获取(获取父节点)
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> </ul> <script> var myli=document.querySelector(".zi"); console.log(myli.parentElement); </script> </body>
利用父子关系获取结点
(3)获取子节点
普通方式:
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> </ul> <script> var myul=document.querySelector(".fu"); var lis=myul.querySelectorAll("li"); console.log(lis); </script> </body>
结点操作:获取的是所有的结点
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> </ul> <script> var myul=document.querySelector(".fu"); console.log(myul.childNodes); </script> </body>
可以通过判断nodetype获取需要的结点
获取所有的子元素节点:
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> </ul> <script> var myul=document.querySelector(".fu"); console.log(myul.children); </script> </body>
获取最后一个和第一个元素结点(IE9以上可使用):
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var myul=document.querySelector(".fu"); console.log(myul.firstElementChild); console.log(myul.lastElementChild) </script> </body>
没有兼容性问题的情况下返回第一个子元素和最后一个子元素:
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var myul=document.querySelector(".fu"); console.log(myul.children[0]); console.log(myul.children[3]) </script> </body>
优化:
<body> <ul class="fu"> <li class="zi">1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var myul=document.querySelector(".fu"); console.log(myul.children[0]); console.log(myul.children[myul.children.length-1]) </script> </body>
4、结点操作(兄弟结点)
(1)获取兄弟结点
<body> <div id="1"></div> <div id="2"></div> <span id="3"></span> <script> var mydiv=document.getElementById("3") console.log(mydiv.nextSibling); console.log(mydiv.previousSibling); </script> </body>
因为存在换行,所以兄弟结点都为文本结点
(2)获取兄弟元素结点
<body> <div id="1"></div> <div id="2"></div> <span id="3"></span> <script> var mydiv=document.getElementById("2") console.log(mydiv.nextElementSibling); console.log(mydiv.previousElementSibling); </script> </body>
二、dom改变结点的内容
1、改变元素内容
(1)element.innerText:从起始位置到终止位置,但它除去html标签、空格、换行
改变元素内容:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>获取元素</title> </head> <body> <button>获取时间</button> <div>hello</div> <script> //获取元素 var btn = document.querySelector("button"); var div = document.querySelector("div"); //注册事件 btn.onclick = function() { div.innerText = "2020年7月24日15:58:00"; } </script> </body> </html>
点击按钮:
因为script需要获取标签,因此将标签放到最前方,保证能够先获取到标签
不识别标签:
<body> <button>获取时间</button> <div>hello</div> <script> //获取元素 var btn = document.querySelector("button"); var div = document.querySelector("div"); //注册事件 btn.onclick = function() { div.innerText = "<strong>2020年7月24日15:58:00<strong>"; } </script> </body>
(2)element.innerHTML:起始位置到终止位置的全部内容,包括html标签、空格和换行
修改元素内容:
<body> <button>获取时间</button> <div>hello</div> <script> //获取元素 var btn = document.querySelector("button"); var div = document.querySelector("div"); //注册事件 btn.onclick = function() { div.innerHTML = "2020年7月24日15:58:00"; } </script> </body>
识别元素标签:
<body> <button>获取时间</button> <div>hello</div> <script> //获取元素 var btn = document.querySelector("button"); var div = document.querySelector("div"); //注册事件 btn.onclick = function() { div.innerHTML = "<strong>2020年7月24日15:58:00<strong>"; } </script> </body>
不识别链接:
<body>
<button>获取时间</button>
<div>hello</div>
<script>
//获取元素
var btn = document.querySelector("button");
var div = document.querySelector("div");
//注册事件
btn.onclick = function() {
div.innerHTML = "https://www.cnblogs.com/zhai1997/";
}
</script>
</body>
为文本,点击链接不能跳转
2、改变元素的属性
(1)操作input的属性
<body> <button>请点击</button> <input type="text" value="请输入"/> <script> //获取元素 var btn = document.querySelector("button"); var input = document.querySelector("input"); //注册事件 btn.onclick = function() { input.value="被点击了"; btn.disabled=true; } </script> </body>
点击前:
点击后:
(2)src的属性
<body> <button id="button1">1</button> <button id="button2">2</button> <img src="img/1.jpeg" /> <script> //获取元素 var btn1 = document.getElementById("button1"); var btn2= document.getElementById("button2"); var img=document.querySelector("img"); //注册事件 btn1.onclick = function() { img.src="img/hua.png" } btn2.onclick=function(){ img.src="img/1.jpeg"; } </script> </body>
点击按钮1:
点击按钮2:
(3)密码明文
<body> <button id="button">1</button> <input type="password" id="pwd"/> <script> var button =document.getElementById("button"); var pwd=document.getElementById("pwd"); var flag=0; button.onclick=function(){ if(flag==0){ pwd.type="text"; }else{ pwd.type="password"; } } </script> </body>
未点击按钮:
点击按钮:
3、改变样式
(1)普通方式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div{ 200px; height: 200px; background-color: black; } </style> </head> <body> <div></div> <script> var div=document.querySelector("div"); div.onclick=function(){ this.style.backgroundColor="red"; } </script> </body> </html>
点击按钮前:
点击后:
(2)className方式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .change{ 200px; height: 200px; background-color: black; } </style> </head> <body> <div>hello</div> <script> var div=document.querySelector("div"); div.onclick=function(){ this.className="change"; } </script> </body> </html>
点击前:
点击后:加载相应的样式
此种方式会覆盖原有的样式,如果要保留原有的样式,可以将原有的样式写在前面,修改后的样式写在后面