JavaScript的DOM操作(二)

news2024/11/20 4:29:44

一、元素的特性attribute

1.元素的属性和特性

前面我们已经学习了如何获取节点,以及节点通常所包含的属性,接下来我们来仔细研究元素Element。

我们知道,一个元素除了有开始标签结束标签内容之外,还有很多的属性(attribute)

浏览器在解析HTML元素时,会将对应的attribute也创建出来放到对应的元素对象上。

  • 比如id、class就是全局的attribute,会有对应的id、class属性;
  • 比如href属性是针对a元素的,type、value属性是针对input元素的;

接下来我们学习一下如何获取和设置这些属性。

2.attribute的分类

属性attribute的分类:

  • 标准的attribute:某些attribute属性是标准的,比如id、class、href、type、value等;
  • 非标准的attribute:某些attribute属性是自定义的,比如abc、age、height等;
  <div class="box" id="main" name="kobe" abc="def" age="18">
    哈哈哈哈
  </div>

3.attribute的操作

对于所有的attribute访问都支持如下的方法:

  • elem.hasAttribute(name) — 检查特性是否存在。
  • elem.getAttribute(name) — 获取这个特性值。
  • elem.setAttribute(name, value) — 设置这个特性值。
  • elem.removeAttribute(name) — 移除这个特性。
  • attributes:attr对象的集合,具有name、value属性;

attribute 具备以下特征:

  • 它们的名字是大小写不敏感的(id 与 ID 相同)。
  • 它们的值总是字符串类型的。

4.元素的属性(property)

对于标准的attribute,会在DOM对象上创建与其对应的property属性:

console.log(boxE1.id,boxEl.className) //box main
console.log(boxEl.abc, boxEl.age, boxEl.height) // undefined...

在大多数情况下,它们是相互作用的

  • 改变property,通过attribute获取的值,会随着改变;
  • 通过attribute操作修改,property的值会随着改变;
    • 但是input的value修改只能通过attribute的方法;

除非特别情况,大多数情况下,设置、获取attribute,推荐使用property的方式:

  • 这是因为它默认情况下是有类型的;
toggleBtn.onclick = function () {
    checkBoxInput.checked = !checkBoxInput.checked;
}

5.HTML5的data-*自定义属性

前面我们有学习HTML5的data-*自定义属性,那么它们也是可以在dataset属性中获取到的:

// data-*
console.log(div2El.dataset);//DOMStringMap
console.log(typeof div2El.dataset);//object
console.log(div2El.dataset.name, div2El.dataset.age);

二、元素的class、style

1.JavaScript动态修改样式

有时候我们会通过JavaScript来动态修改样式,这个时候我们有两个选择:

  • 选择一:在CSS中编写好对应的样式,动态的添加class
  • 选择二:动态的修改style属性;

开发中如何选择呢?

  • 在大多数情况下,如果可以动态修改class完成某个功能,更推荐使用动态class
  • 如果对于某些情况,无法通过动态修改class(比如精准修改某个css属性的值),那么就可以修改style属性;

接下来,我们对于两种方式分别来进行学习。

2.元素的className和classList

元素的class attribute,对应的property并非叫class,而是className

  • 这是因为JavaScript早期是不允许使用class这种关键字来作为对象的属性,所以DOM规范使用了className;
  • 虽然现在JavaScript已经没有这样的限制,但是并不推荐,并且依然在使用className这个名称;

我们可以对className进行赋值,它会替换整个类中的字符串。

var boxE1 = document.querySelector(".box");
boxE1.className = "why abc";

如果我们需要添加或者移除单个的class,那么可以使用classList属性。

elem.classList 是一个特殊的对象

  • elem.classList.add(class) :添加一个类
  • elem.classList.remove(class):添加/移除类。
  • elem.classList.toggle(class) :如果类不存在就添加类,存在就移除它。
  • elem.classList.contains(class):检查给定类,返回 true/false。

classList是可迭代对象,可以通过for of进行遍历。

3.元素的style属性

如果需要单独修改某一个CSS属性,那么可以通过style来操作:

  • 对于多词(multi-word)属性,使用驼峰式 (camelCase )
boxEl.style.width = "100px';
boxEl.style.height = "50px";
boxE1.style.backgroundColor = "red";

如果我们将值设置为空字符串,那么会使用CSS的默认样式

boxEl.style.display = "";

多个样式的写法,我们需要使用cssText属性:

