Js Bom定时器、事件循环

news/2024/11/6 15:31:51/文章来源:https://www.cnblogs.com/Mickey-7/p/18530295
  • BOM:浏览器对象模型

  • BOM为我们提供了一组对象,通过这组对象可以完成对浏览器的各种操作

  • BOM对象:

    • Window —— 代表浏览器窗口(全局对象)
    • Navigator —— 浏览器的对象(可以用来识别浏览器)
    • Location —— 浏览器的地址栏信息
    • History —— 浏览器的历史记录(控制浏览器前进后退)
    • Screen —— 屏幕的信息
  • BOM对象都是作为window对象的属性保存的,所以可以直接在JS中访问这些对象

Navigator —— 浏览器的对象(可以用来识别浏览器),Navigator中存在大量的关于浏览器代理的相关信息。

每个窗口都有一个关联的Navigator,这是一个Navigator对象。创建Window对象后,Navigator被设置为在Window对象的相关领域中创建的新Navigator对象

image-20241106113617836

image-20241106113652605

					// 检测当前浏览器mdn示例代码let sBrowserconst sUsrAg = navigator.userAgent// The order matters here, and this may report false positives for unlisted browsers.if (sUsrAg.indexOf("Firefox") > -1) {sBrowser = "Mozilla Firefox"// "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"} else if (sUsrAg.indexOf("SamsungBrowser") > -1) {sBrowser = "Samsung Internet"// "Mozilla/5.0 (Linux; Android 9; SAMSUNG SM-G955F Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.4 Chrome/67.0.3396.87 Mobile Safari/537.36} else if (sUsrAg.indexOf("Opera") > -1 ||sUsrAg.indexOf("OPR") > -1) {sBrowser = "Opera"// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.106"} else if (sUsrAg.indexOf("Trident") > -1) {sBrowser = "Microsoft Internet Explorer"// "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Zoom 3.6.0; wbx 1.0.0; rv:11.0) like Gecko"} else if (sUsrAg.indexOf("Edge") > -1) {sBrowser = "Microsoft Edge (Legacy)"// "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"} else if (sUsrAg.indexOf("Edg") > -1) {sBrowser = "Microsoft Edge (Chromium)"// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64} else if (sUsrAg.indexOf("Chrome") > -1) {sBrowser = "Google Chrome or Chromium"// "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.181 Chrome/66.0.3359.181 Safari/537.36"} else if (sUsrAg.indexOf("Safari") > -1) {sBrowser = "Apple Safari"// "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1 980x1306"} else {sBrowser = "unknown"}alert(`You are using: ${sBrowser}`)

location

location 表示的是浏览器地址栏的信息

使用大全

    // 可以直接将location的值修改为一个新的地址,这样会使得网页发生跳转location = "https://www.baidu.com"// 跳转一个新地址location.assign("https://www.hao123.com")// 跳转一个新地址,无法通过回退按钮回退location.replace("https://www.4399.com")// 刷新页面,可以传递一个true来强制清缓存刷新location.reload()// 获取当前地址console.log(location.href)

history

    // 回退按钮history.back()// 前进按钮history.forward()// 当前窗口历史记录列表中的条目数量console.log(history.length)// 正数前进,负数后退history.go(-1)

定时器

通过定时器,可以使代码在指定时间后执行

  // 参数:回调函数(要执行的代码),间隔时间(毫秒)// setTimeout 到时间只会执行一次,不会重复执行const timer = setTimeout(()=>{console.log("code")},3000)// 关闭定时器clearTimeout(timer)
    // 参数:回调函数(要执行的代码),间隔时间(毫秒)// setInterval,每间隔指定时间都会执行一次,重复执行,直到关闭定时器const timer = setInterval(()=>{console.log("code")},3000)// 关闭定时器clearInterval(timer)

事件循环

事件循环(event loop)

  • 函数在每次执行时,都会产生一个执行环境
  • 执行环境负责存储函数执行时产生的一切数据
  • 函数的执行环境存储到了一个叫做调用栈的地方

调用栈(call stack)

  • 栈,是一种数据结构,特点 后进先出
  • 调用栈负责存储函数的执行环境
  • 当一个函数被调用时,它的执行环境会作为一个栈帧
  • 插入到调用栈的栈顶,函数执行完毕其栈帧会自动从栈中弹出

消息队列

  • 队列,是一种数据结构,特点 先进先出

  • 消息队列负责存储将要执行的函数

  • 当我们触发一个事件时,其响应函数并不是直接就添加到调用栈中的

  • 因为调用栈中有可能会存在一些还没有执行完的代码

  • 事件触发后,JS引擎是将事件响应函数插入到消息队列中排队

