JavaScript之Promise补充与Dom操作

Promise过程分析

    //按照顺序依次引入a-d.js,最后打印加载完毕load('a.js').then(()=>{return load('b.js')//load方法返回Pomise对象//但是没有把这个对象返回//所以这个函数没有返回值//then方法会提供一个空对象作为返回值},()=>{console.log('有错误')}).then(()=>{return load('c.js')//load方法返回Pomise对象},()=>{console.log('有错误')}).then(()=>{return load('d.js')//load方法返回Pomise对象}).then(()=>{console.log('加载完毕')},()=>{console.log('有错误')})

1.load('a.js')返回promise对象,调用后面的第一个then方法

2.第一个then里面的方法会在load('a.js')执行

3.执行第一个then里面的第一个方法,return load('b.js'),返回load('b.js')返回的Promise对象,这个Promise对象会成为第一个then的返回值,并且调用后面第二个then方法

4.第二个then里面的方法会在load('b.js')之后执行

5.以此类推

catch方法

    //按照顺序依次引入a-d.js,最后打印加载完毕load('a.js').then(()=>{return load('b.js')}).then(()=>{return load('c.js')}).then(()=>{return load('d.js')}).then(()=>{console.log('加载完毕')}).catch(()=>{console.log('加载失败')})

catch方法提供过程中进入失败状态时执行的方法

如果没有进入失败状态,则会按照顺序正常执行,catch中的方法不执行;如果其中某一步进入失败状态,则跳过后续的过程,马上执行catch中的方法

Dom

全称:document object model

页面上的标签就是Dom,也称为Dom元素,或者元素

Dom元素的内容(父子关系)

<head><meta charset="UTF-8"><title></title>
</head>

head标签有子节点(几个儿子):5个

第一个:<head>后到<meta...>前的空格,文本子节点

第二个:<meta...>标签,元素子节点

第三个:<meta...>后到title前的空格,文本子节点

第四个:title标签,元素子节点

第五个:</title>后在</head>前的空格,文本子节点

head标签有几个子元素:2个

title标签有几个子节点:0个

Dom操作

通过JS操作页面上的元素

查操作

获取元素,进而获取元素上的内容

查找
1.通过id,class,name,tagname获取元素的内容和属性
<ul><li id="li1">1</li><li class="li2">2</li><li name="li3">3</li><li>4</li><li>5</li>
</ul>
<script type="text/javascript">let l1 = document.getElementById("li1");console.log(l1);let l2 = document.getElementsByClassName("li2");console.log(l2);//类名为li2的元素组成的类数组let l3 = document.getElementsByName("li3");console.log(l3);//name为li3的元素组成的类数组let l4 = document.getElementsByTagName("li");console.log(l4);//所有li标签的元素组成的类数组
</script>

特殊的,id可以直接代表元素使用,省略获取步骤,但是大部分编辑器对这种方法很不友好

2.通过选择器获取元素(css中怎么写,括号中就怎么写)
    // 获取选择器匹配到的第一个元素let l2 = document.querySelector(".li2");console.log(l2);// 获取选择器匹配到的所有元素let li = document.querySelectorAll("li");console.log(li);//类数组

特殊的,通过id选择器获取所有元素时,尽管结果只有一个元素,但也是类数组

3.通过结构关系获取元素
父子关系
    //通过子元素获取父元素let l1 = document.getElementById("li1");console.log(l1.parentNode);//父元素ul//通过父元素获取子元素let ul = document.querySelector("ul");//第一个子元素console.log(ul.firstElementChild);//最后一个子元素console.log(ul.lastElementChild);//所有子元素console.log(ul.children);//类数组//获取第三个子元素console.log(ul.children[2]);
兄弟关系
    // 获取兄弟元素let l1 = document.getElementById("li1");//下一个兄弟元素console.log(l1.nextElementSibling);//上一个兄弟元素console.log(l1.previousElementSibling);

注:结构关系获取元素可以联合使用

需求:通过第一个ul的li2获取第二个ul中的l4

<ul><li id="li1">1</li><li class="li2">2</li><li name="li3">3</li><li class="li4">4</li><li>5</li>
</ul>
<ul><li id="l1">1</li><li class="l2">2</li><li name="l3">3</li><li class="l4">4</li><li>5</li>
</ul>
<script type="text/javascript">let ul1 = document.getElementsByTagName("ul")[0];console.log(ul1.nextElementSibling.children[3]);
</script>
内容

先获取元素,进而获取内容

<ul id="uu" abc="777"><li>123</li>
</ul>
<script type="text/javascript">let uu = document.getElementById("uu");//所有内容console.log(uu.innerHTML);//文本内容console.log(uu.innerText);//123
</script>
属性
<ul id="uu" abc="777"><li>123</li>
</ul>
<script type="text/javascript">let uu = document.getElementById("uu");//预定义属性console.log(uu.id);//自定义属性console.log(uu.getAttribute.abc.value);//777
</script>

js尽量不要操作,写在html中的自定义属性

改操作

改操作就是个子元素的内容和属性重新赋值

