首页 > 编程语言 >JavaScript之Promise补充与Dom操作

JavaScript之Promise补充与Dom操作

时间:2024-03-23 10:34:34浏览次数:33  
标签:JavaScript console log Dom 元素 let Promise div document

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=777
    console.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 () {
        //创建li
        let 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>

标签:JavaScript,console,log,Dom,元素,let,Promise,div,document
From: https://blog.csdn.net/Luo3255069063/article/details/136932437

相关文章

  • 关于javaScript的计算精度的解决办法
    项目中我们常常需要做一些计算,由于浮点数的二进制表示可能不精确,经常会遇到计算精度问题,例letresultNum=0.1+0.2;console.log(resultNum);//0.30000000000000004这个时候,如果我们不单独处理,那么页面上展示的时候就出现布局错乱等问题,比如我们可以保留两位小数采用Number(r......
  • 【DOM】重绘与重排详解及在性能优化中的应用
    DOM树表示页面结构渲染树表示DOM节点如何展示DOM树中需要展示的节点在渲染树中至少存在一个对应的节点(隐藏的DOM元素在渲染树中没有对应的节点)。渲染树中的节点被称为“帧(frames)”或“盒(boxes)”。符合CSS模型的定义。理解页面元素为一个具有内边距、外边距、边框、位置......
  • JavaScript object.is()和严格相等、非严格相等的区别
    1.==(相等运算符)        当使用==比较两个值时,如果它们的类型不同,JavaScript会尝试将它们转换为一个共同的类型,然后再进行比较。这个过程称为类型转换或类型强制。0=='0'//true,因为字符串'0'会转换为数字01==true//true,因为布尔值true会转换为数字1nul......
  • JavaScript 本地存储
    1.前言由来:localStorage和sessionStorage是HTML5标准中新加入的技术,用于保存整个网站的数据两者区别:localStorage的生命周期是永久的,除非手动删除,而sessionStorage仅在当前会话下有效(即使是同个域名下的网页也无法访问当前会话下创建的键值对,关闭页面或浏览器后被清除,刷新当......
  • JavaScript 权威指南第七版(GPT 重译)(三)
    第六章:对象对象是JavaScript中最基本的数据类型,您在本章之前的章节中已经多次看到它们。因为对象对于JavaScript语言非常重要,所以您需要详细了解它们的工作原理,而本章提供了这些细节。它从对象的正式概述开始,然后深入到关于创建对象和查询、设置、删除、测试和枚举对象属性的......
  • JavaScript 权威指南第七版(GPT 重译)(四)
    第九章:类JavaScript对象在第六章中有所涉及。该章将每个对象视为一组独特的属性,与其他对象不同。然而,通常有必要定义一种共享某些属性的对象类。类的成员或实例具有自己的属性来保存或定义它们的状态,但它们还具有定义其行为的方法。这些方法由类定义,并由所有实例共享。例如,想象......
  • JavaScript 权威指南第七版(GPT 重译)(五)
    第十二章:迭代器和生成器可迭代对象及其相关的迭代器是ES6的一个特性,在本书中我们已经多次见到。数组(包括TypedArrays)、字符串以及Set和Map对象都是可迭代的。这意味着这些数据结构的内容可以被迭代——使用for/of循环遍历,就像我们在§5.4.4中看到的那样:letsum=0;for......
  • JavaScript 权威指南第七版(GPT 重译)(一)
    前言本书涵盖了JavaScript语言以及Web浏览器和Node实现的JavaScriptAPI。我为一些具有先前编程经验的读者编写了这本书,他们想要学习JavaScript,也为已经使用JavaScript的程序员编写了这本书,但希望将他们的理解提升到一个新的水平,并真正掌握这门语言。我写这本书的目标......
  • JavaScript 权威指南第七版(GPT 重译)(二)
    第四章:表达式和运算符本章记录了JavaScript表达式以及构建许多这些表达式的运算符。表达式是JavaScript的短语,可以评估以产生一个值。在程序中直接嵌入的常量是一种非常简单的表达式。变量名也是一个简单表达式,它评估为分配给该变量的任何值。复杂表达式是由简单表达式构......
  • 详细解读JavaScript中的防抖(debounce)和节流(throttle)!!!
    在JavaScript中,防抖(debounce)和节流(throttle)是两种常用的技术,用于限制函数的执行频率,特别是在处理高频事件(如窗口的resize、scroll,输入框的keyup、mousedown等)时非常有用。防抖(debounce)防抖的基本思想是将多次执行变为最后一次执行。也就是说,在事件被触发后n秒内函数只能执......