1、什么是DOM
- DOM,全称Document Object Model文档对象模型
- JS中通过DOM来对HTML文档进行操作,只要理解了DOM就可以随心所欲的操作WEB页面
- 文档
- 对象
- 模型
- 使用模型来表示对象之间的关系,这样方便我们获取对象。
2、模型
3、节点
- 节点Node,是构成我们网页的最基本的组成部分,网页中的每一个部分都可以称之为一个节点
- 比如:HTML标签,属性,文本,注释,这个文档都是一个节点
- 虽然是节点,但是实际上他们的具体类型是不同的
- 比如:标签我们称之为元素节点,属性称为属性节点,文本称为文本节点,文档称为文档节点
- 节点的类型不同,属性和方法也不尽相同
4、节点的属性
5、文档节点
- 文档节点document,代表的是整个HTML文档,网页中的所有节点都是它的子节点。
- document对象作为window对象的属性存在的,我们不用获取可以直接使用。
- 通过该对象我们可以在整个文档访问中查找节点对象,并且通过该对象创建各种节点对象。
6、元素节点
- HTML中的各种标签都是元素节点,这也是我们最常用的一个节点
- 浏览器会将页面中所有的标签都转换为一个元素节点,我们可以通过document的方法获取节点
- 比如:
- document.getElementById()
- 根据id属性值获取一个元素节点对象
7、文本节点
- 文本节点表示的是HTML标签以外的文本内容,任意非HTML的文本都是文本节点
- 它包括字面解释的纯文本内容
- 文本节点一般是作为 元素节点的子节点存在的
- 获取文本节点时候,一般要先获取元素节点,再通过元素节点获取文本节点
- 比如:
- 元素节点.firstChild
- 获取元素节点的第一个子节点,一般是文本节点
8、属性节点
- 表示的是标签中的一个一个的属性,这里有注意的是属性节点并非是元素节点的子节点,而是元素节点的一部分
- 可以通过元素节点来获取指定的属性节点
- 比如:
- 元素节点.getAttributeNode(“属性名”);
- 注意我们一般是不使用属性节点
9、事件
- 事件,及时文档或者浏览器窗口中发生的一些特定的交互瞬间
- JavaScript和HTML之间的交互就是通过事件实现的
- 对于web应用来说,有下面这些代表性的事件:点击某个元素、将鼠标移动至某个元素上面,按下键盘某个键等等。
10、获取元素节点
- 通过document对象调用
- getElementById() 根据id书幸福获取一个元素节点对象
- getElementsByTagName() 根据标签名获取一组元素节点对象
- getElementsByName() 根据name属性获取一组元素节点对象
11、获取元素节点的子节点
- 通过 具体的元素 节点调用
- getElementsByTagName() 返回当前节点的指定标签名后代节点
- childNodes 表示当前节点的第一个子节点
- lastChild 表示当前节点的最后一个子节点
- fastChild 表示当前节点的最后一个子节点
12、获取父节点和兄弟节点
- parentNode 表示当前节点的父节点
- previousSibling 表示当前节点的后一个兄弟节点
- nextSibling 表示当前节点的后一个兄弟节点
13、元素节点的属性
element.value
element.id
element.className
element.value="hello"
element.id="id001"
element.className="newClass"
14、其他属性
15、demo实现
demo实现 demo 实现上面几种情况
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
<link rel="stylesheet" type="text/css" href="style/css.css" />
<script type="text/javascript">
function myClick(idStr , fun){
var btn = document.getElementById(idStr);
btn.onclick = fun;
}
window.onload = function(){
var btn01 = document.getElementById("btn01");
btn01.onclick = function(){
var bj = document.getElementById("bj");
alert(bj.innerHTML);
};
var btn02 = document.getElementById("btn02");
btn02.onclick = function(){
var lis = document.getElementsByTagName("li");
for(var i=0 ; i<lis.length ; i++){
alert(lis[i].innerHTML);
}
};
var btn03 = document.getElementById("btn03");
btn03.onclick = function(){
var inputs = document.getElementsByName("gender");
for(var i=0 ; i<inputs.length ; i++){
alert(inputs[i].className);
}
};
var btn04 = document.getElementById("btn04");
btn04.onclick = function(){
var city = document.getElementById("city");
var lis = city.getElementsByTagName("li");
for(var i=0 ; i<lis.length ; i++){
alert(lis[i].innerHTML);
}
};
var btn05 = document.getElementById("btn05");
btn05.onclick = function(){
var city = document.getElementById("city");
var cns = city.childNodes;
var cns2 = city.children;
alert(cns2.length);
};
var btn06 = document.getElementById("btn06");
btn06.onclick = function(){
var phone = document.getElementById("phone");
var fir = phone.firstChild;
alert(fir);
};
myClick("btn07",function(){
var bj = document.getElementById("bj");
var pn = bj.parentNode;
alert(pn.innerHTML);
});
myClick("btn08",function(){
var and = document.getElementById("android");
var ps = and.previousSibling;
alert(ps);
});
myClick("btn09",function(){
var um = document.getElementById("username");
alert(um.value);
});
myClick("btn10",function(){
var um = document.getElementById("username");
um.value = "今天天气真不错~~~";
});
myClick("btn11",function(){
var bj = document.getElementById("bj");
alert(bj.firstChild.nodeValue);
});
};
</script>
</head>
<body>
<div id="total">
<div class="inner">
<p>
你喜欢哪个城市?
</p>
<ul id="city">
<li id="bj">北京</li>
<li>上海</li>
<li>东京</li>
<li>首尔</li>
</ul>
<br>
<br>
<p>
你喜欢哪款单机游戏?
</p>
<ul id="game">
<li id="rl">红警</li>
<li>实况</li>
<li>极品飞车</li>
<li>魔兽</li>
</ul>
<br />
<br />
<p>
你手机的操作系统是?
</p>
<ul id="phone"><li>IOS</li> <li id="android">Android</li><li>Windows Phone</li></ul>
</div>
<div class="inner">
gender:
<input class="hello" type="radio" name="gender" value="male"/>
Male
<input class="hello" type="radio" name="gender" value="female"/>
Female
<br>
<br>
name:
<input type="text" name="name" id="username" value="abcde"/>
</div>
</div>
<div id="btnList">
<div><button id="btn01">查找#bj节点</button></div>
<div><button id="btn02">查找所有li节点</button></div>
<div><button id="btn03">查找name=gender的所有节点</button></div>
<div><button id="btn04">查找#city下所有li节点</button></div>
<div><button id="btn05">返回#city的所有子节点</button></div>
<div><button id="btn06">返回#phone的第一个子节点</button></div>
<div><button id="btn07">返回#bj的父节点</button></div>
<div><button id="btn08">返回#android的前一个兄弟节点</button></div>
<div><button id="btn09">返回#username的value属性值</button></div>
<div><button id="btn10">设置#username的value属性值</button></div>
<div><button id="btn11">返回#bj的文本值</button></div>
</div>
</body>
</html>
15、图片切换实现
<!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.0">
<title>Document</title>
</head>
<style>
* {
padding: 0;
margin: 0;
}
#temp {
width: 500px;
margin: 50px auto;
padding: 10px;
background-color: greenyellow;
/*设置文本居中*/
text-align: center;
}
</style>
<body>
<div id="temp">
<p id="side"></p>
<img src="./img/1.jpg" alt="">
<button id="prev">上一张</button>
<button id="next">下一张</button>
</div>
<script>
/**
* 需求:用户点击上一张按钮切换到上一张图片,点击下一张按钮切换到下一张图片,并且图片显示当前页数
*/
// 获取id prev的按钮
var prev = document.getElementById("prev");
// 获取id next的按钮
var next = document.getElementById("next");
// 存放所有的图片路径
var imgLocs = ["./img/1.jpg", "./img/2.jpg", "./img/3.jpg", "./img/4.jpg", "./img/5.jpg",]
// 当前页数
var index = 0;
// 获取img对象
var img = document.getElementsByTagName("img")[0];
// 获取页码显示信息
var side = document.getElementById("side");
side.innerHTML = "一共" + imgLocs.length + "页," + "当前第" + (index + 1) + "页"
prev.onclick = function () {
index--;
if (index < 0) {
index = imgLocs.length - 1;
}
img.src = imgLocs[index];
side.innerHTML = "一共" + imgLocs.length + "页," + "当前第" + (index + 1) + "页"
}
next.onclick = function () {
index++;
if (index > imgLocs.length - 1) {
index = 0
}
img.src = imgLocs[index];
side.innerHTML = "一共" + imgLocs.length + "页," + "当前第" + (index + 1) + "页"
}
</script>
</body>
</html>
效果图
16、使用css选择器进行查询
querySelector() querySelectorAll()
- 这两个方法都是用document对象来调用,两个方法使用相同,都是传递一个选择器字符串作为参数,方法会自动根据选择器字符串去网页查找元素
- 不同的是querySelector()只会返回找到的第一个元素,而querySelectorAll()会返回符合条件的所有元素
<!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.0">
<title>Document</title>
</head>
<body>
<div id="box2"></div>
<div class="box1">
我是第一个box1
<div>我是box1中的div</div>
</div>
<div class="box1">
<div>我是box1中的div</div>
</div>
<div class="box1">
<div>我是box1中的div</div>
</div>
<div class="box1">
<div>我是box1中的div</div>
</div>
<div></div>
<script>
var body = document.body;
var html = document.documentElement;
var all = document.all;
console.log(all.length);
for (var i = 0; i < all.length; i++) {
console.log(all[i])
}
all = document.getElementsByTagName("*");
console.log(all.length);
var box1 = document.getElementsByClassName("box1");
console.log(box1.length)
var divs = document.getElementsByTagName("div");
console.log(divs)
var digv = document.querySelector(".box1 div")
console.log(digv)
var box11 = document.querySelector(".box1")
console.log(box11)
console.log(box11.innerHTML)
console.log(digv.innerHTML)
var abc = document.querySelectorAll(".box1");
var bcd = document.querySelectorAll("#box2");
console.log(abc)
console.log(bcd)
</script>
</body>
</html>
16、节点的修改操作
- 这里的修改主要指的是对元素节点的修改
- 创建节点
- document.createElement(标签名)
- 删除节点
- 替换节点
- 父节点.replaceChild(新节点,旧节点)
- 插入节点
- 父节点.appendChild(子节点
- 父节点.insertBefore(新节点,旧节点)
<!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.0">
<title>Document</title>
</head>
<body>
<div id="total">
<div class="inner">
<p>
你喜欢哪个城市?
</p>
<ul id="city">
<li id="bj">北京</li>
<li>上海</li>
<li>东京</li>
<li>首尔</li>
</ul>
</div>
</div>
<div id="btnList">
<div><button id="btn01">创建一个"广州"节点,添加到#city下</button></div>
<div><button id="btn02">将"广州"节点插入到#bj前面</button></div>
<div><button id="btn03">使用"广州"节点替换#bj节点</button></div>
<div><button id="btn04">删除#bj节点</button></div>
<div><button id="btn05">读取#city内的HTML代码</button></div>
<div><button id="btn06">设置#bj内的HTML代码</button></div>
<div><button id="btn07">创建一个"广州"节点,添加到#city下</button></div>
</div>
<script>
var btn01 = document.getElementById("btn01");
btn01.onclick = function () {
var li = document.createElement("li");
var gzText = document.createTextNode("广州");
li.appendChild(gzText);
var city = document.getElementById("city");
city.appendChild(li);
}
var btn02 = document.getElementById("btn02");
btn02.onclick = function () {
var li = document.createElement("li");
var gzText = document.createTextNode("广州");
li.appendChild(gzText);
var bj = document.getElementById("bj");
var city = document.getElementById("city");
city.insertBefore(li, bj);
}
var btn03 = document.getElementById("btn03");
btn03.onclick = function () {
var li = document.createElement("li");
var gzText = document.createTextNode("广州");
li.appendChild(gzText)
var city = document.getElementById("city");
var bj = document.getElementById("bj");
city.replaceChild(li, bj);
}
var btn04 = document.getElementById("btn04");
btn04.onclick = function () {
var bj = document.getElementById("bj")
var city = document.getElementById("city")
}
var btn05 = document.getElementById("btn05");
btn05.onclick = function () {
var city = document.getElementById("city");
alert(city.innerHTML);
}
var btn06 = document.getElementById("btn06");
btn06.onclick = function () {
var bj = document.getElementById("bj");
bj.innerHTML = "大江东去"
}
var btn07 = document.getElementById("btn07");
btn07.onclick=function(){
var li = document.createElement("li");
var gzText=document.createTextNode("广州");
li.appendChild(gzText);
var city = document.getElementById("city");
city.appendChild(li);
}
</script>
</body>
</html>
17、添加删除操作练习
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加删除记录练习</title>
<link rel="stylesheet" type="text/css" href="ex_2_style/css.css" />
<script type="text/javascript">
function removeTr(){
var trNode = this.parentNode.parentNode;
var tds = trNode.getElementsByTagName("td");
var nameStr = tds[0].firstChild.nodeValue;
var flag = confirm("真的要删除" + nameStr + "的信息吗?");
if(flag){
trNode.parentNode.removeChild(trNode);
}
return false;
}
window.onload = function(){
var aEles = document.getElementsByTagName("a");
for(var i = 0;i < aEles.length;i++){
aEles[i].onclick = removeTr;
}
var subBtn = document.getElementById("addEmpButton");
subBtn.onclick = function(){
var nameText = trim(document.getElementById("empName").value);
var emailText = trim(document.getElementById("email").value);
var salaryText = trim(document.getElementById("salary").value);
document.getElementById("empName").value = nameText;
document.getElementById("email").value = emailText;
document.getElementById("salary").value = salaryText;
if(nameText == "" || emailText == "" || salaryText == ""){
alert("您输入的内容不完整");
return ;
}
var nameTd = document.createElement("td");
nameTd.appendChild(document.createTextNode(nameText));
var emailTd = document.createElement("td");
emailTd.appendChild(document.createTextNode(emailText));
var salaryTd = document.createElement("td");
salaryTd.appendChild(document.createTextNode(salaryText));
var aTd = document.createElement("td");
var aNewEle = document.createElement("a");
aNewEle.href = "deleteEmp?id=XXX";
aNewEle.appendChild(document.createTextNode("Delete"));
aNewEle.onclick = removeTr;
aTd.appendChild(aNewEle);
var trNode = document.createElement("tr");
trNode.appendChild(nameTd);
trNode.appendChild(emailTd);
trNode.appendChild(salaryTd);
trNode.appendChild(aTd);
var empTable = document.getElementById("employeeTable");
empTable.appendChild(trNode);
}
function trim(str){
var reg = /^\s*|\s*$/g;
return str.replace(reg,"");
}
}
</script>
</head>
<body>
<table id="employeeTable">
<tr>
<th>Name</th>
<th>Email</th>
<th>Salary</th>
<th> </th>
</tr>
<tr>
<td>Tom</td>
<td>tom@tom.com</td>
<td>5000</td>
<td><a href="deleteEmp?id=001">Delete</a></td>
</tr>
<tr>
<td>Jerry</td>
<td>jerry@sohu.com</td>
<td>8000</td>
<td><a href="deleteEmp?id=002">Delete</a></td>
</tr>
<tr>
<td>Bob</td>
<td>bob@tom.com</td>
<td>10000</td>
<td><a href="deleteEmp?id=003">Delete</a></td>
</tr>
</table>
<div id="formDiv">
<h4>添加新员工</h4>
<table>
<tr>
<td class="word">name: </td>
<td class="inp">
<input type="text" name="empName" id="empName" />
</td>
</tr>
<tr>
<td class="word">email: </td>
<td class="inp">
<input type="text" name="email" id="email" />
</td>
</tr>
<tr>
<td class="word">salary: </td>
<td class="inp">
<input type="text" name="salary" id="salary" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button id="addEmpButton" value="abc">
Submit
</button>
</td>
</tr>
</table>
</div>
</body>
</html>
效果图
18、使用dom操作css
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: red;
}
</style>
<script type="text/javascript">
window.onload = function(){
var box1 = document.getElementById("box1");
var btn01 = document.getElementById("btn01");
btn01.onclick = function(){
box1.style.width = "300px";
box1.style.height = "300px";
box1.style.backgroundColor = "yellow";
};
var btn02 = document.getElementById("btn02");
btn02.onclick = function(){
alert(box1.style.width);
};
};
</script>
</head>
<body>
<button id="btn01">点我一下</button>
<button id="btn02">点我一下2</button>
<br /><br />
<div id="box1"></div>
</body>
</html>
19、读取元素的样式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: yellow;
}
</style>
<script type="text/javascript">
window.onload = function(){
var box1 = document.getElementById("box1");
var btn01 = document.getElementById("btn01");
btn01.onclick = function(){
var w = getStyle(box1,"width");
alert(w);
};
};
function getStyle(obj , name){
if(window.getComputedStyle){
return getComputedStyle(obj , null)[name];
}else{
return obj.currentStyle[name];
}
}
</script>
</head>
<body>
<button id="btn01">点我一下</button>
<br /><br />
<div id="box1" ></div>
</body>
</html>
20、其他属性操作
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#box1 {
width: 100px;
height: 100px;
background-color: red;
padding: 10px;
border: 10px solid yellow;
}
#box2 {
padding: 100px;
background-color: #bfa;
}
#box4 {
width: 200px;
height: 300px;
background-color: #bfa;
overflow: auto;
}
#box5 {
width: 450px;
height: 600px;
background-color: yellow;
}
</style>
<script type="text/javascript">
window.onload = function () {
var box1 = document.getElementById("box1");
var btn01 = document.getElementById("btn01");
var box4 = document.getElementById("box4");
btn01.onclick = function () {
var op = box1.offsetParent;
};
};
</script>
</head>
<body id="body">
<button id="btn01">点我一下</button>
<br /><br />
<div id="box4">
<div id="box5"></div>
</div>
<br /><br />
<div id="box3">
<div id="box2" style="position: relative;">
<div id="box1"></div>
</div>
</div>
</body>
</html>
|