1.DOM创建/插入/移除/克隆

1.1创建元素

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

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

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

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

创建元素:document.createElement (tag)

javascript

var boxEl = document.querySelector(".box")
var h2El = document.createElement("h2")
h2El.innerHTML = "我是标题"
h2El.classList.add("title")
boxEl.append(h2El)

1.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 替换为给定的节点或字符串。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><span class="span">我是span1</span><div class="box"><span class="span">我是span2</span>我是box元素</div><script>var boxEl = document.querySelector(".box")//1.通过innerHTML(不推荐)// boxEl.innerHTML = "<h2 class='title'>我是标题</h2>"//2.真实创建一个DOM对象var h2El = document.createElement("h2")h2El.className = "title"h2El.classList.add("active")h2El.textContent="我是标题2"//将元素插入boxEl// boxEl.append(h2El)// boxEl.prepend(h2El)//将元素插入到第二个span元素之后var spanEl =boxEl.querySelector("span")spanEl.after(h2El)</script>
</body>
</html>

 1.3移除和克隆元素

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

setTimeout(() => {h2El.remove()
}, 2000);

 

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

  • 可以传入一个 Boolean 类型的值,来决定是否是深度克隆;
  • 深度克隆会克隆对应元素的子元素,否则不会;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><h2 id="title">我是标题</h2><div class="container"><p><span class="keyword">hehehhe</span>我是段落,<span class="keyword">chen</span>哈哈哈哈</p></div></div><script>// //一、通过导航获取// //1.拿到body// var bodyEl = document.body// //2.拿到box// var boxEl = bodyEl.firstElementChild// //3.拿到container// var containerEl = boxEl.children[1]// //4.拿到p// var pEl = containerEl.children[0]// //5.拿到keyword// var spanEl = pEl.children[0]// console.log(spanEl)//二、直接获取到keyword//1.通过className获取元素// var keywordEls = document.getElementsByClassName("keyword")//修改第一个// keywordEls[0].style.color = "red"//修改所有的// for (var i = 0; i < keywordEls.length; i++) {//   keywordEls[i].style.color = "red"// }//2.通过id获取元素// var titleEl = document.getElementById("title")// titleEl.style.color = "orange"//三、querySelector:通过选择器查询// var keywordEl = document.querySelector(".keyword")// console.log(keywordEl)//keywordEls是对象,可迭代的//可迭代对象:String/数组/节点的列表var keywordEls = document.querySelectorAll(".keyword")for (var el of keywordEls) {console.log(el)}var title1 = document.querySelector("#title")title1.style.color = "red"</script>
</body>
</html>

1.4 旧的元素操作方法

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

    • 现在我们只需要拿到一个元素在后面直接被before要添加的元素即可

2.获取元素的大小-滚动属性

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 name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box{height: 50px;width: 50px;overflow: scroll;font-size: 25px;}</style>
</head>
<body><div class="box">奥利弗捡gdgadfafafafefvdmvndemd奥利飞机爱上了发顺丰弗发发发</div><script>//1.获取样式(局限性很强)var boxEl = document.querySelector(".box")// var sizeEl = getComputedStyle(boxEl)// console.log(sizeEl.height,sizeEl.width)// console.log(sizeEl.fontSize)//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(first.offsetLeft)window.onclick = function () {console.log(boxEl.scrollTop)}</script>
</body>
</html>

3.Window大小-滚动-方法

window 的 width 和 height

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

window 的滚动位置:

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

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

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

4.滚动+显示隐藏案例练习

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box{background-color: red;height: 100px;}.btn1{position: fixed;right: 20px;bottom: 20px;}.btn2{position:fixed;left:20px;bottom: 20px;/* display: none; */}</style>
</head>
<body><div class="box">我是div元素</div><button class="btn1">滚动位置</button><button class="btn2">回到顶部</button><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><script>//window大小console.log(window.outerHeight)console.log(window.outerWidth)//内容区域大小console.log(innerHeight)console.log(innerWidth)console.log(document.documentElement.offsetHeight)console.log(document.documentElement.offsetWidth)window.onclick = function(){console.log(window.scrollX)console.log(window.scrollY)}window.onscroll = function() {console.log(window.scrollY)}//回到顶部var backBtnEl = document.querySelector(".btn2")backBtnEl.hidden = truewindow.onscroll = function(){if(window.scrollY > 600){// backBtnEl.style.display = "block"backBtnEl.hidden = false//display只能使用元素,如果动画的话需要使用opcity}else{//  backBtnEl.style.display = "none"backBtnEl.hidden = true}}//点击按钮后滚动到某个位置var scrollBtnEl = document.querySelector(".btn1")scrollBtnEl.onclick = function() {window.scrollBy(0, 100) //在原来的位置的基础上面增加100//window.scrollTo(0, 100) //滚动到某一个位置}</script>
</body>
</html>

 5.综合DOM小案例

