Web APIs 第三天

128 阅读2分钟

Web APIs 第三天

节点操作

DOM节点: DOM树里每一个内容都称之为节点 节点类型 元素节点:所有的标签 比如 body、 div,html 是根节点 属性节点:所有的属性 比如 href 文本节点:所有的文本 其他

查找节点

节点关系:父节点,子节点,兄弟节点

父节点

父节点查找: parentNode 属性 语法 子元素.parentNode

案例1

需求:关闭二维码案例

<!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>
        div{
            position: relative;
        }
        .img2{
            position: absolute;
            left: 0px;
            top: 0px;
        }
    </style>
</head>
<body>
    <div>
        <img src="./tab栏案例/imgs/9e7f897180ec221ad5481021306c526.png" alt="" class="img1">
        <img src="./tab栏案例/imgs/66eeeb4e75d71bff178793379e15f36.png" alt="" class="img2">
    </div>
    <script>
        let imgs = document.querySelector('.img2')
        imgs.addEventListener('click',function(){
            imgs.parentNode.style.display = 'none'
        })
    </script>
</body>
</html>
子节点

childNodes:获得所有子节点、包括文本节点(空格、换行)、注释节点等(了解) children :仅获得所有元素(标签)节点,返回的还是一个伪数组(重点)

语法: 父元素.children

案例2

需求:点击一次,隐藏一组ul标签

<!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>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul>
        <li>a</li>
        <li>b</li>
        <li>c</li>
    </ul>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        let uls = document.querySelectorAll('ul')
        for (let index = 0; index < uls.length; index++) {
            uls[index].addEventListener('click',function(){
                //数组里面的标签相同时,用子节点
                //数组里面的数组进行遍历
                for (let index1 = 0; index1 < this.children.length; index1++) {
                    this.children[index1].style.display = 'none'
                    
                }
            })
            
        }
    </script>
</body>

</html>
下一个兄弟节点

语法: nextElementSibling 属性

上一个兄弟节点

语法: previousElementSibling 属性

案例3
<!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>
</head>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
    <script>
        let lis = document.querySelectorAll('li')
        for (let index = 0; index < lis.length; index++) {
            lis[index].addEventListener('click',function(){
                //下一个兄弟
                this.nextElementSibling.style.backgroundColor = 'red'
                //上一个兄弟
                this.previousElementSibling.style.backgroundColor = 'green'
            })
            
        }
    </script>
</body>
</html>

增加节点

目标:能够具备根据需求新增节点的能力 很多情况下,我们需要在页面中增加元素,比如,点击发布按钮,可以新增一条信息 一般情况下,我们新增节点,按照如下操作:创建一个新的节点,把创建的新的节点放入到指定的元素内部

创建节点 语法: document.createElement('标签名')

追加节点 语法:

要插入的地方的父元素,插到元素的最后面
父元素.appendChild(要插入的元素)
要插入的地方的父元素,插入到某个子元素的前面
父元素.inserBefore(要插入的元素,在哪个元素前面)
案例4

需求:按照数据渲染页面

第一种方法

    <!-- 1 引入 要显示的数据 -->
    <script src="./综合作业素材(1) (2)/data/data.js"></script>
    <!-- 2 在写自己的业务 -->
    <script>
        let ul = document.querySelector('.list')
        for (let index = 0; index < data.length; index++) {
            //创建所需要的标签
            let li = document.createElement('li')
            let img = document.createElement('img')
            let h4 = document.createElement('h4')
            let div = document.createElement('div')
            let span1 = document.createElement('span')
            let span2 = document.createElement('span')
            //创建文本节点
            let text1 = document.createTextNode('·')
            let text2 = document.createTextNode('人在学习')
            //引入一系列属性
            img.src = data[index].src
            h4.innerText = data[index].title
            span1.innerText = '高级'
            span2.innerText = data[index].num
            //把标签增加到所需的标签里,append能增加多个,按写的顺序排列
            div.append(span1, text1, span2, text2)
            li.append(img, h4, div)
            //把li增加到ul里
            ul.appendChild(li)

        }
    </script>