<ul id="uu" abc="777"><li>123</li>
</ul>
<script type="text/javascript">let uu = document.getElementById("uu");uu.innerText='123'uu.innerHTML='123'//在设置纯文本内容时,两个属性没有区别//当内容中包括标签时uu.innerText='<li>123</li>>'uu.innerHTML='<li>123</li>'//innerText无法解析标签,会把标签当做文本处理//innerHTML可以解析内容中的标签//修改属性uu.className='u1'//如果JS需要操作自定义属性,则直接通过JS设置uu.abc=777console.log(uu.abc)console.log(uu)
</script>

增操作

创建一个元素添加到页面中

需求:创建一个p标签,添加到div中

<div id="dd"><p id="target">标志物</p>
</div>
<script type="text/javascript">//1.创建元素let p = document.createElement('p');//设置标签的内容及属性p.innerHTML = 'hello world';p.className = 'p1';//2.将元素添加到页面中,通过父元素添加资源//获取父元素let dd = document.getElementById('dd');//添加成父元素的最后一个子元素// dd.appendChild(p);//添加到父元素指定元素的前面//获取指定元素let target = document.querySelector('#target');dd.insertBefore(p,target);
</script>
<button id="btn">添加</button>
<div class="out"></div>
<script type="text/javascript">//增操作——补充//如何每一次都添加成第一个子元素let btn = document.getElementById('btn');let out = document.querySelector('.out');btn.onclick = function () {let div = document.createElement('div');div.innerHTML = Math.random();//添加到第一个子元素之前out.insertBefore(div,out.firstElementChild);}
</script>

删操作

通过父元素删除子元素
<button id="btn">删除</button>
<ul class="uu"><li class="li">我要被删除了</li>
</ul>
<script type="text/javascript">let btn = document.getElementById('btn');let li = document.querySelector('.li');btn.onclick = function () {li.parentNode.removeChild(li);}
</script>

注:在删除的需求中,不要获取父元素

而是通过子元素.parentNode来代表父元素

小练习1:

