如何修改 DOM 中的属性、类和样式

2023-11-18

介绍

在本教程之前的教程中series, “如何更改 DOM”,我们介绍了如何使用内置方法从文档对象模型 (DOM) 中创建、插入、替换和删除元素。通过提高操作 DOM 的熟练程度,您可以更好地利用 JavaScript 的交互功能并修改 Web 元素。

在本教程中,您将学习如何通过修改 HTML 元素节点的样式、类和其他属性来进一步更改 DOM。这将使您更好地了解如何操作 DOM 中的基本元素。

选择元素的回顾

直到最近,一个流行的 JavaScript 库称为jQuery最常用于选择和修改 DOM 中的元素。 jQuery 简化了选择一个或多个元素并同时对所有元素应用更改的过程。在 ”如何访问 DOM 中的元素,”我们回顾了在普通 JavaScript 中抓取和使用节点的 DOM 方法。

回顾,document.querySelector() and document.getElementById()是用于访问单个元素的方法。用一个divid在下面的示例中,我们可以通过任何一种方式访问​​该元素。这querySelector()方法更加健壮,因为它可以通过任何类型的选择器选择页面上的元素。

给定 HTML:

<div id="demo-id">Demo ID</div>

我们可以使用以下方式访问该元素querySelector()方法如下:

// Both methods will return a single element
const demoId = document.querySelector('#demo-id');

访问单个元素,我们可以轻松更新元素的一部分,例如内部的文本。

// Change the text of one element
demoId.textContent = 'Demo ID text updated.';

但是,当通过公共选择器访问多个元素(例如特定类)时,您必须循环遍历列表中的所有元素。下面的代码中有两个div具有共同类值的元素。

<div class="demo-class">Demo Class 1</div>
<div class="demo-class">Demo Class 2</div>

您可以使用querySelectorAll()抓取所有元素demo-class应用于他们,并且forEach()循环遍历它们并应用更改。也可以通过以下方式访问特定元素querySelectorAll()与处理数组的方式相同——使用方括号表示法。

// Get a NodeList of all .demo elements
const demoClasses = document.querySelectorAll('.demo-class');

// Change the text of multiple elements with a loop
demoClasses.forEach(element => {
  element.textContent = 'All demo classes updated.';
});

// Access the first element in the NodeList
demoClasses[0];

Note:方法getElementsByClassName() and getElementsByTagName()将返回无法访问的 HTML 集合forEach()方法querySelectorAll()有。在这些情况下,您将需要使用标准for loop迭代集合。

这是从 jQuery 发展到普通 JavaScript 时需要注意的最重要的区别之一。重要的是要注意将这些方法和属性应用于多个元素的过程。

本教程涵盖了用于修改的属性和方法属性的元素。这些属性和方法通常会附加到事件监听器以便响应点击、悬停或其他触发器。

修改属性

属性是包含有关 HTML 元素的附加信息的值。他们通常进来名称/值成对,并且可能是必需的,具体取决于元素。

一些最常见的 HTML 属性是src的属性img标签,该href of an a标签,以及class, id, and style属性。有关 HTML 属性的完整列表,请查看属性列表在 Mozilla 开发者网络上。不属于 HTML 标准的自定义元素将添加前缀data- or aria-.

在 JavaScript 中,我们有四种修改元素属性的方法:

Method Description Example
hasAttribute() Returns a true or false boolean element.hasAttribute('href');
getAttribute() Returns the value of a specified attribute or null element.getAttribute('href');
setAttribute() Adds or updates value of a specified attribute element.setAttribute('href', 'index.html');
removeAttribute() Removes an attribute from an element element.removeAttribute('href');

让我们创建一个新的 HTML 文件img具有一个属性的标签。我们将链接到通过 URL 提供的公共图像,但如果您离线工作,则可以将其替换为备用本地图像。

属性.html
<!DOCTYPE html>
<html lang="en">
<body>

	<img src="https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png">

</body>

</html>

当您将上述 HTML 文件加载到现代 Web 浏览器并打开内置开发者控制台,您应该看到类似这样的内容:

First rendering of classes.html

现在,您可以即时测试所有属性方法。

// Assign image element
const img = document.querySelector('img');

img.hasAttribute('src');                // returns true
img.getAttribute('src');                // returns "...shark.png"
img.removeAttribute('src');             // remove the src attribute and value