h1El.style.color = "blue";
h1El.style.border = "1px solid red";
// 会覆盖上面的color和border配置
h1El.style.cssText = "font-size: 24px";
  • 不推荐这种用法,因为它会替换整个字符串;
// 1.在property中使用的驼峰格式
// console.log(boxEl.style.backgroundColor)

// 2.如果将一个属性的值, 设置为空的字符串, 那么是使用默认值
// boxEl.style.display = ""
// boxEl.style.fontSize = ""

// 3.设置多个样式
// boxEl.style.fontSize = "30px"
// boxEl.style.color = "red"
boxEl.style.cssText = "font-size: 30px; color: red;"

4.元素style的读取 - getComputedStyle

如果我们需要读取样式:

  • 对于内联样式,是可以通过style.*的方式读取到的;
  • 对于style、css文件中的样式,是读取不到的;

这个时候,我们可以通过getComputedStyle的全局函数来实现:

console.log(getComputedStyle(boxEl).fontSize)

四、元素的常见操作

1.创建元素

前面我们使用过 document.write 方法写入一个元素:

  • 这种方式写起来非常便捷,但是对于复杂的内容元素关系拼接并不方便;
  • 它是在早期没有DOM的时候使用的方案,目前依然被保留了下来;

那么目前我们想要插入一个元素,通常会按照如下步骤:

  • 步骤一:创建一个元素;
  • 步骤二:插入元素到DOM的某一个位置;

创建元素: document.createElement(tag)

 // 创建元素
var div1El = document.createElement("div");
div1El.textContent = "我是div元素";
div1El.style.color = "red";
div1El.style.fontSize = "18px";

2.插入元素

插入元素的方式如下:

  • node.append(...nodes or strings) —— 在 node 末尾 插入节点或字符串,
  • node.prepend(...nodes or strings) —— 在 node 开头 插入节点或字符串,
  • node.before(...nodes or strings) —— 在 node 前面 插入节点或字符串,
  • node.after(...nodes or strings) —— 在 node 后面 插入节点或字符串,
  • node.replaceWith(...nodes or strings) —— 将 node 替换为给定的节点或字符串。

在这里插入图片描述

3.移除和克隆元素

移除元素我们可以调用元素本身的remove方法:

如果我们想要复制一个现有的元素,可以通过cloneNode方法:

  • 可以传入一个Boolean类型的值,来决定是否是深度克隆
  • 深度克隆会克隆对应元素的子元素,否则不会;
<body>
  
  <button class="remove-btn">移除box</button>
  <button class="clone-btn">复制box</button>

  <div class="box">
    <h2>我是标题</h2>
    <p>我是文本, 哈哈哈哈哈</p>
  </div>

  <script>

    // 1.获取元素
    var boxEl = document.querySelector(".box")
    var removeBtnEl = document.querySelector(".remove-btn")
    var cloneBtnEl = document.querySelector(".clone-btn")

    // 2.监听removeBtn的点击
    removeBtnEl.onclick = function() {
      boxEl.remove()
    }

    // 3.复制box
    var counter = 0
    cloneBtnEl.onclick = function() {
      var newNode = boxEl.cloneNode(true)
      newNode.children[0].textContent = "我是标题" + counter
      // boxEl.after(newNode)
      document.body.append(newNode)

      counter++
    }

  </script>

</body>

4.旧的元素操作方法

在很多地方我们也会看到一些旧的操作方法:

  • parentElem.appendChild(node)
    • 在parentElem的父元素最后位置添加一个子元素
  • parentElem.insertBefore(node, nextSibling)
    • 在parentElem的nextSibling前面插入一个子元素;
  • parentElem.replaceChild(node, oldChild)
    • 在parentElem中,新元素替换之前的oldChild元素;
  • parentElem.removeChild(node)
    • 在parentElem中,移除某一个元素;

5.元素的大小和滚动

clientWidth:contentWith+padding(不包含滚动条)

clientHeight:contentHeight+padding

clientTop:border-top的宽度

clientLeft:border-left的宽度

offsetWidth:元素完整的宽度

offsetHeight:元素完整的高度

offsetLeft:距离父元素的x

offsetHeight:距离父元素的y

scrollHeight:整个可滚动的区域高度

scrollTop:滚动部分的高度

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      padding: 100px;
    }

    .box {
      width: 100px;
      height: 100px;
      padding: 20px;
      border: 10px solid red;
      /* box-sizing: border-box; */
      background-color: orange;

      overflow: auto;
    }
  </style>