<input type="text" />
<button>添加</button>
<ul></ul>
<script type="text/javascript">let btn = document.querySelector('button');let ul = document.querySelector('ul');let inp = document.querySelector('input');btn.onclick = function () {//创建lilet li = document.createElement('li');//设置li的内容li.innerHTML = inp.value;//把li插入到ul的第一个位置ul.insertBefore(li,ul.firstChild);//给创建出来的li绑定事件li.ondblclick = function () {this.parentNode.removeChild(this);}inp.value = '';}
//注:添加元素绑定事件,必须在添加事件触发的方法中实现
</script>

小练习2:

<button id="add">添加</button>
<div class="out"><div><h3>标题</h3><p>内容</p><p class="img">假装有图片</p><p>总结......</p></div>
</div>
<script type="text/javascript">//需求:点击添加按钮,添加一整个div的结构let out = document.querySelector('.out');// add.onclick = function () {//     //创建div//     let div = document.createElement('div');//     //创建h3//     let h3 = document.createElement('h3');//     h3.innerHTML = '标题';//     div.appendChild(h3);//     //创建第一个p//     let p1 = document.createElement('p');//     p1.innerHTML = '内容';//     div.appendChild(p1);//     //创建第二个p//     let p2 = document.createElement('p');//     p2.innerHTML = '假装有图片';//     p2.className = 'img';//     div.appendChild(p2);//     //创建第三个p//     let p3 = document.createElement('p');//     p3.innerHTML = '总结......';//     div.appendChild(p3);//     out.appendChild(div);// }//innerHMTL可以识别标签//可以把要添加的结构,以innerHTMl的形式添加给父元素// add.onclick = function () {//     out.innerHTML += `//     <div>//         <h3>标题</h3>//         <p>//             内容//         </p>//         <p class="img">//             假装有图片//         </p>//         <p>总结......</p>//     </div>//     `// }//注:直接设置成父元素的innnerHTML会有一定的局限性(只能添加成最后一个或者第一个)//而且解构内的元素如果存在事件,有可能产生bug//最好的解决办法//创建结构最外层的标签//结构内的其他内容设置成标签的innerHTML//最后把创建的标签添加到父元素add.onclick = function () {//创建最外层标签let div = document.createElement('div');div.innerHTML = `<h3>标题</h3><p>内容</p><p class="img">假装有图片</p><p>总结......</p>`out.appendChild(div);}
</script>
小练习3:
<input />
<button id="add">添加</button>
<div class="messages">
<!--    <div class="mes">-->
<!--        <p class="content">-->
<!--            123-->
<!--        </p>-->
<!--        <button>×</button>-->
<!--    </div>-->
</div>
<script type="text/javascript">//点击添加按钮,创建mes结构,并添加成messages的第一个子元素//其中mes>p的内容时input的value//点击×按钮,删除当前留言let messages = document.querySelector(".messages");let input = document.querySelector("input");add.onclick = function () {let mes = document.createElement("div");mes.className = "mes";mes.innerHTML=`<p class="content">${input.value}</p><button>×</button>`messages.insertBefore(mes,messages.firstElementChild);input.value = "";let btn = mes.querySelector("button");btn.onclick = function () {this.parentNode.remove(mes);}}</script>

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

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

相关文章

【Linux】环境变量常见指令操作&基本实验(入门必看!)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

安卓实现翻转时间显示效果

效果 废话不多说上代码 自定义组件 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Camera; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.…

BM83 字符串变形

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param s string字符串 * param n int整型 * return string字符串*/public String trans (String s, int n) {// write co…

RK3568驱动指南|第十三篇 输入子系统-第143章 多对多的匹配关系分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

一文全面了解 wxWidgets 的安装

目录 使用二进制文件 从源代码构建 获取源代码 选择构建系统 构建您的应用程序 Unix&#xff0c;命令行 Unix&#xff0c;使用GNU Make MSW&#xff0c;使用Microsoft Visual Studio Mac&#xff0c;使用Xcode 其他IDE wxWidgets的头文件和库必须可用&#xff0c;以便…

ubuntu20.04_PX4_1.13

说在前面&#xff1a;&#xff08;最好找一个干净的Ubuntu系统&#xff09;如果配置环境的过程中出现很多编译的错误或者依赖冲突&#xff0c;还是建议新建一个虚拟机&#xff0c;或者重装Ubuntu系统&#xff0c;这样会避免很多麻烦&#x1f490; &#xff0c; 安装PX4 1.13.2 …

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

变量的数据类型:基本数据类型和引用数据类型

数据分类 数据分为&#xff1a;静态数据、动态数据。 #静态数据 静态数据是指一些永久性的数据。一般是以文件的形式存储在硬盘上&#xff0c;比如文档、照片、视频等文件。 电脑关闭后&#xff0c;静态数据仍然还在。只要不主动删掉数据或者硬盘没损坏&#xff0c;这些数据…

SQL管理员高频面试问题

1.请你谈谈 MySQL 事务隔离级别&#xff0c;MySQL 的默认隔离级别是什么&#xff1f;为了达到事务的四大特性&#xff0c;数据库定义了 4 种不同的事务隔离级别&#xff1a; READ-UNCOMMITTED&#xff08;读取未提交&#xff09;&#xff1a;最低的隔离级别&#xff0c;允许脏…

代码随想录算法训练营第十七天(二叉树IV)| 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和(JAVA)

文章目录 110. 平衡二叉树解题思路源码 257. 二叉树的所有路径解题思路源码 404.左叶子之和解题思路源码 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]输出&#xff1a;true 示例…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

鸿蒙Harmony应用开发—ArkTS(@Extend装饰器:定义扩展组件样式)

在前文的示例中&#xff0c;可以使用Styles用于样式的扩展&#xff0c;在Styles的基础上&#xff0c;我们提供了Extend&#xff0c;用于扩展原生组件样式。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 装饰器使用说明 语法 Extend(UI…

光速论文能用吗 #媒体#知识分享#学习方法

光速论文是一个非常有效的论文写作、查重降重工具&#xff0c;它的使用非常简单方便&#xff0c;而且功能强大&#xff0c;是每个写作者必备的利器。 首先&#xff0c;光速论文具有强大的查重降重功能&#xff0c;能够快速检测论文中的抄袭部分&#xff0c;帮助作者避免不必要的…

面试算法-80-字符串相乘

题目 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 “2”, num2 “3” 输出: “6…

集合(set)篇(一)

文章目录 5.1 集合的创建5.2 交集5.3 ^ 对称差集5.4 - 差集5.5 并集5.6 < 判断当前集合是否为另一个集合的子集5.7 5.8 > 判断当前集合是否为另一个集合的超集 5.1 集合的创建 在Python中&#xff0c;集合&#xff08;set&#xff09;是一个无序的不重复元素序列。你可以…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

Gin简介(Go web基础知识)

Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的&#xff0c;就是做个笔记&#xff0c;仅分享。膜拜极客兔兔大佬 Go特性&#xff1a; 快速&#xff1a;路由不使用反射&#xff0c;基于Radix树&#xff0c;内存占用少。 中间件&#xff1a;HT…

新概念英语1:Lesson11学习笔记

新概念英语1&#xff1a;Lesson11学习笔记 whose shirt is that?和whose is that shirt区别 “Whose shirt is that?” 和 “Whose is that shirt?” 这两个句子在意义上是相同的&#xff0c;都用于询问一个衬衫的所有者是谁。但在语法结构上存在一些细微的差异。 “Whos…

YOLO-v8-seg实例分割使用

最近需要实例分割完成一些任务&#xff0c;一直用的SAM(segment anything&#xff09;速度慢&#xff0c;找一个轻量分割模型。 1. YOLO-v8-seg使用 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics vim run.py from ultralytics import YOLO# L…

【保姆级讲解C语言中的运算符的优先级】

C语言中的运算符的优先级 C语言中的运算符的优先级决定了表达式中运算符的计算顺序&#xff0c;下面列出了C语言中运算符的优先级&#xff0c;从最高到最低&#xff1a; 括号 ( )数组下标 []成员访问运算符 . 和 ->后缀递增 后缀递减 --前缀递增 前缀递减 --一元加减 -…