web API 第六天 (+第七天补充 本地存储 补充知识点)

168 阅读3分钟

BOM 操作浏览器

一、window对象

1.BOM(浏览器对象模型)

本质

​ window是浏览器内置的全局对象,我们学习所有API的知识内容都是基于window对象实现的

window对象下包含了navigator、location、document、history、screen 5个属性,即所谓的 BOM (浏览器对象模型)

1649924111761

理解:可以把window当做是地球,然后五个超级大国。

2.定时器-延时函数

本质:把一段代码延迟执行

作用:例如广告关闭等

语法

​ 1.创建延时函数:setTimeout(回调函数,等待的毫秒数)

1649924288089

​ 2.清除延时函数:给延时函数一个变量名timer,clearTimeout(timer)

1649924292830

5秒后广告消失案例

<script>
        setTimeout(function(){
            document.querySelector(`div`).style.display = `none`
        },5000)
</script>

3.递归(提前认知)

本质:一个函数,自己调用自己

使用场景

1.有一个函数 可以打印出 一个Dom元素所有祖先元素

​ 2.假设你得了传染病,先找你 再找邻居,然后一直找找到没有为止

用延时器实现定时器效果—递归法

<script>
        // 定时器 不会主动清除 除非加清除
        // 延时器 只会执行一次

        // 实现 : 在延时器内加延时器


        let num = 0
        function func() {
            console.log(++num);
            setTimeout(func,1000)
        }
        func()
</script>

4.location对象

本质:也是一个对象,拆分保存URL地址各个组成部分

常用的属性和方法:

​ 1.href 属性 获取完整的URL地址,对其赋值时用于地址跳转

<script>
        let btn = document.querySelector(`button`)

        btn.addEventListener(`click`,function(){
           location.href = `https://www.baidu.com/`//跳转到网页
           
           location.href = location.href // 刷新页面 自己跳转自己
        })
    
    // 利用延时器 3秒后自动跳转
   		setTimeout(function(){
            location.href = `https://www.baidu.com/`
        },3000)
    </script>

​ 2.search 属性 获取地址中携带的参数,符号?后面的部分(后一个阶段开用)

1649927972507

​ 3.hash 属性 获取地址中的哈希值,符号#后面部分(VUE阶段开用)

1649928052009

​ 4.reload 方法 用来刷新当前页面,传入参数true表示强制刷新

1649927903161

区别与location href 更加优雅,和语义化

<script>
        let btn = document.querySelector(`button`)

        btn.addEventListener(`click`,function(){
            console.log(location.search); // 获取符号?后面部分
            console.log(location.hash);//获取符号# 后面部分 
            location.reload(true) // 是一个方法 强制刷新 比href优雅 语义化
        })
</script>

5.navigator对象

​ 作用:通过userAgent检测浏览器的版本和平台

​ 使用:直接找写好的代码,检测即可

​ 场景1:手机点击下载,识别是安卓还是苹果,给不同用户历史

​ 场景2:识别出当前的访问设备是PC还是移动端,后台根据类型返回对应平台页面。

6.histroy对象

​ 本质:与浏览器地址栏操作相对应,前进后退,历史记录等

常用属性和方法

1649930666925

<script>
        const btnGo = document.querySelector(`.go`)
        const btnBack = document.querySelector(`.back`)

        btnGo.addEventListener(`click`,function(){
           history.forward()//前进 
           history.go(1) // 前进一个记录
        })

        btnBack.addEventListener(`click`,function(){
            history.back()//后退
            history.go(-1)// 后退一个记录
        })
    </script>

7.本地存储

本质:为了更多需求,需要在本地存储大量数据,HTML5规范提出的解决方案。

特性

​ 1.数据存储在用户浏览器中

​ 2.设置,读取方便,刷新不丢失数据

​ 3.容量较大

localStorage

特点

​ 1.生命周期永久,如果用户不手动删除,就一直存储

​ 2.多个页面共享(同一个浏览器可以共享)

​ 3.以键值对形式存储使用

语法

​ 1.存储数据

localStorage.setItem(key, value)

​ 2.获取数据

localStorage.getItem(key)

​ 3.删除一个数据

localStorage.removeItem(key)

​ 4.清空所有数据

localStorage.clear()

<script>

        localStorage.setItem(`arr`,`aaa`)
        localStorage.removeItem(`arr`)//删除一个

        for (let index = 0; index < 100; index++) {
            localStorage.setItem(`key${index}`,index)
            
        }
        localStorage.clear()//清空 

