第一章-JavaScript基础进阶part3:BOM

文章目录

  • 一、BOM概述
    • 1.1 什么是BOM
  • 二、window对象的常见事件
    • 2.1 页面加载事件
    • 2.2 调整窗口大小事件onresize
  • 三、定时器
    • 3.1 案例
  • 四、JS执行机制
    • 4.1 this指向
    • 4.2 JS执行机制
      • 1、JS是单线程
      • 2、JS的同步和异步
      • 3、JS的执行机制
  • 五、location对象
    • 5.1 locationc对象常用属性
    • 5.2 location对象的方法
  • 六、navigator对象
  • 七、history对象

一、BOM概述

1.1 什么是BOM

BOM ( Browser Object Model) 即浏览器对象模型,它提供了独立于内容而与浏览密商口进行交与的对象,其校心对象足window.
BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性.
BOM缺乏标准,JavaScript语法的标准化组织是ECMAScript,DOM的标准化组织是W3C,BOM最初是Netscape览器标准的一部分

BOM:

  • 浏览器对象模型
  • 把【浏览器】当做一个【对象】来看待
  • BOM的顶级对象是window
  • BOM学习的是浏览器窗口交互的一些对象
  • BOM是浏览器厂商在各自浏览器上定义的,兼容性较差

BOM中最大的对象window:

  • window 对象是浏览器的顶级对象,它具有双重负色
  • 它足JS 访问浏觉器商口的一个接口
  • 它是一个全局对象。定义在全局作用域中的变量、函数都会变成window 对象的属性和方法
  • 在调用的时候可以省略window,如alert()、promp()等.
  • 注意:window下的一个特殊属性window.name

二、window对象的常见事件

2.1 页面加载事件

1、window.onload

window.onload 或 window.addEventListener(“load”,function(){})

  • window.onload是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像,脚本文件、CSS文件等),就调用的处理函数。
  • 注意:
    - 有了window.onload 就可以把J5 代码与到页面元素的上方,因为 onload 是等页面内容全部加技完毕再去执行处理函数
    - window.onload传统注册事件方式只能与一次,如果有多个,会以最后一个window.onload为准
    - 如果使用addsventistener 则没有限制

2、DOMContentLoaded

  • document.addEventListener(“DOMContentLoaded”,function(){})
  • DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等.(IE9以上支持)
  • 如果页面的图片很多的话,从用户访问到onload触发可能需要较长的时间.交互效果就不的实现,必然影响用户的体验,此时用DOMContentLoaded事件比较合适
    <script>
        // 示例1: window.onload
        // 重复注册onload事件,最后一个会覆盖之前
        // window.οnlοad=function(){
        //     alert(111)
        // }
        // window.onload = function(){
        //     alert(22)
        // }

        // 示例2: window.addEventListener("load",fn)
        // 多次注册均能执行,且按注册顺序执行
        // window.addEventListener("load",function(){
        //     alert(11)
        // })
        // window.addEventListener("load",function(){
        //     alert(22)
        // })

        // 示例3: DOMContentLoaded事件
        // 注意:此事件是DOM加载完成时就会执行,不包含图片,flass,css等,加载速度比load更快
        document.addEventListener("DOMContentLoaded",function(){
            alert("content loaded")
        })
    </script>

2.2 调整窗口大小事件onresize

  • window.onresize
  • window.addEventListener(“resize”,fn)
  • 只要窗口大小发生像素变化,就会能发这个事件
  • 我们经常利用这个事件完成响应式布局。window.innerWidth 当前屏幕的宽度