此时,您将已经删除了src关联的属性和值img,但您可以重置该属性并将该值分配给备用图像img.setAttribute():

img.setAttribute('src', 'https://js-tutorials.nyc3.digitaloceanspaces.com/octopus.png');

Second rendering of classes.html

最后,我们可以直接修改属性,通过为属性分配新值作为元素的属性,设置src回到shark.png file

img.src = 'https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png';

任何属性都可以通过这种方式以及上述方法进行编辑。

The hasAttribute() and getAttribute()方法通常与条件语句,以及setAttribute() and removeAttribute()方法用于直接修改 DOM。

修改类

The class属性对应于CSS 类选择器。这不要与ES6 类,一种特殊类型的 JavaScript 函数。

CSS 类用于将样式应用于多个元素,这与每个页面只能存在一次的 ID 不同。在 JavaScript 中,我们有className and classList属性与类属性一起使用。

Method/Property Description Example
className Gets or sets class value element.className;
classList.add() Adds one or more class values element.classList.add('active');
classList.toggle() Toggles a class on or off element.classList.toggle('active');
classList.contains() Checks if class value exists element.classList.contains('active');
classList.replace() Replace an existing class value with a new class value element.classList.replace('old', 'new');
classList.remove() Remove a class value element.classList.remove('active');

创建另一个 HTML 文件以使用包含两个元素和几个类的类方法。此外,还包括一个内联 CSS 样式表来提供一些样式来帮助我们查看工作结果。

类.html
<!DOCTYPE html>
<html lang="en">

<style>
	body {
		max-width: 600px;
		margin: 0 auto;
		font-family: sans-serif;
	}
	.active {
		border: 2px solid blue;
	}

	.warning {
		border: 2px solid red;
	}

	.hidden {
		display: none;
	}

	div {
		border: 2px dashed lightgray;
		padding: 15px;
		margin: 5px;
	}
</style>

<body>

	<div>Div 1</div>
	<div class="active">Div 2</div>

</body>

</html>

当您打开classes.html将文件导入到 Web 浏览器中,您应该会收到类似于以下内容的渲染:

First rendering of classes.html

The className引入属性是为了防止与classJavaScript 和其他可以访问 DOM 的语言中存在的关键字。您可以使用className直接给类赋值。

// Select the first div
const div = document.querySelector('div');

// Assign the warning class to the first div
div.className = 'warning';

通过分配warningCSS 值中定义的类classes.html到第一个div,您将收到以下输出:

Second rendering of classes.html

Note:如果元素上已经存在任何类,这将覆盖它们。您可以使用以下命令添加多个空格分隔的类className属性,或者在不使用赋值运算符的情况下使用它来获取元素上类的当前值。

修改类的另一种方法是通过classList属性,它附带了一些有用的方法。这些方法与 jQuery 类似addClass, removeClass, and toggleClass方法。

// Select the second div by class name
const activeDiv = document.querySelector('.active');

activeDiv.classList.add('hidden');                // Add the hidden class
activeDiv.classList.remove('hidden');             // Remove the hidden class
activeDiv.classList.toggle('hidden');             // Switch between hidden true and false
activeDiv.classList.replace('active', 'warning'); // Replace active class with warning class

执行上述方法后,您的网页将如下所示:

Final rendering of classes.html

因为activeDiv元素仍然有类hidden应用到它,它不会显示在页面上。

与在className例如,使用classList.add()会将新类添加到现有类列表中。您还可以添加多个类作为逗号分隔的字符串。也可以使用setAttribute修改元素的类。

修改样式

The style属性表示 HTML 元素上的内联样式。通常,样式将通过样式表应用于元素,就像本文前面所做的那样,但有时您必须直接添加或编辑内联样式。

创建一个新文件来演示使用 JavaScript 的编辑样式。使用下面包含的内容div应用了一些内联样式来显示正方形。

样式.html
<!DOCTYPE html>
<html lang="en">

<body>

	<div style="height: 100px;
	            width: 100px;
	            border: 2px solid black;">Div</div>

</body>

</html>

当在网络浏览器中打开时,styles.html看起来像这样:

First rendering of styles.html

编辑样式的一种选项是setAttribute().

// Select div
const div = document.querySelector('div');

// Apply style to div
div.setAttribute('style', 'text-align: center');

但是,这将从元素中删除所有现有的内联样式。由于这可能不是预期的效果,因此最好使用style直接属性

