Web APIs——BOM和延迟函数setTimeout

1、window对象

1.1 BOM(浏览器对象模型)

BOM(Browser Object Model)是浏览器对象模型

  • window对象是一个全局对象,也可以说是JavaScript中的顶级对象
  • 像document、alert()、console.log()这些都是window的属性,基本BOM的属性和方法都是window的。
  • 所有通过var定义在全局作用域的变量、函数都会变成window对象的属性和方法
  • window对象下的属性和方法调用的时候可以省略window 

1.2 定时器-延时函数

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

语法:

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

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

清除延时函数:

    <script>
        setTimeout(function(){
            console.log('时间到了')
        },2000)
    </script>

注意:

  • 延时器需要等待,所以后面的代码先执行
  • 每一次调用延时器都会产生一个新的延时器 

延时函数:执行一次

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

 1.2.1 练习

需求:5秒钟之后,广告自动消失

分析:

①:设置延时函数

②:隐藏元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        img {
            position: fixed;
            left: 0;
            bottom: 0;
        }
    </style>
</head>
<body>
    <img src = "./images/ad.png" alt = "">
    <script>
        // 1. 获取元素
        const img = document.querySelector('img')
        setTimeout(function(){
            img.style.display = 'none'
        },5000)
    </script>
</body>
</html>

1.3 JS执行机制

        JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事

        因为JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该要先进行添加,之后再删除。

        单线程就意味着,所以任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

        为了解决这个问题,利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程。于是,JS中出现了同步异步

1.3.1 同步任务 

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

        前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分钟之后),再去切菜,炒菜。

1.3.2 异步任务

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

        你在做一件事情时,因为这件事会花费很长时间,在做这件事的同时,你还可以取处理其他事情。比如做饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。

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

  1. 普通事件,如click、resize等
  2. 资源加载,如load、error等
  3. 定时器,包括setInterval、setTimeout等

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

1.3.3 JS执行机制 

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

    <script>
        console.log(1)
        console.log(2)
        setTimeout(function(){
            console.log(3)
        })
        console.log(4)

        // 输出结果1 2 4 3
    </script>

 

 

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

1.4 location对象

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

常用属性和方法:

  • href属性获取完整的URL地址,对其赋值时用于地址的跳转
        <script>
            // 1. href 经常用href利用js的方法去跳转页面
            location.href = 'http://www.baidu.com'
        </script>
  • search属性获取地址中携带的参数,符号?后面部分 
  • hash属性获取地址中的哈希值,符号#后面部分
    •  后期vue路由的铺垫,经常用于不刷新页面,显示不同页面,比如 网易云音乐
  • reload方法用来刷新当前页面,传入参数true时表示强制刷新

1.4.1 练习

需求:用户点击可以跳转,如果不点击,则5秒之后自动跳转,需求里面有秒数倒计时

分析:

①:目标元素是链接

②:利用定时器设置数字倒计时

③:时间到了,自动跳转到新的页面

支付成功1秒之后跳转回原网页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span {
            color: red;
        }
    </style>
</head>
<body>
    <a href = "http://www.itcast.cn">支付成功<span>5</span>秒之后跳转到首页</a>
    <script>
        // 1. 获取元素
        const a = document.querySelector('a')
        // 2. 开启定时器
        // 3. 声明倒计时变量
        let num = 5
        let timerId = setInterval(function(){
            num--
            a.innerHTML = `支付成功<span>${num}</span>秒之后跳转到首页`
            // 如果num === 0 则停止定时器,并且完成跳转功能
            if(num === 0){
                clearInterval(timerId)
                // 跳转location.href
                location.href = 'http://www.itcast.cn'
            }
        },1000)
    </script>
</body>
</html>

1.5 navigator对象

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

常用属性和方法:

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

1.6 history对象

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

常用属性和方法
history对象方法作用
backe()可以后退功能
forward()前进功能
go(参数)前进后退功能 参数如果是1前进1个页面 如果是-1后退1个页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button>后退</button>
    <button>前进</button>
    <script>
        const back = document.querySelector('button:first-child')
        const forward = back.nextElementSibling
        back.addEventListener('click',function(){
            // 后退一步
            // history.back()
            history.go(-1)
        })
        forward.addEventListener('click',function(){
            // 前进一步
            // history.forward()
            history.go(1)
        })
    </script>
</body>
</html>

2、本地存储 

2.1 什么是本地存储

2.2 本地存储分类

2.2.1 localStorage

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

特性:

  • 可以多窗口(页面)共享(同一浏览器可以共享)
  • 以键值对的形式存储使用

语法:

  • 存储数据:
  • 获取数据:​​​​​​​
  • 删除数据:

 浏览器查看本地数据:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>    
    <script>
        // 要存储一个名字 uname, xiaochen
        // localStorage.setItem('键','值')
        localStorage.setItem('uname','xiaochen')
        // 2. 获取方式  都加引号
        console.log(localStorage.getItem('uname'))
        // 3. 删除本地存储  只删除名字
        localStorage.removeItem('uname')
        // 4. 改  如果原来有这个键,则是改,如果没有这个键则是增
        localStorage.setItem('uname','xiaohuang')

        // 我要存一个年龄
        // 本地存储只能存储字符串数据类型
        localStorage.setItem('age',18)
        console.log(localStorage.getItem('age'))
    </script>