<!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{
            width:300px;
            height:300px;
            background:pink;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        var div = document.querySelector("div")
        window.addEventListener("resize",function(){
          if(window.innerWidth<800){
            div.style.background='purple'
          }else{
            div.style.background='pink'
          }
        })
    </script>
</body>
</html>

三、定时器

  • setTimeout(fn, [延迟的毫秒数]):延迟一定时间后,执行fn函数(只执行一次),返回定时器对象
    • clearTimeout(定时器对象): 清除定时器
  • setInterval(fn, 间隔毫秒数):每间隔一定时间执行一次
    • clearInterval(定时器对象):清除持续定时器
  <script>
        // 执行一次定时器
        var timer = setTimeout(function(){
            console.log("1秒执行了")
            clearTimeout(timer)
        },1000)
        // 持续执行定时器
        var intervalTimer = setInterval(function(){
            console.log("每1秒执行")
        },1000)
    </script>

3.1 案例

1、倒计时

<body>
    <div>5</div>
    <script>
        var div = document.querySelector("div")
        var start = 5
        var timer = setInterval(function () {
            start -= 1
            if (start >= 0) {
                div.innerHTML = start
            } else {
                alert("时间到了!")
                // 清除定时器
                clearInterval(timer)
            }
        }, 1000)
    </script>
</body>

2、验证码倒计时

<body>
    <div class="form">
        <input type="text">
        <button>发送验证码</button>
    </div>
    <script>
        var btn = document.querySelector("button")
        var input = document.querySelector("input")
        btn.onclick=function(){
            btn.disabled = true
            if(input.value.length<=0){
                alert("请输入手机号")
                return;
            }
            var start = 5
            var timer = setInterval(function(){
                start-=1
                if(start==0){
                    btn.innerHTML = "发送验证码"
                    btn.disabled = false
                    start = 5
                    clearInterval(timer)
                }else{
                    btn.innerHTML=start+"秒后重新获取"
                }

            },1000)
        }
    </script>
</body>

四、JS执行机制

4.1 this指向

1、在全局作用域或都普通 函数中this指向全局对象window
2、对象方法中的this,指向对象本身(调用者)
3、构造函数中的this:指定实例化的对象

<body>
    <button>按钮</button>
    <script>
        // 示例:this指向
        // 1、全局作用域或普通函数中的this
        console.log(this) // window
        function fn(){
            console.log(this,'fn') // window
        }
        fn(); // 调用普通函数

        // 2、对象方法
        var obj = {
            say:function(){
                console.log(this,'obj.say') // obj
            }
        }
        obj.say();
        var btn = document.querySelector("button")
        btn.addEventListener('click',function(){
            console.log(this,'btn.onclick') // <button>按钮</button>
        })
        
        // 3、构造函数中的this
        function Fn(){
            console.log(this,'Fn')
        }
        var ins = new Fn() // this指向ins
    </script>
</body>

4.2 JS执行机制

1、JS是单线程

JavaScript语言的一大持点就是单线程,也就是说,同一个时问只做一件事,这是因为javascript这门脚本语言诞生的使命 是为处理页面中交互,以及提作DOM而生的。比如我们对某个 DOM 元素进行添加和删除操作,不会同时进行。应该先进行添加,之后再删除。

为了解决JS单线程的问题,利用多核CPU的计算力,HTML5提出 Web Worker 标准,允许 JavaScript脚本创建多个线程,但是子线程受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质,也因此,HTML5中出现了同步和异步。

2、JS的同步和异步

同步:一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了( 10分钟之后),再去切菜。炒菜。
异步:你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时你还可以去处理其他事情。比如做饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。

所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
JS同步任务

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

JS异步任务

  • JS的异步任务是通过回调函数实现的,JS中的异步任务是在单独的任务栈中,当主线程上的执行栈执行完毕后开始执行任务队列
    一般的异步任务有以下三类:
  • 普通事件,如click,resize等
  • 资源加载,如load,error等
  • 定时器,如setInterval,setTimeout等

3、JS的执行机制

  1. 先执行主线程的执行栈
  2. 如果遇到异步任务(回调函数)放入任务队列中。
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务(event loop),于是被读取的异步任务结束等待状态,进入执行栈,开始执行

事件循环(Event Loop):
同步任务和异步任务分别 进入不同的执行“场所”,同步任务进入主线程执行栈中执行,异步任务进入(Event Table)并注册回调函数。当执行栈(call stack)中的代码执行完毕,执行栈(call stack)中的任务为空时,就会读取任务队列(task quene)中的任务,去执行对应的回调;如此循环,就形成js的事件循环机制(Event Loop),

  • eventloop: 由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为事件循环(eventloop)
  <script>
        // 1->2->3
        console.log(1)
        // setTimeout回调函数是异步任务会在主任务执行完后再执行
        setTimeout(function(){
            console.log(3)
        },0)
        console.log(2)
    </script>

五、location对象

1、什么是location对象
window 对象给我们提供了一个location 属性用于获取或设置窗体的URL,并且可以用于解析 URL。因为这个属性返回的是一个对象,所以我们将这个属性也称为location 对象。
2、什么是URL
统一资源定位符(Uniform Resource Locator, URL)是互联网上标准资源的地址与联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位百以及浏览器应该怎么处理它.
URL的一般语法格式:
protocol://host [:port]/path/[?query]#fragment在这里插入图片描述

5.1 locationc对象常用属性

在这里插入图片描述
1、案例:5秒后跳转页面

<body>
    <div>即将跳转</div>
    <script>
        // location.href可直接读取页面URL
        console.log(location.href)
        var div = document.querySelector("div")
        var time = 5
        let timer = setInterval(function(){
            time--
            if(time==0){
                // location.href赋值则会跳转
                window.location.href = 'https://www.baidu.com'
                clearInterval(timer)
                time = 5
            }else{
                div.innerHTML = time +"秒后即将跳转"
            }
        },1000)
    </script>
</body>

2、案例:获取页面参数(location.search)

    <script>
        // 页面添加参数?name=lala&age=12
       var search = location.search
       var queryObj = parseSearch(search)
       // {name:'lala',age:'12'}
       console.log(queryObj)

       function parseSearch(searchStr){
        // 未传入或无参数时不执行
        if(!searchStr) return;
        let mainStr = searchStr.substr(1)
        let keyValueArr = mainStr.split('&')
        let queryObj = {}
        for(let i=0;i<keyValueArr.length;i++){
            let itemArr = keyValueArr[i].split("=")
            queryObj[itemArr[0]]=itemArr[1]
        }
        return queryObj
       }
    </script>

5.2 location对象的方法

在这里插入图片描述

<script>
        // 重定向
        // location.assign("https://www.baidu.com")
        //  替换,不记入历史记录
        location.replace("https://www.baidu.com")
        // 重新加载
        // location.reload(true)
    </script>

六、navigator对象

  • navigator对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值
 <script>
        let reg = /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Windows Phone)/i
       if(navigator.userAgent.match(reg)){
        console.log("移动端访问")
       }else{
        console.log("PC端访问")
       }
    </script>