</head>
<body>
  
  <div class="box">
    你去过国内最美的地方是哪# 我去过国内最美的地方是新疆喀纳斯。喀纳斯是一个美丽而神秘的地方,这里群山环抱,森林密布,湖水清澈,风景奇特。为国家级5A级景区,国家地质公园,国家森林公园。
  </div>

  <script>

    var boxEl = document.querySelector(".box")

    // 1.获取样式(局限性很强)
    var boxStyle = getComputedStyle(boxEl)
    console.log(boxStyle.width, boxStyle.height)

    // 2.获取更多信息
    console.log(boxEl.clientWidth)
    console.log(boxEl.clientHeight)

    console.log(boxEl.clientLeft)
    console.log(boxEl.clientTop)

    console.log(boxEl.offsetWidth)
    console.log(boxEl.offsetHeight)

    console.log(boxEl.offsetLeft)
    console.log(boxEl.offsetTop)

    console.log(boxEl.scrollHeight)
    console.log(boxEl.scrollTop)

    // window对象
    window.onclick = function() {
      console.log(boxEl.scrollTop)
    }

  </script>

</body>
</html>

五、window的大小和滚动

window的width和height

  • innerWidthinnerHeight:获取window窗口的宽度和高度(包含滚动条)
  • outerWidthouterHeight:获取window窗口的整个宽度和高度(包括调试工具、工具栏)
  • documentElement.clientHeightdocumentElement.clientWidth:获取html的宽度和高度(不包含滚动条)

window的滚动位置:

  • scrollX:X轴滚动的位置(别名pageXOffset)
  • scrollY:Y轴滚动的位置(别名pageYOffset)

也有提供对应的滚动方法:

  • 方法 scrollBy(x,y) :将页面滚动至 相对于当前位置的 (x, y) 位置;
  • 方法 scrollTo(pageX,pageY) 将页面滚动至 绝对坐标;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

influxdb2.7基本介绍安装与启动

概念 timestamp: influxdb所有的数据都会有一个列_time来存timestamp。默认是以nanosecond格式存储的。field: field就是mysql中的字段&#xff0c;field key存储在_field字段中&#xff0c;field value就是字段值&#xff0c;存储在_value字段中。field key和field value对组…

【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数

在Java编程中&#xff0c;可变参数是一项强大的功能&#xff0c;它允许你编写更加灵活的方法&#xff0c;接受不定数量的参数。本文将详细解释Java可变参数的用法、语法以及最佳实践。 什么是可变参数&#xff1f; 可变参数是Java 5引入的一项功能&#xff0c;它允许你在方法…

【AIGC】提示词 Prompt 分享

提示词工程是什么&#xff1f; Prompt engineering&#xff08;提示词工程&#xff09;是指在使用语言模型进行生成性任务时&#xff0c;设计和调整输入提示&#xff08;prompts&#xff09;以改善模型生成结果的过程。它是一种优化技术&#xff0c;旨在引导模型产生更加准确、…

腾讯mini项目-【指标监控服务重构】2023-07-17

今日已办 根据导师的指导意见 修改了otelclient相关配置的代码 认真学习uptrace的文档&#xff0c;会比otel、signoz的好理解&#xff1a; 什么是OpenTelemetry https://uptrace.dev/opentelemetry/architecture.html#opentelemetry-sdk trace部分介绍 https://uptrace.dev/o…

Vue3上 使用腾讯地图 基础展示

一,注册账号 申请key值 第one步 先注册 腾讯位置服务 - 立足生态&#xff0c;连接未来 (qq.com) 第two步 注册key!!!!! 并选择开发参考的开发文档 选择类型 添加成功后会在我的应用里看到你的key值 第三步 (因为我这里是在pc端使用 就直接只用Web端文档了) 二,加载地图 …

【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

前言 书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客&#xff0c;前面我们做了基础版的报文收发&#xff0c;相信对逻辑设计有了一定的认知&#xff0c;在此基础上&#xff0c;继续完善一个实际报文收发可能会遇到的一些处理&#xff1a; 报文处理握手…

布隆过滤器 python3 pybloom_live使用例子 存储开销

1. 安装pybloom_live from pybloom_live import BloomFilter# 创建一个Bloom过滤器对象 # 错误率&#xff08;False Positive Rate&#xff09;在布隆过滤器中指的是&#xff0c;不存在的元素被错误地认为存在于集合中的概率 bf BloomFilter(capacity10000, error_rate0.001)#…

IntelliJ IDEA使用_常规设置

