前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不容忽视的 8 个 DOM API

不容忽视的 8 个 DOM API

作者头像
前端小智@大迁世界
发布于 2023-08-16 00:15:31
发布于 2023-08-16 00:15:31
36000
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:0
代码可运行

文档对象模型(DOM)提供了许多强大的功能,在现代浏览器中无需外部依赖即可使用。在本文中,我们将探讨8个可能被忽视的DOM功能

1. 使用 addEventListener() 方法与 options

最常用的DOM方法之一是 addEventListener() ,它允许我们将事件监听器附加到元素上。除了事件类型和回调函数之外, addEventListener() 还接受一个 options 对象,允许我们定义其他属性。这些属性包括 captureoncepassive 。让我们进一步探讨它们。

capture

capture 属性是一个布尔值,用于确定事件处理程序在事件传播阶段中的执行顺序。当 capture 设置为 true 时,在到达目标元素之前,事件会在捕获阶段被捕获。如果设置为 false 或者省略,则事件会在冒泡阶段处理,即在事件到达目标元素之后。

once

once 属性是另一个布尔值。当设置为 true 时,表示事件监听器只会被触发一次,然后自动移除。这样就不需要使用 removeEventListener() 手动移除事件监听器了。

passive

passive 属性是一个布尔值,当设置为 true 时,表示事件监听器将永远不会调用 preventDefault() 方法,即使它包含在函数体中。这对于改善滚动和触摸事件处理程序的性能非常有用。

让我们来看一个使用 options 对象和 addEventListener() 的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const button = document.getElementById('myButton');

button.addEventListener('click', handleClick, { once: true });
function handleClick(event) {
  console.log('Button clicked!');
}

在上面的例子中, handleClick 函数只会在按钮被点击时被调用一次,这要归功于将 once 属性设置为 true 。这样就不需要手动删除事件监听器了。

2. 使用 scrollTo() 方法实现平滑滚动

scrollTo() 方法于 window 对象,并指示浏览器滚动到页面上的指定位置。默认情况下, scrollTo() 执行突然滚动,类似于使用带有指定哈希URL的本地链接。然而,通过结合 ScrollToOptions 对象,我们可以实现平滑的动画滚动效果。

看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.scrollTo({
  top: 1000,
  behavior: 'smooth'
});

在这个例子中,页面将平滑滚动到垂直位置 1000 像素。设置 behavior 属性为 'smooth' 确保滚动效果是动画的。如果 behavior 属性设置为 'auto' ,滚动将是突然的。

3. 与 classList 一起进行类操作

在JavaScript中,当与元素一起工作时,类操作是一项常见任务。 classList 属性提供了一组方法,简化了在元素上添加、删除和切换类的操作。

我们来探索一下 classList 属性上可用的一些方法:

  • add(className) :将一个类添加到元素的类列表中。
  • remove(className) :从元素的类列表中移除一个类。
  • toggle(className) :切换元素的类列表中的类的存在。
  • contains(className):检查元素是否具有特定的类。

这是一个使用这些方法的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = document.getElementById('myElement');

element.classList.add('active');
element.classList.remove('inactive');
element.classList.toggle('highlight');

console.log(element.classList.contains('active')); // true

在这个例子中,我们给 element 添加了类 'active' ,移除了类 'inactive' ,并切换了类 'highlight' 。然后, contains() 方法会检查元素是否具有类 'active'

4.matches() 元素匹配的方法

matches() 方法是一个强大的元素匹配工具。它允许我们检查一个元素是否与特定的CSS选择器匹配。

这是一个使用 matches() 方法的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = document.getElementById('myElement');

if (element.matches('.container .item')) {
  console.log('The element matches the selector');
} else {
  console.log('The element does not match the selector');
}

在这个例子中,我们检查 element 是否与选择器 .container .item 匹配。如果匹配,将记录第一条消息;否则,将记录第二条消息。

当你想根据元素是否匹配特定选择器执行某些操作时, matches() 方法非常有用。它消除了手动遍历DOM或使用复杂的CSS选择器匹配逻辑的需要。

5. 使用 dataset 访问和修改数据属性

数据属性提供了一种在HTML元素上存储自定义数据的方式。属性允许我们以编程的方式访问和操作元素上的数据属性。

考虑一个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="myElement" data-info="important"></div>

在这个例子中, <div> 元素具有一个名为 data-info 的数据属性,其值为 'important' 。我们可以使用 dataset 属性访问和修改这个数据属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = document.getElementById('myElement');

console.log(element.dataset.info); // 'important'
element.dataset.info = 'updated';
console.log(element.dataset.info); // 'updated'