七、history对象

window 对象给我们提供了一个history 对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。
在这里插入图片描述

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

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

相关文章

Win11大小写切换图标关闭方法

大家使用Win11操作系统的时候经常会切换大小写键盘&#xff0c;有些游戏本在游戏过程中需要切换大小写&#xff0c;这个时候电脑的屏幕就会出现大小写切换的图标而影响游戏体验&#xff1b; 那么想要关闭Win11电脑上大小写切换图标&#xff0c;又不知道具体怎么操作&#xff0c…

java学习路程之篇四、进阶知识、石头迷阵游戏、绘制界面、打乱石头方块、移动业务、游戏判定胜利、统计步数、重新游戏

文章目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码 1、绘制界面 2、打乱石头方块 3、移动业务 4、游戏判定胜利 5、统计步数 6、重新游戏 7、完整代码 java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片

一零六七、JVM梳理

JVM&#xff1f; Java虚拟机&#xff0c;可以理解为Java程序的运行环境&#xff0c;可以执行Java字节码&#xff08;Java bytecode&#xff09;并提供了内存管理、垃圾回收、线程管理等功能 java内存区域划分?每块内存中都对应什么? 方法区&#xff1a;类的结构信息、常量池、…

优化|当机器学习上运筹学:PyEPO与端对端预测后优化

分享者&#xff1a;唐博 编者按&#xff1a;​ 这篇文章我想要写已经很久了&#xff0c;毕竟“端对端预测后优化”&#xff08;End-to-End Predict-then-Optimize&#xff09;正是我读博期间的主要研究方向&#xff0c;但我又一直迟迟没能下笔。想说自己杂事缠身&#xff08;实…

高温环境下光模块光功率降低的原因与解决方案

光模块是光纤通信系统中的关键组件&#xff0c;其稳定的光功率输出对于确保通信质量至关重要。然而&#xff0c;高温环境下光模块的光功率往往会出现下降&#xff0c;本期文章我们将探讨高温环境下光模块光功率降低的原因和解决方案。 一、高温环境下光功率降低的原因 &#…

算法练习--leetcode 数组

文章目录 爬楼梯问题裴波那契数列两数之和 [数组]合并两个有序数组移动零找到所有数组中消失的数字 爬楼梯问题 输入n阶楼梯&#xff0c;每次爬1或者2个台阶&#xff0c;有多少种方法可以爬到楼顶&#xff1f; 示例1&#xff1a;输入2&#xff0c; 输出2 一次爬2阶&#xff1…

金鸣识别将无表格线的图片转为excel的几个常用方案

我们知道&#xff0c;金鸣识别要将横竖线齐全的表格图片转为excel非常简单&#xff0c;但要是表格线不齐全甚至没有表格线的图片呢&#xff1f;这就没那么容易了&#xff0c;在识别这类图片时&#xff0c;我们一般会使用以下的一种或多种方法进行处理&#xff1a; 1. 基于布局…

Devart dbForge Studio for MySQL Crack

Devart dbForge Studio for MySQL Crack dbForge Studio for MySQL是一个用于MySQL和MariaDB数据库开发、管理和管理的通用GUI工具。IDE允许您通过直观的界面创建和执行查询、开发和调试存储例程、自动化数据库对象管理、分析表数据。MySQL客户端提供了数据和模式比较和同步工具…

