DOM对象(节点关系、查找、操作)
一、DOM对象
1、什么是HTML DOM
- HTML Document Object Model(文档对象模型)
- HTML DOM 定义了访问和操作HTML文档的标准方法
- HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)
2、DOM树

画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。
3、DOM节点
3.1 节点类型:
HTML 文档中的每个成分都是一个节点。
DOM 是这样规定的:
整个文档是一个文档节点 。(document)
每个 HTML 标签是一个元素节点。 (element)
包含在 HTML 元素中的文本是文本节点。 (text)
每一个 HTML 属性是一个属性节点。(attribute)

3.2 节点关系
节点树中的节点彼此拥有层级关系。
父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
- 在节点树中,顶端节点被称为根(root)
- 每个节点都有父节点、除了根(它没有父节点)
- 一个节点可拥有任意数量的子
- 同胞是拥有相同父节点的节点
下面的图片展示了节点树的一部分,以及节点之间的关系:

访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素。
3.3 节点查找
直接查找节点
document.getElementById(“idname”)
document.getElementsByTagName(“tagname”)
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)
<div id="div1">
<div class="div2">i am div2</div>
<div name="yuan">i am div2</div>
<div id="div3">i am div2</div>
<p>hello p</p>
</div>
<script>
var div1=document.getElementById("div1");
////支持;
// var ele= div1.getElementsByTagName("p");
// alert(ele.length);
////支持
// var ele2=div1.getElementsByClassName("div2");
// alert(ele2.length);
////不支持
// var ele3=div1.getElementById("div3");
// alert(ele3.length);
////不支持
// var ele4=div1.getElementsByName("yuan");
// alert(ele4.length)
</script>
导航节点属性
parentElement // 父节点标签元素 children // 所有子标签 firstElementChild // 第一个子标签元素 lastElementChild // 最后一个子标签元素 nextElementSibling // 下一个兄弟标签元素 previousElementSibling // 上一个兄弟标签元素
注意,js中没有办法找到所有的兄弟标签!
3.4 节点操作
创建节点:
createElement(标签名) :创建一个指定名称的元素。
例:var tag=document.createElement(“input")
tag.setAttribute('type','text');
添加节点:
追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode)
把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);
删除节点:
somenode.removeChild():获得要删除的元素,通过父元素调用删除
替换节点:
somenode.replaceChild(newnode, somechildnode);
节点属性操作:
1、获取文本节点的值:
innerText 获取纯文本,修改成标签样式也只会是文本
innerHTML 获取节点下所有标签及文本
2、attribute操作
elementNode.setAttribute(name,value) elementNode.getAttribute(属性名) <-------------->elementNode.属性名(DHTML) elementNode.removeAttribute(“属性名”);
3、value获取当前选中的value值
1.input
2.select(selectIndex)
3.textarea
4、innerHTML 给节点添加html代码:
该方法不是w3c的标准,但是主流浏览器支持
tag.innerHTML = “<p>要显示内容</p>”;
5、关于class的操作:
elementNode.className
elementNode.classList.add
elementNode.classList.remove
6、改变css样式:
<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";
.style.fontSize=48px
二、课后作业
实现表格的增删改(目前只完成增、删)


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> <style> * { margin: 0; padding: 0; } .head { height: 40px; background: #1e2598; } .left { float: left; width: 15%; height: 600px; border-right: 1px black solid; } .right { float: left; width: 84%; } .add { margin: 10px 20px; width: 47px; height: 30px; color: white; background: royalblue; border-right: solid 1px black; border-bottom: solid 1px black; border-radius: 12%; } th, td { margin: 0 auto; text-align: center; border-bottom: 1px darkgray solid; } table tr { height: 40px; } tr { margin: 20px 0; padding: 20px; border-bottom: 1px darkgray solid; } .name { width: 6%; } .age { width: 6%; } .phone { width: 10%; } .city { width: 10%; } .control { width: 25%; } .bg { position: fixed; /*width: 100%;*/ /*height: 100%;*/ top:0; bottom: 0; left: 0; right: 0; background: darkgray; opacity: 0.5; } .add_text { background: white; position: fixed; left: 50%; top: 50%; margin-top: -150px; margin-left: -150px; width: 350px; height: 300px; } .add_text input { width: 200px; height: 20px; font-size: 14px; margin: 10px; } .add_text p { float: right; margin-right: 35px; margin-top: 15px; } .add_text button { width: 50px; height: 20px; margin: 5px; } .hide { display: none; } </style> </head> <body> <div class="bg hide handels"></div> <div class="add_text hide handels"> <p>姓名:<input name="user" placeholder="姓名"></p> <p>年龄:<input name="age" placeholder=""></p> <p>手机号:<input name="phone_number" placeholder=""></p> <p>城市:<input name="home_city" placeholder=""></p> <p id="butt"> <button class="confirm">确定</button> <button class="cancel">取消</button> </p> </div> <div class="head"></div> <div class="middle"> <div class="left"></div> <div class="right"> <button class="add">添加</button> <table> <tr class="title"> <th class="name">姓名</th> <th class="age">年龄</th> <th class="phone">手机号</th> <th class="city">城市</th> <th class="control">操作</th> </tr> <tr class="row hide"> <td class="name">egon</td> <td class="age">34</td> <td class="phone">12345678901</td> <td class="city">北京</td> <td class="control"> <button>编辑</button> <button onclick="dell(this)">删除</button> </td> </tr> <tr> <td class="name">egon</td> <td class="age">34</td> <td class="phone">12345678901</td> <td class="city">北京</td> <td class="control"> <button>编辑</button> <button onclick="dell(this)">删除</button> </td> </tr> </table> </div> </div> <script> function dell(self) { self.parentNode.parentNode.parentNode.removeChild(self.parentNode.parentNode) } var add = document.getElementsByClassName("add")[0]; var hides = document.getElementsByClassName("handels"); add.onclick = function () { for (var i = 0; i < hides.length; i++) { hides[i].classList.remove("hide"); } var input = document.getElementsByTagName("input"); for (i = 0; i < input.length; i++) { input[i].value = ""; } }; var confirm = document.getElementsByClassName("confirm")[0]; confirm.onclick = function () { var message = []; var input = document.getElementsByTagName("input"); for (var i = 0; i < input.length; i++) { message.push(input[i].value) } console.log(message); for (i = 0; i < hides.length; i++) { hides[i].classList.add("hide"); } var row = document.getElementsByClassName("row")[0]; var new_row = row.cloneNode(true); new_row.classList.remove("hide") for (var j = 0; j < message.length; j ++) { console.log(new_row.children[j].innerText) new_row.children[j].innerText = message[j] } // for (var j = 1; j < new_row.childNodes.length - 2; j += 2) { // console.log(new_row.childNodes[j].innerText) // new_row.childNodes[j].innerText = message[(j + 1) / 2 - 1] // } var flag; for (var me in message) { if (message[me].length == 0) { flag = 0; break; } } if (flag == undefined) { row.parentNode.appendChild(new_row); } }; var cancel = document.getElementsByClassName("cancel")[0]; cancel.onclick = function () { for (var i = 0; i < hides.length; i++) { hides[i].classList.add("hide"); } } var error = document.createElement("p"); error.innerText = "2-10个字符,可使用字母、汉字、数字、不能是纯数字" error.style.color = "red" error.style.fontSize = "12px" error.style.lineHeight = "12px" error.style.float = "none" error.style.margin = "0" error.style.textAlign = "center" var error1 = error.cloneNode(true); error1.innerText = "请输入正确年龄" var error2 = error.cloneNode(true); error2.innerText = "请输入正确的手机号码" var user = document.getElementsByName("user")[0]; user.onblur = function () { if (!isNaN(user.value) || user.value.length > 10 || user.value.length < 2) { // error = document.createElement("p"); // error.innerText = "2-10个字符,可使用字母、汉字、数字、不能是纯数字" // error.style.color = "red" // error.style.fontSize = "12px" // error.style.lineHeight = "12px" // error.style.float = "none" // error.style.margin = "0" // error.style.textAlign = "center" if (!this.nextElementSibling) { this.parentNode.appendChild(error) } } else { if (this.nextElementSibling) { this.parentNode.removeChild(this.nextElementSibling) } } } var age = document.getElementsByName("age")[0]; age.onblur = function () { if (isNaN(age.value) || age.value < 0 || age.value > 150 || age.value.length == 0) { // var error1 = document.createElement("p"); // error1.innerText = "请输入正确年龄" // error1.style.color = "red" // error1.style.fontSize = "12px" // error1.style.lineHeight = "12px" // error1.style.float = "none" // error1.style.margin = "0" // error1.style.textAlign = "center" if (!this.nextElementSibling) { this.parentNode.appendChild(error1) } } else { if (this.nextElementSibling) { this.parentNode.removeChild(this.nextElementSibling) } } } var phone = document.getElementsByName("phone_number")[0]; phone.onblur = function () { if (isNaN(phone.value) || phone.value.length != 11) { // var error2 = document.createElement("p"); // error2.innerText = "请输入正确的手机号码" // error2.style.color = "red" // error2.style.fontSize = "12px" // error2.style.lineHeight = "12px" // error2.style.float = "none" // error2.style.margin = "0" // error2.style.textAlign = "center" if (!this.nextElementSibling) { this.parentNode.appendChild(error2) } } else { if (this.nextElementSibling) { this.parentNode.removeChild(this.nextElementSibling) } } } </script> </body> </html>

浙公网安备 33010602011771号