练习一:通过prompt接收用户的输入,根据输入创建一个列表

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1>动态创建列表</h1><ul class="ul1"></ul><script>var ulEl = document.querySelector(".ul1")while(true){var input = prompt("请输入")if(!input){break}var liEl =document.createElement("li")liEl.textContent = inputulEl.append(liEl)}</script>
</body>
</html>

练习二:动态的显示时间

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1 class="time">2025-07-24 </h1><script>//String//padStart(参数1,参数2)//参数一:限制的位数//参数二:不足的以什么补齐//封装一个工具函数function padLeft (content, count, padStr){//这里可以先给一个默认值count = count || 2padStr = padStr || "0"content = String(content)return content.padStart(count, padStr)}var timeEl = document.querySelector(".time")setInterval(function(){      var date = new Date()var year = date.getFullYear()var month = padLeft(date.getMonth())var day = padLeft(date.getDate())var hour = padLeft(date.getHours())var minute = padLeft(date.getMinutes())var second = padLeft(date.getSeconds())timeEl.textContent=(`${year}-${month}-${day} ${hour}:${minute}:${second}`)},1000);</script>
</body>
</html>

练习三:倒计时

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.countdown {color: red;font-size: 20px;}.countdown .time {background-color: red;color: #fff;display: inline-block;padding: 5px;border-radius: 5px;}</style>
</head>
<body><div class="countdown"><span class="time hour">03</span><span class="split">:</span><span class="time minute">25</span><span class="split">:</span><span class="time second">42</span></div><script>//1.获取元素var hour1 = document.querySelector(".hour")var minute1 = document.querySelector(".minute")var second1 = document.querySelector(".second")//2.设置内容var endDate = new Date()endDate.setHours(24)endDate.setMinutes(0)endDate.setSeconds(0)endDate.setMilliseconds(0)setInterval(function(){//获取倒计时的小时-分钟-秒钟//12:50:20 =>24:00:00var nowDate = new Date()var intervalTime = Math.floor((endDate.getTime()-nowDate.getTime())/1000)//console.log(intervalTime)//x小时x分钟x秒//125:x百x十xge// var num = 125// console.log(Math.floor(num/10*10))// console.log(Math.floor((num/10)%10))// console.log(Math.floor(num%10))var hour = Math.floor(intervalTime/3600)var minute =Math.floor((intervalTime/60)%60)var second = Math.floor(intervalTime%60)//2.设置内容hour1.textContent = hourminute1.textContent = minutesecond1.textContent = second},1000)</script>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为仓颉编程语言的表达式及其特点

华为仓颉编程语言的表达式及其特点 仓颉&#xff08;Cangjie&#xff09;语言的表达式有一个明显的特点&#xff0c;范围不再局限于传统算术运算&#xff0c;而是扩展到条件表达式、循环表达式等多种类型&#xff0c;每种表达式均有确定的类型和值。 传统基本表达式&#xff0…

【linux】keepalived

一.高可用集群1.1 集群类型LB&#xff1a;Load Balance 负载均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 数据库、Redis SPoF: Single Point of Failure&#xff0c;解决单点故障 HPC&#xff…

Webpack配置原理

一、Loader&#xff1a; 1、定义&#xff1a;将不同类型的文件转换为 webpack 可识别的模块2、分类&#xff1a; ① pre&#xff1a; 前置 loader &#xff08;1&#xff09;配置&#xff1a;在 webpack 配置文件中通过enforce进行指定 loader的优先级配置&#xff08;2&#x…

对比JS“上下文”与“作用域”

下面从定义、特性、示例&#xff0c;以及在代码分析中何时侧重“上下文”&#xff08;Execution Context/this&#xff09;和何时侧重“作用域”&#xff08;Scope/变量查找&#xff09;&#xff0c;以及二者结合的场景来做对比和指导。一、概念对比 | 维度 | 上下文&#xff0…

如何做数据增强?

目录 1、为什么要做数据增强&#xff1f; 2、图像数据增强&#xff1f; 3、文本与音频数据增强&#xff1f; 4、高级数据增强&#xff1f; 数据增强技术就像是一种“造数据”的魔法&#xff0c;通过对原始数据进行各种变换&#xff0c;生成新的样本&#xff0c;从而提高模型…

Go by Example

网页地址Go by Example 中文版 Github仓库地址mmcgrana/gobyexample&#xff1a;按示例进行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)

告别等待&#xff0c;秒级响应&#xff01;这不只是教程&#xff0c;这是你驾驭PB级数据的超能力&#xff01;我的ClickHouse视频课&#xff0c;凝练十年实战精华&#xff0c;从入门到精通&#xff0c;从单机到集群。点开它&#xff0c;让数据处理速度快到飞起&#xff0c;让你…

电子电气架构 --- 车载软件与样件产品交付的方法

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

C++:STL中vector的使用和模拟实现

在上一篇中讲到了string类&#xff0c;string并不属于STL中因为string出现的比STL早&#xff0c;但是在使用方法上两者有相似之处&#xff0c;学习完string后再来看vector会容易的多&#xff0c;接着往下阅读&#xff0c;一定会有收获滴&#xff01; 目录 vector的介绍 vect…

仓库管理的流程、绩效和解决方案?

什么是仓库管理&#xff1f; 仓库管理涉及对所有仓库运营的日常监督。一个全面、集成的仓库管理解决方案采用行业最佳实践&#xff0c;并涵盖使高效运营得以实现的所有基本要素。这些要素包括分销和库存管理、仓库劳动力管理以及业务支持服务。此外&#xff0c;由内部提供或与服…

TIM 实现定时中断【STM32L4】【实操】

使用定时器实现定时中断的功能&#xff1a;比如每1ms进入中断处理函数使用STM32CubeMX配置TIM初始化先了解每个参数的含义&#xff0c;在进行配置Counter Settings: 计数器基本设置Prescaler(PSC): 预分频器&#xff0c;设置预分频器系数Counter Mode: 技术模式&#xff0c;…

Elasticsearch 的聚合(Aggregations)操作详解

目录 1. 概述 2. 聚合类型分类详解 2.1 桶聚合&#xff08;Bucket Aggregations&#xff09; 2.1.1 基础桶聚合 2.1.2 特殊桶聚合 2.1.3 高级桶聚合 2.2 指标聚合&#xff08;Metric Aggregations&#xff09; 2.2.1 单值指标聚合&#xff08;Single-value Metrics&am…

电子电气架构 --- 高阶智能驾驶对E/E架构的新要求

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

0.深度学习环境配置步骤

0.深度学习环境配置步骤 这里介绍深度学习环境配置详细步骤&#xff0c;包括安装软件&#xff0c;每一步都有安装时的截图&#xff08;后续持续更新&#xff0c;敬请关注&#xff09; 目录如下&#xff1a; 1.安装anaconda 2.安装CUDA 3.安装CU_DNN 4.安装pytorch

在 Azure 中配置 SMS 与 OTP

1. Azure Active Directory B2C (AAD B2C) 中的 SMS/OTP 身份验证 1.1. 现状与原理&#xff1a;电话注册与登录 Azure Active Directory B2C (AAD B2C) 提供了将电话号码作为用户身份标识进行注册和登录的功能&#xff0c;旨在为用户提供一种便捷的替代传统电子邮件或用户名登录…

简单实现支付密码的页面及输入效果

干我们这行&#xff0c;风吹日晒不到&#xff0c;就怕甲方突发奇想。 今天客户要做一个安全密码前置校验&#xff0c;还要做成支付宝那种效果。ps:android端 心理吐槽了一万遍以后&#xff0c;还是得面对现实。 先用通义问一遍&#xff0c;给了两个方案&#xff0c;要么自己写&…

proxmox 解决docker容器MongoDB创建报错MongoDB 5.0+ requires a CPU with AVX support

目录 最简单直接的方式 测试MongoDB docker compose的安装shell脚本 验证访问 最简单直接的方式 让虚拟机直接使用宿主机的物理 CPU 功能标志。 打开 Proxmox Web UI。 选择你的 VM → 硬件 (Hardware) → CPU → 点击 编辑 (Edit)。 将 CPU 类型改为 host。 确认并重启…

向前滚动累加SQL 实现思路

一、业务背景在经营分析场景里&#xff0c;我们经常需要回答&#xff1a;“截至今天&#xff0c;过去 N 天/月/周累计发生了多少&#xff1f;”“把维度切到省、市、房型、项目经理、代理商等&#xff0c;结果又是什么&#xff1f;”本文用两个真实需求做演示&#xff1a;以天为…

Spring AI(14)——文本分块优化

RAG时&#xff0c;检索效果的优劣&#xff0c;和文本的分块的情况有很大关系。SpringAI中通过TokenTextSplitter对文本分块。本文对SpringAI提供的TokenTextSplitter源码进行了分析&#xff0c;并给出一些自己的想法&#xff0c;欢迎大家互相探讨。查看了TokenTextSplitter的源…

Python----大模型(RAG 的智能评估-LangSmith)

一、LangSmith LangSmith是LangChain的一个子产品&#xff0c;是一个大模型应用开发平台。它提供了从原 型到生产的全流程工具和服务&#xff0c;帮助开发者构建、测试、评估和监控基于LangChain 或其他 LLM 框架的应用程序。 安装 LangSmith pip install langsmith0.1.137 官网…