BOM-本地存储

157 阅读4分钟

1.BOM(把浏览器当做对象来看)

image.png window对象是一个全局变量,也可以说是JS中的顶级对象

像document、console.log()这些都是window的属性,基本BOM的属性和方法都是BOM

所有通过var定义在全局作用域中的变量、函数都会变成window对象的属性和方法

window对象下的属性和方法调用的时候可以省略windw

2.定时器-延迟函数

JS内置的一个用来让代码延迟执行的函数,叫setTimeout

语法: setTimeout(回调函数,等待的毫秒数)

setTimeout 仅仅只执行一次,所以可以理解为就是把一段代码延迟执行,平时省略window

清除延时函数: let timer = setTimeout(回调函数,等待的毫秒数) clearTimeout(timer)

注意点: 1.延时器需要等待,所以后面的代码先执行

2.每一次调用延时器都会产生一个新的延时器

两种定时器的区别

两种定时器对比:执行的次数

延时函数: 执行一次

间歇函数:每隔一段时间就执行一次,除非手动清除

// 间歇性定时器:
  // setInterval(函数,时间)
  // clearInterval(定时器标识)
// 延迟性定时器:
  // setTimeout(函数,时间)
  // clearTimeout(定时器标识)

五秒钟自动关闭广告

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

3.递归函数

递归函数:函数内部调用其自身

延迟性函数使用递归可以实现间歇性函数

<script>
    // 函数的递归、递归函数
    // 递归函数:函数内部调用其自身

    // 所以,延迟性函数使用递归可以实现间歇性函数
    function fn(){
      console.log('a');
      setTimeout(fn,1000)
    }
    fn()
  </script>

4.显示时间

    div{
      height: 100px;
      background-color: purple;
      font-size: 20px;
      font-weight: 700;
      color: blueviolet;
      text-align: center;
      line-height: 100px;
    }
  </style>
<body>
  <div></div>
  <script>
    function showTime(){
      const n = new Date()
      document.querySelector('div').innerHTML = n.toLocaleString()
      // 加入延迟性函数实现间歇
      setTimeout (showTime,1000)
    }
    showTime()
  </script>
</body>

5.JS执行机制

image.png 同步任务

同步任务都在主线程上执行,形成一个执行栈。

异步任务

JS 的异步是通过回调函数实现的。

一般而言,异步任务有以下三种类型:

1、普通事件,如 click、resize 等

2、资源加载,如 load、error 等

3、定时器,包括 setInterval、setTimeout 等

异步任务相关添加到任务队列中(任务队列也称为消息队列)。

JS执行机制

  1. 先执行执行栈中的同步任务。
  2. 异步任务放入任务队列中。
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

image.png

由于主线程不断的重复获得任务、执行任务、再获取任务、再执行任务,所以这种机制被称为事件循环

6.location对象

location的数据类型是对象,它拆分并保存了url地址的各个组成部分

常用属性和方法:

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

search 属性获取地址中携带的参数,符号 ?后面部分

hash 属性获取地址中的啥希值,符号 # 后面部分

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

<script>
    // location对象是地址栏对象,它包含了Url里面所有的东西
    // 地址栏对象
    console.log(window.location);
    // 地址栏里面的地址
    console.log(location.href)
  </script>
  <script>
    // url地址
    // 协议:
    // http://主机(ip):端口/路径(index/user/index.html?user = 123&pwd=abc#hash)
    // file://
    document.addEventListener('click', function () {
      // 获取href
      console.log(location.href);
      // 设置
      location.href = 'http://www.baidu.com'
      // 获取问号后面的
      console.log(location.search);
      console.log(location.hash);

      /*  // 方法
       // 重新加载当前url
       location.reload(true)
       // 加载指定的url(可以返回)
       location.assign('http://www.jd.com')//会产生历史记录
       // 替换url(不能返回)
       location.replace('http://www.ifeng.com')//不会产生历史记录 */
    })
  </script>

7.navigator对象

navigator的数据类型是对象,该对象下记录了浏览器自身的相关信息

通过 userAgent 检测浏览器的版本及平台

<script>
    // navigator 浏览器对象
    console.log(navigator);
    // 检测浏览器版本平台
    console.log(navigator.userAgent);
  </script>

倒计时跳转案例

<body>
  <p>页面会在<span>5</span>秒钟后跳转</p>
  <script>
    let i = 5
    let timer = setInterval(function(){
      i--
      document.querySelector('span').innerHTML = i
      if(i === 0){
        clearInterval(timer)
        location.href = 'http://www.baidu.com'
      }
    },1000)
  </script>
</body>

8.history对象