div.style.height = '100px';
div.style.width = '100px';
div.style.border = '2px solid black';

CSS 属性以短横线形式编写,即用破折号分隔的小写单词。但是,短横线 CSS 属性不能在 JavaScript 样式属性上使用,因为破折号-用于减法。相反,它们将被替换为对应的驼峰命名法,即第一个单词为小写,所有后续单词均大写。换句话说,而不是text-align use textAlignJavaScript 样式属性。

// Make div into a circle and vertically center the text
div.style.borderRadius = '50%';
div.style.display = 'flex';
div.style.justifyContent = 'center';
div.style.alignItems = 'center';

完成以上风格修改后,你的最终效果图styles.html将显示一个圆圈:

Final rendering of styles.html

如果要对元素应用许多样式更改,最好的做法是将样式应用到样式表中的单独类,然后将该类添加到元素中。但是,在某些情况下,修改内联样式属性是必要的或更直接的。

结论

HTML 元素通常以属性的形式分配有附加信息。属性可能由名称/值对组成,一些最常见的属性是class and style.

在本教程中,您学习了如何使用纯 JavaScript 访问、修改和删除 DOM 中 HTML 元素的属性。您还学习了如何在元素上添加、删除、切换和替换 CSS 类,以及如何编辑内联 CSS 样式。如需更多阅读,请查看有关的文档属性在 Mozilla 开发者网络上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修改 DOM 中的属性、类和样式 的相关文章

  • createHTMLNotification() 替换

    我创建了一个 Chrome 扩展程序 其中使用createHTMLNotification 在所有内容之上显示一个窗口 然而 从 Chrome 28 开始 谷歌决定放弃createHTMLNotification 完全 为什么 谷歌 为什么
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • Angular.js:如何从无序列表中获取 orderBy 或过滤器来工作?

    尝试根据价格和评级 在返回的对象中 进行排序 我宁愿用 ng click 和 li 来代替使用选择菜单 有没有办法做到这一点 我环顾四周 这是我能想到的最接近的 ul class restaurant filter li i class i
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green

