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=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>

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不背完3500个考研英语词汇不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值