Web APIs 核心知识(4)
JavaScript日期对象与DOM节点操作详解
在前端开发中,日期对象和DOM节点操作是两个非常重要的知识点。本文将详细介绍JavaScript中的日期对象及其方法,以及如何操作DOM节点,包括插入、删除和查找节点。
1. 日期对象
日期对象是JavaScript中处理日期和时间的对象,提供了许多方法来操作日期和时间。
1.1 实例化
在JavaScript中,可以使用Date
构造函数来实例化一个日期对象。
创建当前日期和时间的对象
let now = new Date();
console.log(now);
创建指定日期和时间的对象
let specificDate = new Date('2023-05-28T12:00:00');
console.log(specificDate);
1.2 方法
日期对象提供了多种方法来获取和设置日期和时间。
获取日期和时间
let now = new Date();
console.log(now.getFullYear()); // 获取年份
console.log(now.getMonth()); // 获取月份(0-11,0表示一月)
console.log(now.getDate()); // 获取日期
console.log(now.getHours()); // 获取小时
console.log(now.getMinutes()); // 获取分钟
console.log(now.getSeconds()); // 获取秒
console.log(now.getMilliseconds()); // 获取毫秒
console.log(now.getDay()); // 获取星期几(0-6,0表示星期天)
设置日期和时间
let now = new Date();
now.setFullYear(2024);
now.setMonth(0); // 一月
now.setDate(1);
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
now.setMilliseconds(0);
console.log(now);
其他常用方法
let now = new Date();
console.log(now.toDateString()); // 获取日期字符串
console.log(now.toTimeString()); // 获取时间字符串
console.log(now.toISOString()); // 获取ISO格式字符串
1.3 时间戳
时间戳是从1970年1月1日00:00:00 UTC到当前时间的毫秒数。可以使用Date.now()
获取当前时间的时间戳。
获取当前时间的时间戳
let timestamp = Date.now();
console.log(timestamp);
将时间戳转换为日期对象
let date = new Date(timestamp);
console.log(date);
2. DOM节点
DOM(文档对象模型)是HTML和XML文档的编程接口,表示文档的结构,使其能够被编程语言操作。常见的DOM节点操作包括插入节点、删除节点和查找节点。
2.1 插入节点
可以使用appendChild
、insertBefore
等方法在DOM中插入新节点。
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Insert Node</title>
</head>
<body>
<div id="parent">Parent</div>
<script>
let parent = document.getElementById('parent');
// 创建新节点
let newChild = document.createElement('div');
newChild.textContent = 'New Child';
// 插入新节点
parent.appendChild(newChild);
</script>
</body>
</html>
2.2 删除节点
可以使用removeChild
方法来删除DOM节点。
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Remove Node</title>
</head>
<body>
<div id="parent">
Parent
<div id="child">Child</div>
</div>
<script>
let parent = document.getElementById('parent');
let child = document.getElementById('child');
// 删除子节点
parent.removeChild(child);
</script>
</body>
</html>
2.3 查找节点
可以使用多种方法来查找DOM节点,包括getElementById
、getElementsByClassName
、getElementsByTagName
、querySelector
和querySelectorAll
等。
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Find Node</title>
</head>
<body>
<div id="parent">
Parent
<div class="child">Child 1</div>
<div class="child">Child 2</div>
</div>
<script>
let parent = document.getElementById('parent');
let children = parent.getElementsByClassName('child');
for (let child of children) {
console.log(child.textContent);
}
</script>
</body>
</html>
2.3.1 父子关系
可以使用parentNode
和childNodes
属性来获取父节点和子节点。
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Parent-Child Relationship</title>
</head>
<body>
<div id="parent">
Parent
<div id="child">Child</div>
</div>
<script>
let child = document.getElementById('child');
let parent = child.parentNode;
console.log('Parent:', parent.id); // Parent: parent
console.log('Child:', parent.childNodes[1].textContent); // Child: Child
</script>
</body>
</html>
2.3.2 兄弟关系
可以使用nextSibling
和previousSibling
属性来获取相邻的兄弟节点。
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sibling Relationship</title>
</head>
<body>
<div id="parent">
<div id="sibling1">Sibling 1</div>
<div id="sibling2">Sibling 2</div>
<div id="sibling3">Sibling 3</div>
</div>
<script>
let sibling2 = document.getElementById('sibling2');
let prevSibling = sibling2.previousSibling;
let nextSibling = sibling2.nextSibling;
// 过滤掉空白文本节点
while (prevSibling && prevSibling.nodeType !== 1) {
prevSibling = prevSibling.previousSibling;
}
while (nextSibling && nextSibling.nodeType !== 1) {
nextSibling = nextSibling.nextSibling;
}
console.log('Previous Sibling:', prevSibling ? prevSibling.id : null); // Previous Sibling: sibling1
console.log('Next Sibling:', nextSibling ? nextSibling.id : null); // Next Sibling: sibling3
</script>
</body>
</html>
3. M端事件
4.重绘与回流
4.1 浏览器是如何进行界面渲染的
- 解析(Parser)HTML,生成DOM树(DOM Tree)
- 同时解析(Parser) CSS,生成样式规则 (Style Rules)
- 根据DOM树和样式规则,生成渲染树(Render Tree)
- 进行布局 Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
- 进行绘制 Painting(重绘): 根据计算和获取的信息进行整个页面的绘制
- Display: 展示在页面上
4.2 回流(重排)
当 Render Tree 中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的
过程称为 回流。
4.3 重绘
由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局时(比如:color、background-color、
outline等), 称为重绘。
- 重绘不一定引起回流,而回流一定会引起重绘。
4.4 会导致回流(重排)的操作:
- 页面的首次刷新
- 浏览器的窗口大小发生改变
- 元素的大小或位置发生改变
- 改变字体的大小
- 内容的变化(如:input框的输入,图片的大小)
- 激活css伪类 (如::hover)
- 脚本操作DOM(添加或者删除可见的DOM元素)
简单理解影响到布局了,就会有回流
总结
本文重点介绍了JavaScript中的日期对象及其方法,包括如何实例化日期对象、获取和设置日期和时间、使用时间戳等。此外,还讲解了DOM节点的操作方法,包括如何插入、删除和查找节点,及其父子关系和兄弟关系。M端事件和重绘回流了解即可。
插件
别人写好的一些代码,我们只需要复制对应的代码,就可以直接实现对应的效果。
学习插件的基本过程
- 熟悉官网,了解这个插件可以完成什么需求 https://www.swiper.com.cn/
- 看在线演示,找到符合自己需求的demo https://www.swiper.com.cn/demo/index.html
- 查看基本使用流程 https://www.swiper.com.cn/usage/index.html
- 查看APi文档,去配置自己的插件 https://www.swiper.com.cn/api/index.html
- 注意: 多个swiper同时使用的时候, 类名需要注意区分