文章目录 版本说明主题设置取消检查更新依赖自动导入禁止import xxx.*、允许import内部类显示行号、方法分割线、空格代码提示&#xff08;匹配所有字母&#xff09;自定义注释颜色添加头部注释自定义字体设置字符编码关联本地GitJDK编译版本Maven配置Tomcat配置代码注释设置头…

iPhone 15秋季发布会召开,媒介盒子多家媒体持续报道

现如今互联网引流成本越来越高不说,难度越来越大,大多数都是投入巨大,收效甚微。因此,用有限的成本带来高回报的效果成为企业共同的追求。 当然,企业想要产品服务引流绝非易事。 为什么你的品牌营销不见效?新产品上市要怎么做宣传?盒子以新发布的苹果15为例分析,给你一些启…

bootstrap按钮

<!--1、可以转换成按钮的元素--> <!--可能使用 <button> 元素来获得在各个浏览器上获得相匹配的绘制效果--> <a class"btn btn-default">按钮a标签</a> <button class"btn btn-default">按钮button标…

scrapy框架学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

macOS Big Sur:探索新设计,聚焦新体验

自苹果公司推出macOS Big Sur以来&#xff0c;这一新版操作系统以其突破性的设计刷新了我们对Mac的认知。本文将详细介绍macOS Big Sur的各项新功能及其为用户带来的卓越体验。 安装&#xff1a;macOS Big Sur(macos11)v11.7.10正式版 一、全新设计&#xff1a;导览更轻松&am…

mysql MVCC多版本并发控制

mvcc的概念 mvcc 的实现依赖于&#xff1a; 隐藏字段 行格式&#xff08;row_id,trx_id,roll_ponter&#xff09;UndologRead view innodb 存储引擎的表来说&#xff0c;聚集索引记录中都包含两个必要的隐藏字段&#xff0c;row_id(如果没有聚集索引&#xff0c;才会创建的) …

Kubernetes入门 十七、Helm 包管理器

目录 概述Helm 的三大概念Helm 的安装仓库管理Helm 的常用命令 chart详解目录结构Redis chart 实践升级回滚 概述 Kubernetes 上的应用对象&#xff0c;都是由特定的资源描述组成&#xff0c;包括 Deployment、Service 等&#xff0c;都保存在各自的文件中或者集中写在一个配置…

(2023 最新版)IntelliJ IDEA 下载安装及配置教程

IntelliJ IDEA下载安装教程&#xff08;图解&#xff09; IntelliJ IDEA 简称 IDEA&#xff0c;由 JetBrains 公司开发&#xff0c;是 Java 编程语言开发的集成环境&#xff0c;具有美观&#xff0c;高效等众多特点。在智能代码助手、代码自动提示、重构、J2EE 支持、各类版本…

企业架构LNMP学习笔记40

框架配置实现读写分离&#xff1a; 1&#xff09;修改项目配置文件&#xff1a; return [// 数据库类型type > mysql,// 服务器地址// 1、主从数据库的连接地址 主在前 从在后hostname > 192.168.17.100,192.168.17.105,// 2、主从数据库的名称、用…

C语言再学习 -- C语言实现 sin 和 cos 功能

之前在 C语言再学习 – C 标准库 - math.h 里有介绍 sin 和 cos 函数。但是这两个函数C语言该怎么实现呢&#xff1f; 首先看一下这两个函数的介绍&#xff1a; 函数介绍 C 库函数 - sin() C 标准库 - <math.h> 描述 C 库函数 double sin(double x) 返回弧度角 x 的正…

亚马逊云科技面向游戏运营活动的AI生图解决方案

随着Stable Diffusion等AI生图方案逐步普及&#xff0c;越来越多的场景被开发和落地。其中面向游戏C端玩家的AI生图营销活动场景正在被逐步验证&#xff1a;在某个游戏社区中&#xff0c;玩家一键从手机上传一张照片&#xff0c;AI会将自动识别该照片中的元素并替换成游戏中相应…

4-2 张量的数据运算

张量数学运算主要有&#xff1a;标量运算&#xff0c;向量运算&#xff0c;矩阵运算&#xff0c;以及使用非常强大而灵活的爱因斯坦求和函数torch.einsum&#xff08;重难点&#xff09;进行任意维的张量运算。此外还会介绍张量运算的广播机制。 一&#xff0c;标量运算 (操作…

Vue3高频面试题+八股文

Vue3.0中的Composition Api 开始之前 Compos:1 tion API可以说是ue3的最大特点&#xff0c;那么为什么要推出Compos1t1on Api,解决了什么问趣&#xff1f; 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的…