</body>
</html>

2.2.2 sessionStorage

特性:

  • 生命周期为关闭浏览器窗口
  • 在同一个窗口(页面)下数据可以共享
  • 以键值对的形式存储使用
  • 用法跟localStorage基本相同

2.3 存储复杂数据类型

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

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

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

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

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

 

  

解决:把取出来的字符串转换为对象

语法:JSON.parse(JSON字符串)

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const obj = {
            uname: 'xiaochen',
            age: 18,
            gender: '女'
        }
        // // 存储 复杂数据类型 无法直接使用
        // localStorage.setItem('obj',obj)
        // // 取
        // console.log(localStorage.getItem('obj'))

        // 复杂数据类型存储必须转换为JSON字符串存储
        localStorage.setItem('obj',JSON.stringify(obj))
        // JSON对象  属性和值有引号,而且引号统一是双引号
        // {"uname":"xiaochen","age":18,"gender":"女"}
        // 取
        // console.log(typeof localStorage.getItem('obj'))
        // 2. 把JSON字符串转换为 对象
        console.log(JSON.parse(localStorage.getItem('obj')))
        console.log(JSON.parse(str))
    </script>
</body>
</html>

3、数组map和join方法

3.1 map方法 

  • 使用场景:map可以遍历数组处理数据,并且返回新的数组
  •  

map也称为映射。映射是个术语,指两个元素的集之间元素相互“对应”的关系。

map重点在于有返回值,forEach没有返回值

3.2 join方法

作用:join()方法用于把数组中的所有元素转换一个字符串

语法: 

参数:数组元素是通过参数里面指定的分隔符进行分隔的,空字符串(''),则所有元素之间都没有任何字符

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const arr=['red','blue','pink']
        // 1.数组map方法  处理数据并且返回一个数组
        const newArr = arr.map(function(ele,index){
            // console.log(ele)  // 数组元素
            // console.log(index) // 索引号
            return ele + '颜色'
        })
        console.log(newArr)

        // 2.数组join方法 把数组转换为字符串
        // 小括号为空则逗号分割
        console.log(newArr.join()) //red颜色,blue颜色,pink颜色
        // 小括号是空字符串,则元素之间没有分隔符 
        console.log(newArr.join('')) // red颜色blue颜色pink颜色
        console.log(newArr.join('|')) // red颜色|blue颜色|pink颜色
    </script>
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/141201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

POWER APPS:必填项功能

Power apps的Forms组件中&#xff0c;它的卡片有个属性为Required。作用为提醒此项为必填&#xff0c;且在submitform时检查此项是否有值&#xff0c;没有值就无法正常提交&#xff0c;且会有提示。 另外可对提交按钮的属性displaymode做一次判断&#xff0c;只允许按钮在窗体中…

JDK更换版本不生效问题

JDK版本更换 问题: 当本地电脑拥有多个版本jdk时, 切换jdk版本不生效 解决方案: 1.查看环境变量(高版本的jdk安装时自动注入环境变量) 2.将Path里面的jdk的bin配置上移到最上面 3.查看jdk版本, java -version 启动项目,显示如下使用了jdk17

windows 使用命令关闭进程

1.使用cmd命令打开命令窗口 2.输入命令&#xff1a;netstat -aon|findstr 端口号 查询出该端口进程、以及进程pid 3.使用查询出来的pid杀掉进程&#xff0c;输入命令&#xff1a;taskkill /pid 32188 /f

STM32F4 GPIO端口二极管作用——二极管钳位作用

如上图所示&#xff0c;有两个保护二极管&#xff0c;用于保护内部电路&#xff0c;防止I\O引脚外部过高或者过低的电压输入时造成内部电路损坏。 具体来讲&#xff1a;当引脚输入电压高于VDD时&#xff0c;上面的二极管导通&#xff0c;输入点电压被钳位到约VDD0.7V&#xff…

财报解读:加码布局中国市场,阿迪达斯能否再次华丽转身?

“哪里有世界冠军&#xff0c;哪里就有阿迪达斯”是过去人们对阿迪达斯江湖地位的肯定。作为体育运动用品行业的元老&#xff0c;阿迪达斯全球运动市场份额排名第二&#xff0c;是第一个进入中国市场的国外鞋服运动品牌&#xff0c;曾连续23个季度在大中华区实现销售额两位数增…

activiti7审批驳回,控制变量无法覆盖,导致无限循环驳回,流程无法结束

项目开发过程中使用工作流&#xff0c;因此考虑使用activiti7做完工作流引擎。项目开发过程中&#xff0c;发现流程驳回时&#xff0c;再次执行流程&#xff0c;控制变量无法覆盖&#xff0c;导致无限循环驳回&#xff0c;流程无法结束。流程图如下图所示&#xff1a; 驳回控制…

JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫&#xff0c;如果对这部分内容感到枯燥或者疑惑&#xff0c;可以先放下看&#xff0c;等后续遇到要使用它们的实际场景、实际问题时再结合问题&#xff0c;再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

OpenGL_Learn10(颜色)

1. 颜色 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。换句话说&#xff0c;那些不能被物体所吸收(Absorb)的颜色&#xff08;被拒绝的颜色&#xff09;就是我们能够感知到的物体的颜色。例如&#xff0c;太阳光…

京东商品详情API接口使用方法以及示例代码,可高并发请求

京东商品详情API接口是一种用于获取京东商品详细信息的接口。通过该接口&#xff0c;开发人员可以获取到商品的ID、名称、价格、销量、评价等信息&#xff0c;从而进行进一步的数据分析和应用开发。本文将介绍京东商品详情API接口的使用方法、注意事项以及示例代码。 一、使用…

Python语言的十大特性。

文章目录 前言一、Python二、Python 编程语言的特性三、开源四、Python 中的 GUI 编程支持五、Python 支持高级语言六、可扩展性七、可移植性八、大型标准库九、解释性语言十、面向对象程序设计语言十一、表达力十二、常见问题总结Python技术资源分享1、Python所有方向的学习路…

第四章mlp

生成数据集 读取数据集 data.TensorDataset(*data_arrays)mlp训练 loss nn.CrossEntropyLoss(reductionnone)我要掌握所有人脖颈上的绳 权重衰减 简单概述就是在标准意义的loss函数&#xff08;label值和计算值的差别&#xff09;中再加上一个 惩罚项&#xff0c;为什么要…

A2Attention模型介绍

A2Attention的核心思想是首先将整个空间的关键特征收集到一个紧凑的集合中&#xff0c;然后自适应地将其分布到每个位置&#xff0c;这样后续的卷积层即使没有很大的接收域也可以感知整个空间的特征。第一级的注意力集中操作有选择地从整个空间中收集关键特征&#xff0c;而第二…

Rocky DEM 高尔顿板 小球掉落正态分布模拟

Rocky DEM 高尔顿板 小球掉落正态分布模拟 前言一、外部三维模型的建立二、导入到Rocky中并设置1.导入外部三维模型2.打开3D视图3.添加颗粒入口界面4.添加颗粒并设置属性5.设置颗粒与墙壁的碰撞属性6.设置颗粒入口流量7.求解 三、动画序列设置并导出 前言 刚开始学习离散元软件…

MyBatis 反射工具箱:带你领略不一样的反射设计思路

反射是 Java 世界中非常强大、非常灵活的一种机制。在面向对象的 Java 语言中&#xff0c;我们只能按照 public、private 等关键字的规范去访问一个 Java 对象的属性和方法&#xff0c;但反射机制可以让我们在运行时拿到任何 Java 对象的属性或方法。 有人说反射打破了类的封装…

[IJKPLAYER]基于DEMO分析IJKPLAYER(整理版本)

背景 博主主要是从事C语言开发&#xff0c;因此本文着重强调FFMPEG部分&#xff0c;关于JAVA应用和框架层只是一笔带过。IJKPLAYER的实质是对FFMPEG项目中的ffplayer程序进行的二次封装&#xff0c;通过JNI方式完成对外提供JAVA接口。 1.目录结构 activities:包含了demo的所有…

【设计原则篇】聊聊开闭原则

开闭原则 其实就是对修改关闭&#xff0c;对拓展开放。 是什么 OCP&#xff08;Open/Closed Principle&#xff09;- 开闭原则。关于开发封闭原则&#xff0c;其核心的思想是&#xff1a;模块是可扩展的&#xff0c;而不可修改的。也就是说&#xff0c;对扩展是开放的&#xf…

单电源供电的运放如何增加直流偏置

在一些单电源供电的运放电路中&#xff0c;输入信号可能是交流信号&#xff0c;有正也有负&#xff0c;如果输入信号直接接到运算放大电路&#xff0c;则运放不会输出负电压&#xff0c;只有正电压&#xff0c;从而不能实现信号的调理&#xff1b; 这时我们就需要给运放添加直流…

css选择器

目录 1.什么是css? 2.选择器分类 2.1类选择器 2.3id选择器 2.3通配符选择器 3.字体样式 3.1字体大小 3.2字体粗细 3.3字体系列 3.4font属性连写 3.5样式的层叠问题 4.文本样式 4.1文本缩进 4.2文本水平对齐方式 4.3文本修饰 5.行高 6.垂直居中 7.margin:0 au…

【JAVA】去掉 if...else 的七种绝佳之法...

文章目录 前言方法一&#xff1a;提前 return方法二&#xff1a;枚举方案三&#xff1a;Optional 判空方案四&#xff1a;表驱动法方案五&#xff1a;策略模式 工厂方法方案六&#xff1a;责任链模式方案七&#xff1a;Function总结 前言 我相信小伙伴一定看过多篇怎么去掉 i…

Libhybris之线程局部存储TLS实例(五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…