// 定时器的本质,就是在指定时间后将函数添加到消息队列中
// setInterval() 每间隔一段时间就将函数添加到消息队列中,但是如果函数执行的速度比较慢,它是无法确保每次执行的间隔都是一样的
// 如果希望每次执行都有相同的时间间隔,可以在setTimeout的回调函数的最后,再调用一个setTimeoutsetTimeout(function task(){console.log("code")setTimeout(task,3000)},3000)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步一步在 Blazor 里使用 npm

Blazor 目前不支持 node 语法,所以无法直接使用 node 包;所以需要再用 js 封装一层。1,先给 npm 建个目录 “NpmJS” ,因为 node 无法直接当作 js 使用,所以这个目录不需要建在 wwwroot 下,反而方便 csproj 管理 2,创建 node 项目,建议直接用 npm init 命令创建, vs 自…

合宙低功耗4G模组HTTP网络协议应用

​一、HTTP概述 1.1 简介 HTTP是HyperTextTransferProtocol(超文本传输协议)的缩写。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说…

基于ESP32的桌面小屏幕实战[2]:硬件设计之充电管理

1. 硬件基础知识 1.1 原理图设计、PCB设计、PCB(电路板)、PCBA(电路板+元器件)分别长什么样?1.2 高低电平 一般可以理解为输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。 但实际上它也有一个范围,比如你的单片机供电压(…

jmeter 固定吞吐量定时器

使用:模拟18000 QPS查询 Hits Per SecondTPS :聚合报告: Target throughput(in samples per minute):目标吞吐量(单位分钟),即每分钟执行多少次(TPM)Calculate Throughput based on(计算吞吐量策略):1、This thread only:仅对当前线程,也就是每个线程相互是不干扰的,都…

VS引用本地的NuGet包

Step1.打包 先选择项目/类库,进行打包。在输出中,找到打包的目录和文件。 Step2.本地创建一个文件夹用于放打包文件。Step3.添加包源 打开 VS --> 工具 --> NuGet包管理器 --> 管理解决方案的NuGet程序包 选择右上方:程序包源右侧的齿轮按钮 在程序包源中,新增一…

cuda、cudnn、zlib 深度学习GPU必配三件套(Ubuntu)

跨大版本不推荐,到处是坑、坑、坑~。tensorrt10、cuda12、cudnn9是目前最新的大版本,但是对于一般的老显卡(1050等),太新可能提醒一些错误(主要是tensorrt太新导致的)。为了不折腾,使用如下版本:tensorrt8.6.1、cuda11.8、cudnn8.9.7 默认已经安装了英伟达显卡的最新版…

微信公众号音频下载器

微信公众号音频下载器我关注的一个大V,总是喜欢发布音频内容。 但是呢,由于众所周知的原因,这些内容往往被删除了,我就没法再听了。。。 于是,我想给他的音频保存下来。 虽然我可以自己搞定,但是毕竟没有现成的工具。于是,我发挥程序员的优势,自己动手写一个小工具。于…

北京-丰台-纪家庙

西域美食永照兰州拉面(❤❤❤)地址:丰台区南三环西路91号院1号楼1层107室 单人拉面套餐 ​ 招牌拉面 ​ 凉菜拼盘素 ​ 鸡蛋 ​ 价格:20R ​ 评价:拉面中规中矩,汤有点油,6分;凉菜爽口,不过也有点油,6分;煎蛋能吃出来不是剩的,7分;服务员主动给我提…

C++中调用C函数,会提示undefined reference to xxx,collect2: error: ld returned 1 exit status

在C++中调用C函数,即使头文件等都包含,编译后提示错误undefined reference to xxx,collect2: error: ld returned 1 exit status。这是因为C和C++编译过来中,函数的符号表示不一样。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如…

img 标签高度多了几个像素

因为img标签是行内标签自带间距,导致图片和div之间有间隙<div class="img-container"><img src="xxxxxxxxx" /> </div> <style lang=less> .img-container {width: 200px;font-size: 0; // 方法一img {display: block; // 方法二…

【教程】第一章:界面和安装介绍——初识 NocoBase

1.1 快速体验 首先,我们推荐你快速体验 NocoBase,了解它的强大功能。你可以在 在线 Demo 填写邮箱和相关信息,点击开通。即可收到为期 2 天的体验系统,包含全部商业插件:收到 NocoBase 官方邮件之后,可以先行探索,感受 NocoBase 的灵活强大。可以在体验系统中随意操作,…

idea的git提交显示异常改怎么处理

1、打开设置 2、将项目和其他的VSC改为Git