如何修改 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 中的属性、类和样式 的相关文章

  • 如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

    如何删除除以下内容之外的所有内容 字符串中的字母 数字 空格 感叹号 问号 该方法支持国际语言 UTF 8 非常重要 您可以使用正则表达式 myString replace w s g 这将替换除单词字符 空格 感叹号或问题之外的所有内容
  • 如何以 JavaScript 编程方式获取旋转的 svg 文本边界

    我正在动态渲染 SVG 图像并创建旋转文本 如果旋转的文本与其他文本重叠 我需要删除该文本 但我无法测量旋转的文本来创建边界并检查下一个标签文本区域 我创建了 3 个 SVG 元素来解释 SVG 1 显示重叠的文本 SVG 2 显示重叠的旋
  • Angular 2 测试 ng-content

    我想知道是否有办法测试ng content不创建宿主元素 例如 如果我有警报组件 Component selector app alert template div div
  • 在 Javascript 中获取文本框的值

    我有这个html代码 table border cellpadding 3 cellspacing 0 tbody tr td Song td td td tr tbody table
  • 显示来自 mongodb 的所有数据并在 doT.js 模板引擎中渲染它

    我想从 mongodb 中提取数据并将其传递给视图 一切似乎都正常 但我没有看到所有 10000 条记录都显示出来 而是只看到了一条 我觉得我非常接近解决它 但我陷入困境 我正在使用node mongodb native express和d
  • 无法读取未定义错误的属性“匹配”

    我试图在 React JS 前端显示一些文本来代替个人资料图像 当它不可用时 基本上 我将当前客户名称传递给一个函数 该函数提取名称中所有单词的第一个字符 我能够仅显示名称 但是当我执行函数调用时 出现 无法读取未定义的属性 匹配 错误 并
  • 基于 json 文件动态显示选择、复选框、日期选择器等

    对我之前的问题的补充 我根据 json 文件动态显示输入字段 现在我想根据它们的组显示选择项 复选框和日期选择器 我如何解决这个问题 我需要将这些元素推入computeJSON 但写入例如选择options item selection不管
  • 正则表达式没有按预期工作?

    我有这个正则表达式 new RegExp a z 0 9 ig 我正在测试一个不应该工作的字符串 vc 但它确实通过了测试 而且它不应该 new RegExp a z 0 9 ig test vc true 但如果我删除其中一个 or or
  • webpack 加载器并包含

    我是 webpack 的新手 我正在尝试了解加载器及其属性 例如测试 加载器 包含等 这是我在 google 中找到的 webpack config js 的示例片段 module loaders test js loader babel
  • 如何在 Angular 模板中嵌入 GitHub gist?

    角度忽略script其模板中包含标签 但加载 GitHub gist 需要它们 执行此操作的最佳做 法是什么 使用iframe 创造script动态标记 或者是其他东西 一种方法是创建一个iframe with script里面并在你希望你
  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return
  • 如何处理 React JSX 中的长类名?

    假设我在 React JSX 中渲染这个组件 render return h1 Some text h1 这些类触发我的 JS linter 的行太长 而且很难阅读 怎样才能分开长className将 React 组件中的属性分成多行而不破
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 使用XMLHttpRequest自动网页刷新内存泄漏

    问候 我一直在为一些使用 8 位微控制器的硬件开发网络界面 该网页使用 HTML javascript JSON 和 XHR XMLHttpRequest 进行通信 我想做的是创建一个页面 使用 setInterval 使用控制器中的新值每
  • 如何使用 javascript 禁用组合键?

    I would like to disable view source shortcut key for IE using JavaScript To disable Ctrl C I am using the following func
  • ES6 模板文字可以在运行时替换(或重用)吗?

    tl dr 是否可以制作可重用的模板文字 我一直在尝试使用模板文字 但我想我就是不明白 现在我感到沮丧 我的意思是 我想我明白了 但 它 不应该是它的运作方式 或者它应该如何实现 它应该变得不同 我看到的所有示例 甚至标记模板 都要求 替换
  • 允许在 Safari 上聊天应用程序使用 audio.play()

    由于苹果禁用了自动播放音频的功能HTMLMedia Element play https developer mozilla org en US docs Web API HTMLMediaElement play在没有用户交互的 java
  • Cypress.io 如何处理异步代码

    我正在将旧的水豚测试转移到 cypress io 因为我们的应用程序正在采用 SPA 方式 在我们的案例中 我们有超过 2000 个测试 涵盖了很多功能 因此 测试功能的常见模式是让用户创建并发布报价 一开始我写了 cypress 浏览页面
  • 如何在画布中旋转图表同时保持数字垂直?

    我正在尝试围绕其中心旋转画布中的图表 同时保持字母直立 我正在尝试使用 ctx rotate 但它使用画布的左侧作为中心来旋转整个图表 以下链接提供了视觉效果 我希望它看起来像绿色 而不是红色 就像我的代码当前所做的那样 视觉解释 http
  • 使用 JQueryUI Autocomplete 和 Meteor 的规范方法

    使用 Meteor 我想了解使用 JQuery UI 自动完成处理大量服务器端数据的最有效方法 我有两个工作提案 想听听关于差异的意见 以及是否有更好的方法来做同样的事情 使用发布 订阅 Server Meteor publish auto

随机推荐

  • 如何在 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 元