接下来就要进入DOM的学习了,配合插图,表格,示例代码以及运行效果的展示,可以清楚的知道需要掌握的知识点。
DOM对象学习
一.DOM对象的认识
1.简单介绍
- dom全称为Document Object Model,文档对象模型。
- DOM是一种用于表示和操作HTML、XML或XHTML文档的标准编程接口。DOM将一个文档表示为一个树状结构,其中每个节点表示文档中的一个元素、属性、文本等。
2.节点树
- 节点(Node):DOM树中的每个元素、属性、文本都被表示为一个节点。节点可以有子节点和父节点,形成了树的结构。
- 划分:
元素节点(Element Node):表示HTML或XML文档中的元素,如等。
文本节点(Text Node):表示HTML或XML文档中的文本内容。
属性节点(Attribute Node):表示HTML或XML元素的属性,如id、class等。 - 各节点之间关系:
根节点(Root Node):DOM树的顶层节点,通常是文档的节点。
父节点(Parent Node):一个节点的直接上级节点。
子节点(Child Node):一个节点的直接下级节点。
兄弟节点(Sibling Node):具有同一父节点的节点。
如图所示:
二.获取元素的操作
1.利用document对象的方法
1.1 使用
方法 | 说明 |
---|---|
document.getElementById() | 返回指定id的第一个对象的引用 |
document.getElementByName() | 返回指定名称的对象集合 |
document.getElementByTagName() | 返回指定标签名的对象集合 |
document.getElementByClassName() | 返回指定类名的对象集合 |
- 通过这个表,我们不难发现,除了第一个是返回对象的引用,别的都是返回一个对象集合,所以document.getElementById()是我们使用比较多的。
- 其中HTML5中还新增了一个document.querySelector()的方法,语言可以获取。
1.2 代码示例
<body>
//简单创建三个div
<div id="box">box</div>>
<div class="bar">bar</div>
<div name="main">main</div>
<script>
//通过id获取对象
console.log(document.getElementById("box"));
//通过类名获取对象集合
console.log(document.getElementsByClassName("bar"));
//通过标签名获取所有的div对象集合
console.log(document.getElementsByTagName("div"));
//通过name获取所有为main的对象集合
console.log(document.getElementsByName("main"));
</script>
</body>
1.3 效果
可以看到为对象集合的几个都有索引,想要精准定位可以根据集合的索引来。
2.利用document对象的属性
2.1使用方法
属性 | 说明 |
---|---|
document.body | 返回文档的body元素 |
document.documentElement | 返回文档的html元素 |
document.forms | 返回文档所有form对象的引用 |
document.images | 返回文档所有image对象的引用 |
2.2对比
其中document对象的方法也可以获取标签的对象引用,两者获取的是同一对象:
<script>
//通过方法获取body对象
var body=document.getElementsByTagName('body')[0];
//通过属性获取对比
console.log(document.body===body); //结果返回true
</script>
三.修改元素内容
1.元素属性
- innnerHTML:设置或者返回元素开始和结束标签之间的HTML(作用范围是比较大的)
- innerText:设置或返回元素中去除所有标签的内容
- textContent:设置或者返回指定节点的文本内容(作用范围最小)
还有我们之前就常使用的向文档写入指定内容的方法:document.write()和document.writeln()
2.代码示例
我们用这个来实现改变盒子的大小,单击盒子单数变大,偶数变小,其中文字也变。
<body>
<div class="box" id="box"></div>
<script>
var box=document.getElementById('box');
var i=0;
box.onclick=function (){
++i;
if (i%2){
this.style.width='200px';
this.style.height='200px';
this.innerHTML='大';
}else {
this.style.width='50px';
this.style.height='50px';
this.innerHTML='小';
}
}
</script>
</body>
其中元素样式的知识可以回顾一下css的知识点,或者帮助文档。点击后,偶数如下:
四.节点的操作
1.获取节点
1.1基本属性
- 访问子节点:firstChild(首个子节点);lastChild(最后一个子节点)
- 访问当前节点:nodeName(节点的名称);nodeValue(节点的值)
- nextSibling:返回指定节点的后一个节点
- previousSibling:返回指定节点的前一个节点
- parentNode:访问当前元素节点的父节点
- childNodes:访问当前元素结点的所有子节点的集合
1.2代码示例
<body>
<ul id="ul">
<li>js</li>
<li>dom</li>
<li>bom</li>
<li>xml</li>
<!-- 这是一个注释-->
</ul>
<script>
//访问document的第一个子节点
console.log(document.firstChild); //应该为<! DOCTYPE html>
//访问document的第二个子节点
console.log(document.firstChild.nextSibling);
//查看ul下面的所有子节点
var ull=document.getElementById("ul");
console.log(ull.childNodes);
//查看ul的父节点
console.log(ull.parentNode);
</script>
</body>
2.添加节点
2.1 方法说明
方法名 | 说明 |
---|---|
document.createElement() | 创建元素节点 |
document.createTextNode() | 创建文本节点 |
document.createAttribute() | 创建属性节点 |
appendChild() | 在指定字节列表后添加节点 |
insertBeforet() | 插入到指定子节点之前 |
getAttributeNode() | 返回指定节点的属性节点 |
setAttributeNode() | 设置指定节点的属性节点 |
2.2代码示例
为了更好的掌握节点的追加和使用,接下来创建一个
元素节点,并为其添加文本和属性为例。
<body>
<script>
//分别设置h2元素节点,文本结点,以及属性节点
var h2=document.createElement('h2');
var text=document.createTextNode('hello js!');
var attr=document.createAttribute('align');
//为属性节点赋值,属性节点必须要设置Value值
attr.value='center';
// 并将文本和属性添加到元素节点当中
h2.setAttributeNode(attr);
h2.appendChild(text);
//将设置好的元素节点添加到body当中
document.body.appendChild(h2);
</script>
</body>
输出如下:
3.删除节点
常用的删除方法,删除元素:removeChild(),删除属性值:removeAttributeNode()。
这个方法的使用,自己可以尝试写写就好了。
4.综合案例使用
编写了一个简单的购物车应用场景,但是还有一个小缺憾,就是添加商品时不能再原有购物车中的已有商品中添加数量,自己可以动手改善一下。
<!DOCTYPE html>
<html>
<head>
<title>购物车应用</title>
<style>
#cart {
margin-bottom: 20px;
}
.item {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.item__title {
font-weight: bold;
}
.item__price {
color: #666;
}
.add-btn,
.remove-btn {
border: none;
background: #4caf50;
color: #fff;
padding: 4px 8px;
margin-right: 8px;
cursor: pointer;
}
.remove-btn {
background: #f44336;
}
</style>
</head>
<body>
<h2>购物车应用</h2>
<div id="cart"></div>
<ul id="product-list">
<li>
<span class="item__title">商品 1</span>
<span class="item__price">$10</span>
<button class="add-btn">添加到购物车</button>
</li>
<br>
<li>
<span class="item__title">商品 2</span>
<span class="item__price">$15</span>
<button class="add-btn">添加到购物车</button>
</li>
<br>
<li>
<span class="item__title">商品 3</span>
<span class="item__price">$20</span>
<button class="add-btn">添加到购物车</button>
</li>
</ul>
<script>
var cartNode = document.getElementById('cart');
var productList = document.getElementById('product-list');
// 添加到购物车
function addItemToCart(itemTitle, itemPrice) {
var item = document.createElement('div');
item.classList.add('item');
var title = document.createElement('span');
title.classList.add('item__title');
title.textContent = itemTitle;
var price = document.createElement('span');
price.classList.add('item__price');
price.textContent = itemPrice;
var addButton = document.createElement('button');
addButton.classList.add('add-btn');
addButton.textContent = '添加';
addButton.addEventListener('click', function() {
increaseQuantity(item);
});
var removeButton = document.createElement('button');
removeButton.classList.add('remove-btn');
removeButton.textContent = '移除';
removeButton.addEventListener('click', function() {
decreaseQuantity(item);
});
var quantity = document.createElement('span');
quantity.textContent = '1';
item.appendChild(title);
item.appendChild(price);
item.appendChild(addButton);
item.appendChild(removeButton);
item.appendChild(quantity);
cartNode.appendChild(item);
}
// 增加数量
function increaseQuantity(item) {
var quantityNode = item.querySelector('span:last-child');
var quantity = parseInt(quantityNode.textContent);
quantity++;
quantityNode.textContent = quantity;
}
// 减少数量
function decreaseQuantity(item) {
var quantityNode = item.querySelector('span:last-child');
var quantity = parseInt(quantityNode.textContent);
quantity--;
if (quantity === 0) {
item.parentNode.removeChild(item);
} else {
quantityNode.textContent = quantity;
}
}
// 绑定添加到购物车按钮的点击事件
var addButtons = document.getElementsByClassName('add-btn');
for (var i = 0; i < addButtons.length; i++) {
addButtons[i].addEventListener('click', function() {
var item = this.parentNode;
var title = item.querySelector('.item__title').textContent;
var price = item.querySelector('.item__price').textContent;
addItemToCart(title, price);
});
}
</script>
</body>
</html>
效果如下:
五.小结
这一部分的内容,对于后续的学习十分关键,因为你不管是前端还是后端,DOM和BOM都是必须掌握的内容。后面还要学Vue,AJAx…都密切相连,正因为初学时自己一代而过,所有在学习Vue时总是要回去翻看之前的知识,所以又重新学习了一遍,于是有了这篇博客~。