history 的数据类型是对象,主要管理历史记录, 该对象与浏览器地址栏的操作相对应,如前进、后退、历史记录等

image.png

<script>
    //
    console.log(history);
    //访问过得历史记录的数量
    console.log(history.length);

    // 返回历史记录,历史记录的上一个
    console.log(history.back);

    // 前进历史记录
    history.forward()

    // 前进或者后退
    history.go(1)//前进或者后退
  </script>

9.screen对象

屏幕对象

<script>
    // 屏幕对象
    console.log(screen);
    console.log(screen.width);
  </script>

10.本地存储

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

2、设置、读取方便、甚至页面刷新不丢失数据

3、容量较大,sessionStorage和localStorage约 5M 左右

常见的使用场景: todomvc.com/examples/va… 页面刷新数据不丢失

11.本地存储分类-localStorage

目标: 能够使用localStorage 把数据存储的浏览器中

作用: 可以将数据永久存储在本地(用户的电脑), 除非手动删除,否则关闭页面也会存在

特性:

可以多窗口(页面)共享(同一浏览器可以共享)

以键值对的形式存储使用

语法:

存储数据:

localStorage.setItem(key, value)

获取数据

localStorage.getItem(key)

删除数据

localStorage.removeItem(key)

浏览器查看本地数据

image.png

<script>
    // 数据存储在用户浏览器中
    // 作用:可以将数据永久存储在本地(用户的电脑),除非手动删除,否则关闭页面也会存在
    // localStorage


    // 存:属性名,属性值
    // localStorage.setItem('键','值')
    // localStorage.setItem(key,value)
    localStorage.setItem('uname','张飞')
    localStorage.setItem('age','18')
    // 如果重复存储就是覆盖

    // 取(取不到就是null)
    // localStorage.getItem('键')
    const re = localStorage.getItem('uname')
    console.log(re);

    // 删
    // localStorage.removeItem('键')
    localStorage.removeItem('age')
  </script>

12.本地存储分类-sessionStorage

特性:

生命周期为关闭浏览器窗口

在同一个窗口(页面)下数据可以共享

以键值对的形式存储使用

用法跟localStorage 基本相同

13.存储复杂数据类型

目标: 能够存储复杂数据类型以及取出数据

1.本地只能存储字符串,无法存储复杂数据类型

image.png

image.png

2.解决:需要将复杂数据类型转换成JSON字符串,再存储到本地

语法:JSON.stringify(复杂数据类型)

image.png 将复杂数据转换成JSON字符串 存储 本地存储中

image.png

3.问题:因为本地存储里面取出来的是字符串,不是对象,无法直接使用

image.png

image.png 4.解决:把取出来的字符串转换为对象(如果刚开始是数组,最后就是转换为数组,这里的案例是对象) 语法:JSON.parse(JSON字符串)

image.png 将JSON字符串转换成对象 取出 时候使用

image.png

<script>
    // 本地存储不能存储复杂数据类型,要转化为字符串,用的时候再转化为复杂数据类型


    // localStorage.setItem('user','张三')
    // localStorage.setItem('age',18)
    const obj = {
      uname : '张三丰',
      age : 22,
      gender : '男',
    }
    // 不能直接存储引用型数据类型,但是可以存字符串
    // JSON把对象转换为字符串
    // 对象.方法
    //JSON.stringify(复杂数据类型);//将复杂数据类型转化为JSON字符串格式
    // `
    // {
    //   "uname":"张三丰",
    //   "age":"22",
    //   "gender":"上海"
    // }
    // `
    /* const str = JSON.stringify(obj)
    localStorage.setItem('userMessage',str) */
    localStorage.setItem('user1',JSON.stringify(obj))


    // 取:
    const re = localStorage.getItem('user1')
    console.log(re);//得到的是字符串

    // 将字符串再转化为复杂数据类型
    const o = JSON.parse(re)
    console.log(o);
  </script>

存储复杂的数据类型

<script>
    //数组
    // 复杂数据类型
    let arr = [{name:'娃哈哈'}]
    // 转化为字符串
    const qq = JSON.stringify(arr)
    localStorage.setItem("wahaha",qq)

    // 再转化为复杂数据类型
    const aa = JSON.parse(qq)
    console.log(aa);
  </script>
<script>
   //对象
    const obj1 = {
      name : '陈磊',
      gender : '女',
      age : '22'
    }
    // 转化为JSON字符串进行存储
    localStorage.setItem('简历',JSON.stringify(obj1))
    // 使用的时候再转换为复杂数据类型,对象
    console.log(JSON.parse(JSON.stringify(obj1)));
  </script>