随机推荐

  • 如何在 CentOS 7 上安装 Atom 文本编辑器

    Atom是由GitHub开发的开源跨平台代码编辑器 它有一个内置的包管理器 嵌入Git控制 智能自动完成 语法突出显示和多个窗格 从本质上讲 Atom 是一个基于 Electron 构建的桌面应用程序 使用 HTML JavaScript
  • 如何在 Ubuntu 20.04 上安装 Git

    Git 是世界上最流行的分布式版本控制系统 被许多开源和商业项目使用 它允许您与其他开发人员协作进行项目 跟踪代码更改 恢复到之前的阶段 创建分支 和更多 Git 最初是由莱纳斯 托瓦尔兹Linux内核的创建者 本指南介绍如何在 Ubunt
  • 如何在 Ubuntu 18.04 上安装 VirtualBox 来宾添加

    虚拟盒子是一款开源 跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组可以安装在来宾操作系统中的驱动程序和应用程序 VirtualBox Guest Additions 来宾添加为来宾计算机提供了多种
  • Linux 类型命令

    The type命令用于显示有关命令类型的信息 它将向您展示在命令行上键入给定命令时将如何解释 在这篇文章中 我们将解释如何使用Linuxtype命令 如何使用 type 命令 type是 Bash 和其他 shell 如 Zsh 和 Ks
  • 如何在 CentOS 7 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个基于 PHP 的开源工具 用于通过基于 Web 的界面管理 MySQL 和 MariaDB 服务器 phpMyAdmin 允许您与 MySQL 数据库交互 管理用户帐户和权限 执行 SQL 语句 以各种数据格式导
  • 如何在 Ubuntu 20.04 上设置 Nginx 服务器块

    服务器块是一种 Nginx 指令 它定义特定域的设置 允许您在一台服务器上运行多个网站 对于每个网站 您可以设置网站文档根目录 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Ubuntu 20 04
  • 如何在 CentOS 7 上添加和删除用户

    CentOS 以及所有其他 Linux 发行版都是一个多用户操作系统 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 了解如何添加和删除用户是每个 Linux 用户应该了解的基本技能之一 在本教程中 我们将解释如何
  • 如何在树莓派上安装和使用 Docker

    Docker 是一个容器化平台 允许您快速构建 测试和部署应用程序作为可移植 自给自足的容器 几乎可以在任何地方运行 在本教程中 我们将解释如何在 Raspberry Pi 上安装 Docker 并探索基本的 Docker 概念和命令 先决
  • 如何在 Ubuntu 18.04 上使用 Apache 安装和配置 Nextcloud

    下一云是一个开源 自托管的文件共享和协作平台 类似于 Dropbox 它捆绑了媒体播放器 日历和联系人管理 Nextcloud 可通过应用程序进行扩展 并拥有适用于所有主要平台的桌面和移动客户端 在本教程中 我们将向您展示如何在 Ubunt
  • 了解 /etc/passwd 文件

    Linux 系统上可以使用多种不同的身份验证方案 最常用和标准的方案是针对 etc passwd and etc 影子 files etc passwd是一个基于纯文本的数据库 包含系统上所有用户帐户的信息 这是owned第 644 章权限
  • 如何在 Debian 9 上使用 UFW 设置防火墙

    Debian 包含多个软件包 这些软件包提供了用于管理防火墙的工具 其中 iptables 作为基本系统的一部分安装 对于初学者来说 学习如何使用 iptables 工具正确配置和管理防火墙可能很复杂 但 UFW 简化了它 UFW Unco
  • 如何在 Ubuntu 14.04 服务器上安装 ISPConfig3

    介绍 尽管命令行是一个功能强大的工具 可以让您在许多情况下快速轻松地工作 但在某些情况下 可视化界面会很有帮助 如果您要在一台计算机上配置许多不同的服务 或者为客户端管理系统的某些部分 则可以使用诸如ISP配置可以使这个任务变得更加简单 I
  • 如何在 CentOS 7 上安装 Git

    介绍 版本控制已成为现代软件开发中不可或缺的工具 版本控制系统允许您在源代码级别跟踪您的软件 您可以跟踪更改 恢复到之前的阶段以及从基本代码分支以创建文件和目录的替代版本 最流行的版本控制系统之一是git 许多项目在 Git 存储库中维护其
  • 什么是 Kubernetes?

    介绍 Kubernetes 是一个功能强大的开源系统 最初由 Google 开发 并得到云原生计算基金会 CNCF 的支持 用于在集群环境中管理容器化应用程序 它旨在提供更好的方法来管理跨不同基础设施的相关分布式组件和服务 要了解有关 Ku
  • 使用 Debian 9 进行初始服务器设置

    介绍 当您首次创建新的 Debian 9 服务器时 您应该尽早执行一些配置步骤作为基本设置的一部分 这将提高服务器的安全性和可用性 并为您后续的操作奠定坚实的基础 第一步 以 root 身份登录 要登录您的服务器 您需要知道您的服务器的公共
  • 如何使用 DigitalOcean 云服务器创建虚荣或品牌名称服务器

    介绍 托管提供商或经销商特别感兴趣 拥有品牌或 虚荣域名服务器为客户提供了更专业的外观 它 无需要求您的客户将其域名指向另一个域名 公司的域名服务器 本教程将概述两种创建方法 自定义域名服务器 i 虚荣和 ii 品牌 Types 虚荣名称服
  • 如何在 Ubuntu 18.04 上安装 MySQL

    本教程的先前版本由以下人员编写榛子维尔多 介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来
  • 如何使用 passwd 和 adduser 在 Linux VPS 上管理密码

    介绍 密码和身份验证是每个用户在 Linux 环境中工作时必须处理的概念 这些主题涵盖许多不同的配置文件和工具 在本指南中 我们将探索一些基本文件 例如 etc passwd 和 etc shadow 以及用于配置身份验证的工具 例如名称恰
  • 如何在 VPS 上安装和使用 Logwatch 日志分析器和报告器

    介绍 应用程序创建所谓的 日志文件 来跟踪在任何给定时间发生的活动 这些文件远非简单的文本输出 浏览起来可能非常复杂 特别是当所管理的服务器很繁忙时 当需要参考日志文件时 例如 在发生故障 数据丢失等情况下 利用所有可用的帮助变得至关重要
  • 如何修改 DOM 中的属性、类和样式

    介绍 在本教程之前的教程中series 如何更改 DOM 我们介绍了如何使用内置方法从文档对象模型 DOM 中创建 插入 替换和删除元素 通过提高操作 DOM 的熟练程度 您可以更好地利用 JavaScript 的交互功能并修改 Web 元