Android Studio 的Gradle版本修改

使用Android Studio构建项目时&#xff0c;需要配置Gradle&#xff0c;与Gradle插件。 Gradle是一个构建工具&#xff0c;用于管理和自动化Android项目的构建过程。它使用Groovy或Kotlin作为脚本语言&#xff0c;并提供了强大的配置能力来定义项目的依赖关系、编译选项、打包方…

[用go实现解释器]笔记1-词法分析

本文是《用go实现解释器》的读书笔记 ​ https://malred-blog​malred.github.io/2023/06/03/ji-suan-ji-li-lun-ji-shu-ji/shi-ti/go-compile/yong-go-yu-yan-shi-xian-jie-shi-qi/go-compiler-1/#toc-heading-6http://个人博客该笔记地址 ​github.com/malred/malanghttp:/…

selenium 截屏

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; from selenium import webdriver import base64if __name__ __main__:#driver webdriver.Chrome()driver.get(https://www.baidu.com/)# 1.…

sql 参数自动替换

需求&#xff1a;看日志时&#xff0c;有的sql 非常的长&#xff0c;参数比较多&#xff0c;无法直接在sql 客户端工具执行&#xff0c;如果一个一个的把问号占位符替换为参数太麻烦&#xff0c;因此写个html 小工具&#xff0c;批量替换&#xff1a; 代码&#xff1a; <!…

python文件与目录操作

目录 文件编码 文件的读取 打开文件 mode常用的三种基础访问模式 读取文件 关闭文件 with open语法 文件的写入操作 文件综合案例 a.txt内容 代码实现 b.txt文件 目录操作 前言 os模块 具体方法 os.path模块 具体方法 文件编码 前言&#xff1a;由于计算机…

kafka-保证数据不重复-生产者开启幂等性和事务的作用?

1. 生产者开启幂等性为什么能去重&#xff1f; 1.1 场景 适用于消息在写入到服务器日志后&#xff0c;由于网络故障&#xff0c;生产者没有及时收到服务端的ACK消息&#xff0c;生产者误以为消息没有持久化到服务端&#xff0c;导致生产者重复发送该消息&#xff0c;造成了消…

AI大模型之花,绽放在鸿蒙沃土

随着生成式AI日益火爆&#xff0c;大语言模型能力引发了越来越多对于智慧语音助手的期待。 我们相信&#xff0c;AI大模型能力加持下的智慧语音助手一定会很快落地&#xff0c;这个预判不仅来自对AI大模型的观察&#xff0c;更来自对鸿蒙的了解。鸿蒙一定会很快升级大模型能力&…

No111.精选前端面试题,享受每天的挑战和学习

文章目录 map和foreach的区别在组件中如何获取vuex的action对象中的属性怎么去获取封装在vuex的某个接口数据有没有抓包过&#xff1f;你如何跟踪某一个特定的请求&#xff1f;比如一个特定的URL&#xff0c;你如何把有关这部分的url数据提取出来&#xff1f;1. 使用网络抓包工…

基于Go编写一个可视化Navicat本地密码解析器

前提 开发小组在测试环境基于docker构建和迁移一个MySQL8.x实例&#xff0c;过程中大意没有记录对应的用户密码&#xff0c;然后发现某开发同事本地Navicat记录了根用户&#xff0c;于是搜索是否能够反解析Navicat中的密码掩码&#xff08;这里可以基本断定Navicat对密码是采用…

数据结构-二叉树

数据结构-二叉树 二叉树的概念二叉树的遍历分类 建立二叉树&#xff0c;并遍历二叉树的最小单元二叉树的最小单元初始化初始化二叉树前序遍历的实现中序遍历的实现后序遍历的实现计算节点的个数计算树的深度求第k层的个数查找二叉树的元素分层遍历 全部代码如下 二叉树的概念 二…

康冠医疗2021笔试题

笔试时间:2020.09.24。 岗位:嵌入式软件工程师。 题型:13道题,40分钟。 6道填空,2道简答,5道编程,时间紧任务重。 1、填空 4、考察extern关键字。 6、const可以用来代替define ,define 只是简单的代替,但是const还会进行类型检查。 怎么避免头文件重复包含: #…

Android 13(T) - Media框架(2)- libmedia

这一节学习有两个目标&#xff1a; 1 熟悉Android Media API的源码路径与调用层次 2 从MediaPlayer的创建与销毁了解与native的串接 1、源码路径 Media相关的API位于&#xff1a;frameworks/base/media/java/android/media&#xff0c;里面提供有MediaPlayer MediaCodecList M…