在这个例子中,我们使用 dataset 属性访问 data-info 属性的值,并返回值 'important' 。我们还可以通过给 element.dataset.info 赋新值来修改该值。

6. 平滑动画的方法

在网页上为元素添加动画效果是一个常见的需求,但有时候也是一项具有挑战性的任务。 element.animate() API通过提供一种简单直接的方式来创建流畅且响应灵敏的动画,简化了这个过程。它允许我们对各种CSS属性进行动画处理,例如透明度、宽度、高度和变换,并且可以自定义时间和缓动函数。让我们来看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = document.getElementById('myElement');

element.animate(
  [
    { opacity: 0, transform: 'scale(0.5)' },
    { opacity: 1, transform: 'scale(1)' }
  ],
  {
    duration: 1000,
    easing: 'ease-in-out',
    fill: 'both'
  }
)

在上面的例子中,我们将元素的不透明度和缩放从0.5动画到1,持续时间为1000毫秒。属性 easing 定义了动画的时间函数,而 fill: 'both' 确保元素在动画完成后保持其动画状态。

animate() 方法的第二个参数有很多选项,但它们的浏览器兼容性不一致,需要额外注意。

7. 全屏模式的方法

全屏模式允许网络应用程序利用整个屏幕,提供沉浸式体验。DOM提供了 requestFullscreen() 方法,在元素上请求全屏模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = document.getElementById('myElement');

element.addEventListener('click', requestFullscreen);

const enterFullscreen = (elem, options) => {
  return elem[
    [
      'requestFullscreen',
      'mozRequestFullScreen',
      'msRequestFullscreen',
      'webkitRequestFullscreen',
    ].find((prop) => typeof elem[prop] === 'function')
  ]?.(options);
};

enterFullscreen(element);

在这个例子中,当点击 element 时,会调用 requestFullscreen() 函数,该函数尝试请求全屏模式。代码会检查不同供应商特定方法的兼容性,以确保跨浏览器支持。

8. 使用 insertAdjacentElement() 和 insertAdjacentText() 进行灵活的内容插入

虽然许多开发人员熟悉 insertAdjacentHTML() 方法,该方法允许我们将HTML或文本内容插入到相对于其他元素的特定位置,但还有两种相关的方法可以提供额外的灵活性: insertAdjacentElement()insertAdjacentText()

insertAdjacentElement() 方法允许我们将一个元素插入到指定位置的DOM中,同时将其从原始位置移除。这提供了一种方便的方式,在DOM内部将一个元素从一个地方转移到另一个地方。让我们看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const targetElement = document.getElementById('target');
const newElement = document.createElement('div');
newElement.textContent = 'New Element';

targetElement.insertAdjacentElement('beforebegin', newElement);

在这个例子中, insertAdjacentElement() 方法在 targetElement 之前插入 newElement 。同时, newElement 也从DOM的原始位置移除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const targetElement = document.getElementById('target');
const text = 'Hello, <strong>World!</strong>';

targetElement.insertAdjacentText('beforeend', text);

在这种情况下, insertAdjacentText() 方法将 text 作为文本节点插入到 targetElement 中。任何特殊字符,如HTML标签,都会以HTML实体的形式插入,保留其文本表示。

所有三种方法 - insertAdjacentHTML() insertAdjacentElement()insertAdjacentText() - 都接受相同的第一个参数值,用于确定插入内容相对于目标元素的位置。选项有 'beforebegin' , 'afterbegin' , 'beforeend' 和 'afterend' 。

总结

