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 插入节点

可以使用appendChildinsertBefore等方法在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节点,包括getElementByIdgetElementsByClassNamegetElementsByTagNamequerySelectorquerySelectorAll等。

示例
<!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 父子关系

可以使用parentNodechildNodes属性来获取父节点和子节点。

示例
<!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 兄弟关系

可以使用nextSiblingpreviousSibling属性来获取相邻的兄弟节点。

示例
<!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端事件和重绘回流了解即可。

插件

别人写好的一些代码,我们只需要复制对应的代码,就可以直接实现对应的效果。
学习插件的基本过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值