</script>

存储复杂数据类型

作用:本地只能存储字符串,无法存储复杂数据类型,所以要将复杂数据类型转换JSON字符串,再存储到本地

语法

​ 1.复杂类型数据转成JSON字符串 存储到本地存储中

​ JSON.stringify(复杂数据类型)

​ 2.JSON字符串转成对象 取出时候使用

​ JSON.parse(JSON字符串)

<script>
        //存储数据
        //localStorage.setItem(`自定义`,值-必须是字符串数据类型)
        //无论传入什么类型 最终都会转换字符串
        localStorage.setItem(`data`,`我是字符串`)

        //获取数据
        let data =  localStorage.getItem(`data`)
        console.log(data);//输出:我是字符串 类型是字符串

        //存储浮渣类型 引用类型的数据 会出现数据丢失 就不能简单用`` 如对象 数组
        let obj = { name: '路飞', height: 100, weight: 200 }
        //这样写之后数据就不能调用了 obj.name 都用不了 

        //这样就得把对象格式 转换 字符串 存储到本地
        let objStr = JSON.stringify(obj)
        localStorage.setItem(`obj`,objStr)
        //获取 存储的数据 读取出来
        let newobj = localStorage.getItem(`obj`)
        console.log(newobj);
        //再把字符串的数组 解析回原来的对象
        let newobj2 = JSON.parse(newobj)
        console.log(newobj2);


        /* 总结:本地存储无法存放 复杂类型的数据 通过JSON对象 进行转换 */
</script>

总结

1.localStorage.setItem("自定义",值-必须是字符串数据类型)

2.无论传入的是什么数据,都会转换成字符串

3.存储复杂类型,通过JSON进行 字符串和对象之间的转换解析

sessionStorage(了解)

特点

​ 1.区别与上面这个关闭浏览器就没了

​ 2.同一页面下数据可以共享

​ 3.以键值对形式存储使用

​ 4.用法与上用法基本相同

<script>
        // 存
        sessionStorage.setItem(`ss`,123)
        // 取
        console.log(sessionStorage.getItem(`ss`)); 
        // 删一个
        sessionStorage.removeItem(`ss`)
        // 清空
        sessionStorage.clear()
</script>

总结

​ 1.本地存储 SS 存储 打开页面到关闭页面直接过程 一次会话 ajax node会用

​ 2.登录的时候 用法和local用法一样

​ 3.SS关闭页面数据丢失

​ 4.local 除非用户主动删除 否则一直存在

用本地存储学习信息表案例

<script>     
        let tbody = document.querySelector(`tbody`)
        let btn = document.querySelector(`.add`)
        let uname = document.querySelector(`.uname`)
        let age = document.querySelector(`.age`)
        let gender = document.querySelector(`.gender`)
        let salary = document.querySelector(`.salary`)
        let city = document.querySelector(`.city`)
        //打开页面,获取本地存储的数据
        let strArr = localStorage.getItem(`arr`)
        let arr = []
        //判断本地存储中有无数据
        if(strArr){
          arr = JSON.parse(strArr)
        }else{
          arr = []
        }

        rander()
        
        btn.addEventListener(`click`,function(){
            let data = {
                id: Date.now(),
                uname: uname.value,
                age: age.value,
                gender: gender.value,
                salary: salary.value,
                city: city.value
            }
            arr.push(data)
            //数据新增后,转成字符串
            const strArr = JSON.stringify(arr)
            //在把转换后的数据 存进本地存储
            localStorage.setItem(`arr`,strArr)
            rander()
            uname.value = ``
            age.value = ``
            salary.value = ``
            gender.value = `男`
            city.value = `北京`
        })

        tbody.addEventListener(`click`,function(e){
            if(e.target.nodeName===`A`){
                let index = e.target.dataset.index
                arr.splice(index,1)
                //数据删除后,转成字符串
                const strArr = JSON.stringify(arr)
                //把转换后的数据 存进本地存储
                localStorage.setItem(`arr`,strArr)
                rander()
            }
        })

        function rander() {
            let html = ``
            for (let index = 0; index < arr.length; index++) {
                html += `<tr>
                    <td>${arr[index].id}</td>
                    <td>${arr[index].uname}</td>
                    <td>${arr[index].age}</td>
                    <td>${arr[index].gender}</td>
                    <td>${arr[index].salary}</td>
                    <td>${arr[index].city}</td>
                    <td>
                        <a data-index="${index}" href="javascript:" class="del">删除</a>
                    </td>
                </tr>`   
            }
           
            return tbody.innerHTML = html
        }