通过理解和利用这些特性,我们可以增强您的网络应用的功能和互动性。随着继续探索DOM的广泛能力,你将发现更多隐藏的宝藏。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Nacos 本地单机版部署步骤和使用
本系列是 Spring Cloud 微服务实战系列教程。之前在 《Spring Cloud Eureka 入门 (一)服务注册中心详解》 聊过 Spring Cloud Eureka。那今天聊聊阿里开源的 Nacos ~
二哥聊运营工具
2021/12/16
1.8K0
Nacos 本地单机版部署步骤和使用
【Java】Nacos安装与使用
地址:https://github.com/alibaba/nacos/releases
DevFrank
2024/07/24
2140
【Java】Nacos安装与使用
SpringCloud--alibliba--Nacos--下
注意,这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
大忽悠爱学习
2021/12/07
7010
SpringCloud--alibliba--Nacos--下
【开发日记】Nacos安装踩坑日记
官方地址:https://github.com/alibaba/nacos/releases
全栈开发日记
2022/08/30
1.1K0
【开发日记】Nacos安装踩坑日记
Centos7下安装Nacos2.0
可以转到下边链接下载 https://www.sky12580.cn/archives/yum-an-zhuang-jdk8
高大北
2022/06/14
6620
Centos7下安装Nacos2.0
微服务搭建-配置中心Nacos
目前测试成功的是SpringBoot 2.3.12.RELEASE 版本,更高的版本还不行。
码客说
2022/02/18
8590
1搭建nacos
nacos的官方仓库地址:https://github.com/alibaba/nacos.git
DH镔
2020/03/17
7520
Nacos服务注册和配置中心
下面的项目是 SpringBoot2.2.2 + springcloud-alibaba 2.1.0
CBeann
2023/12/25
2840
Nacos服务注册和配置中心
linux下部署nacos
官网文档地址:https://nacos.io/zh-cn/docs/deployment.html github地址:https://github.com/alibaba/nacos
修己xj
2023/08/25
4470
linux下部署nacos
【nacos系列】windows安装与配置nacos
nacos GitHub下载安装服务:https://github.com/alibaba/nacos/releases 如图:
沁溪源
2021/09/07
14K0
面试题55:如何为Nacos配置外置MySQL连接?
当我们使用Nacos作为配置信息的时候,我们希望能够对配置信息进行更好的数据管理,那么默认的Nacos是将nacos-server作为分布式配置中心的数据存储到了一个叫做derby的内嵌数据库到Java应用程序中了。但是它并不便于管理。Nacos提供了可以配置外部MySQL来存储配置数据。若要Nacos使用外部MySQL存储配置数据,那么需要进行如下操作:
爪哇缪斯
2023/05/10
8130
面试题55:如何为Nacos配置外置MySQL连接?
运行单机模式Nacos
可以使用2种方式运行单机模式的Nacos服务:编译后的压缩包,从源码启动。 如下运行模式基于MySQL数据库,启动Nacos成功之后访问http://127.0.0.1:8848即可访问管理后台,默认用户名和密码均为nacos。
编程随笔
2024/03/25
1900
Nacos 服务发现、配置管理和服务管理平台
据说Nacos在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验。
用户9615083
2022/12/25
1.2K0
Nacos 服务发现、配置管理和服务管理平台
一、SpringCloudAlibaba环境搭建
访问地址:https://github.com/alibaba/nacos 本人下载的时候最新的release版本是1.4.1版本
云叶知秋
2021/03/08
2K0
一、SpringCloudAlibaba环境搭建
java架构之路-(微服务专题)初步认识微服务与nacos初步搭建
  以前我们都是一个war包,包含了很多很多的代码,反正我开始工作的时候做的就是这样的项目,一个金融系统,代码具体多少行记不清楚了,内部功能超多,但是实际能用到的不多,代码冗余超大,每次部署大概要10分钟以上。
小菜的不能再菜
2020/02/21
4700
Nacos 学习笔记2 - 搭建 Nacos 集群
Nacos集群的搭建时要注意:1.xx 版本和 2.xx 版本有区别。从2.0开始Nacos使用了 gRPC ,需要开放额外的端口。我就遇到了 各个 Nacos 节点无法互相复制,注册的服务不一致的情况。
张云飞Vir
2021/12/06
2.3K0
Nacos 学习笔记2 - 搭建 Nacos 集群
nacos集群开箱搭建-linux版本搭建
nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单而言,它可以实现类似zookeeper做注册中心的功能,也就是可以在springcloud领域替代Eureka、consul等角色,同时,还可以充当springcloud config配置中心的功能,当然,还可以替代Spring Cloud Bus做消息总线的功能,你看,他一个人就能干多份活,如果你是老板,你会不喜欢这样的员工吗?
朱季谦
2022/03/09
2.3K0
nacos集群开箱搭建-linux版本搭建
分布式事务:SpringBoot+Dubbo+Seata+Nacos 实现案例
案例源码使用SpringBoot 2.3.2 + Dubbo 2.7.6 + Mybatis 1.3.2 + Nacos 1.3.2 + Seata 1.3.0整合来实现Dubbo分布式事务管理,使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据库。
朝雨忆轻尘
2020/11/24
1.4K0
分布式事务:SpringBoot+Dubbo+Seata+Nacos 实现案例
配置中心Nacos
Nacos 是阿里巴巴2018年7月份开源的项目,如其名, Naming Configuration Service ,专注于服务发现和配置管理领域。
1850810
2021/06/07
7520
Nacos的高可用部署
目标:Nacos的高可用部署 工具:XShell、云服务器(或者虚拟机)、Nacos安装包 学习目标:部署Nacos
背雷管的小青年
2020/06/08
1.9K0
Nacos的高可用部署
相关推荐
Nacos 本地单机版部署步骤和使用
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验