第二种方法:

    <!-- 1 引入 要显示的数据 -->
    <script src="./综合作业素材(1) (2)/data/data.js"></script>
    <!-- 2 在写自己的业务 -->
    <script>
        let ul = document.querySelector('.list')
        for (let index = 0; index < data.length; index++) {
            let lis
            //字符串拼接
            lis =`<li>
                    <img src=${data[index].src} alt='' />
                    <h4>
                    ${data[index].title}    
                    </h4>
                    <div>
                    <span>高级</span>·<span>${data[index].num}</span>人在学习    
                    </div>
                </li>`
                //ul里面的文本内容等于li标签,innerHTML可以解析标签
                ul.innerHTML += lis
        }
    </script>
克隆节点

特殊情况下,我们新增节点,按照如下操作: 复制一个原有的节点 把复制的节点放入到指定的元素内部

语法: 要复制的元素.cloneNdoe(布尔值)

cloneNode会克隆出一个跟原标签一样的元素,括号内传入布尔值 若为true,则代表克隆时会包含后代节点一起克隆--深拷贝 若为false,则代表克隆时不包含后代节点--浅拷贝 默认为false

    <div class="box"></div>
    <script>
        let box = document.querySelector('.box')
        let newBox = box.cloneNode()
        //参数为true时,克隆为深,会把子元素也克隆,参数为false或者空时,克隆为浅,			只克隆对应的元素
        // let newBox = box.cloneNode(true)
        document.body.appendChild(newBox)
    </script>

删除节点

若一个节点在页面中已不需要时,可以删除它,在 JavaScript 原生DOM操作中,要删除元素必须通过父元素删除

语法: 父元素.removeChild(要删除的元素)

注意点: 如不存在父子关系则删除不成功 删除节点和隐藏节点(display:none) 有区别的: 隐藏节点还是存在的,但是删除,则从html中删除节点

删除自己:

语法: 要删除的元素.remove

<body>
    <button>删除</button>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <script>
        let but = document.querySelector('button')
        let ul = document.querySelector('ul')
        //事件里面的内容执行就会走一遍,不执行不会走
        but.addEventListener('click',function(){
            let lis = document.querySelector('li:nth-child(1)')
            //删除第一个li标签
            // ul.removeChild(lis)
            //删除自身,记得加括号
            ul.remove()
        })
    </script>
</body>

时间对象

实例化

在代码中发现了 new 关键字时,一般将这个操作称为实例化 创建一个时间对象并获取时间

获得当前时间

    <script>
        //获取当前时间
        let time = new Date()
        console.log(time);
    </script>

获得指定时间

    <script>
        //获取指定时间
        let time = new Date('1949-10-01')
        console.log(time);
    </script>

时间对象方法

    <script>
        let time = new Date()
        time.getFullYear()//获得四位数的年份
        time.getMonth()   //获得0~11的月份,使用时要+1
        time.getDate()    //获得月份的一天,不同的月份值也不同
        time.getDay()     //获得星期,星期天的值为0,其他对应,取值0~6
        time.getHours()   //获得时间
        time.getMinutes() //获得分钟
        time.getSeconds() //获得秒
    </script>
案例5

页面显示时间

<body>
    <div></div>
    <script>
        let div = document.querySelector('div')
        setInterval(function () {
            let time = new Date()
            let year = time.getFullYear()
            let month = time.getMonth()
            let date = time.getDate()
            let hours = time.getHours()
            let minutes = time.getMinutes()
            let seconds = time.getSeconds()
            div.innerText = `${year}${month}${date}${hours}:${minutes}:${seconds}`
        })
    </script>
</body>

时间戳

是指1970年01月01日00时00分00秒起至现在的毫秒数,它是一种特殊的计量时间的方式

三种获取方法

    <script>
        let time = new Date() 
        console.log(time.getTime())
    </script>
    <script>
        console.log(+new Date())
    </script>

但是只能得到当前的时间戳, 而前面两种可以返回指定时间的时间戳

    <script>
        console.log(Date.now())
    </script>
案例6

需求:计算到下课还有多少时间

    <script>
        setInterval(function(){
            let num = +new Date(2022,04,11,22,00,00) - +new Date()
            let hours = parseInt(num / 1000 / 60 / 60 % 24)
            let minutes = parseInt(num / 1000 / 60 % 60)
            let seconds = parseInt(num / 1000 % 60)
            document.body.innerText = `${hours}:${minutes}:${seconds}`
        },1000)
    </script>