</script>

解题思路

1650007857956

总结:只要哪个地方要插入(修改),就要把数组转字符串-存储本地两段代码写在下面然后再渲染

补充知识

元素属性

 <a data-index="1" href="http://www.baidu.com" id ="nav" nihao="我是野生的">点我</a>
<script>
        let a = document.querySelector(`a`)
        //获取固有属性 用点语法
        console.log(a.href);
        //修改固有属性
        a.href = `http//www.qq.com`

        //自定义属性 设置一个属性名hello 值为你好
        a.setAttribute(`hello`,`你好`)
        //获取一个属性名
        console.log(a.getAttribute(`nihao`)); //打印我是野生的
        //删除
        a.removeAttribute(`nihao`)


        //h5建议 的自定义属性 a.data-xxx 开头不能改 
        // 获取:a.dataset.xxx 设置修改:a.dataset.xxx = 3
        console.log(a.dataset.index);
        a.dataset.index=2



        /* 总结
        1.固有属性 用点语法获取
        2.自定义属性 
            随便自己乱命名<a hello="">
                获取 getAtt 设置setAtt 删除removeAtt
            h5 建议 data- 
                获取 <a.data-abc> 设置(a.dataset.abc=456)
        3.最强大是 获取 getAtt 设置setAtt 删除removeAtt
            可以获取任意属性 (固有和H5) */ 
            console.log(a.getAttribute(`data-index`));
            console.log(a.getAttribute(`id`));
</script>

高阶函数

<script>
        /* 高阶函数
        把一个函数 看成一个普通数据 应用在形参 或 返回值中 */

        function f1(callback) {
            callback()
        }

        function f2() {
            console.log(`我是高阶函数`);
        }

        f1(f2) //把f2函数当做是一个形参使用

        setInterval(f2,1000) // 同理

        const btn = document.querySelector(`button`)
        btn.addEventListener(`click`,f2)//f2 也是高阶函数

        function getIndex() {
            let index = 0
            return function () {
                index++
                console.log(index);
            }
        }
        const ff = getIndex()
        ff() //调用
</script>

事件绑定-取消

<script>
        let btn = document.querySelector(`button`)

        function func1() {
            console.log(`已点击`);
        }

        function func2() {
            console.log(`我是第二个点击函数`);
        }

        btn.addEventListener(`click`,func2) // add事件代码可以绑定多个同名事件
        btn.addEventListener(`click`,func1) // 绑定一个封装的函数事件
        btn.removeEventListener(`click`,func1)//取消事件
        /* 注意:取消事件不能取消匿名,得是一个具名的函数 */
</script>

事件流动补充

<div class="a">爷爷
        <div class="b">爸爸
            <div class="c">儿子</div>
        </div>
</div>
<script>
        //事件流动 还有目标阶段
        let a = document.querySelector(`a`)
        let b = document.querySelector(`b`)
        let c = document.querySelector(`c`)
        a.addEventListener(`click`,function(){
            console.log(`爷爷`);
        })
        b.addEventListener(`click`,function(){
            console.log(`爸爸`);
        })
        c.addEventListener(`click`,function(){
            //最底层 就是目标阶段
            console.log(`儿子 目标阶段`);
        })
</script>

字符串和数组方法使用

<script>
        // 字符串转大写
        let msg = `hello`
        console.log(msg.toUpperCase());

        //字符串转小写
        let aaa = `HELLO`
        console.log(aaa.toLowerCase());

        //字符串转数组
        const str = `qwerdfb`
        console.log(str.split(``));//空字符串进行分隔 可以写其他分隔
        
        const str1 = `a-b-c-d`
        console.log(str1.split(`-`));//按照中划线分隔

        //字符串之间的链接
        console.log(str.concat(str1));//少用 = log(str+str1)
        
</script>
<script>
        //数组转字符串
        let arr = [`a`,`b`,`c`]
        console.log(arr.join(``));//join加入,每一个元素之间加入一个符号连接

        let arr1 = [`a`,`b`,`c`]
        console.log(arr.join(`-`));//用-连接成字符串

        //数组和数组之间连接
        console.log(arr.concat(arr1)); 
</script>