那年杏花微雨,你说你是BOM

那年杏花微雨,你说你是BOM


一、什么是BOM

1.1 BOM概述

BOM browser object model
浏览器对象模型,他提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。BOM由一系列相关的对象构成,并且每个对象都提供了许多方法和属性。但其缺乏标准,Javascript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分。(就比如说你用不同的浏览器显示alert弹窗,显示效果不完全相同,这就是因为每个浏览器有他自己的BOM标准)
在这里插入图片描述
BOM比DOM更大,它包含DOM

1.2 DOM与BOM的区别

DOM

  • 文档对象模型
  • DOM就是把文档当作一个对象来看待
  • DOM的顶级对象是document
  • DOM主要学习的是操作页面元素
  • DOM是W3C标准规范

BOM

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

二、window对象的常用事件

window对象是浏览器的顶级对象,它具有双重角色

  1. 它是JS访问浏览器窗口的一个接口
  2. 它是一个全局对象,定义在全局作用域中的变量、函数都会变成window对象的属性和方法

在调用的时候可以省略window,前面学习的对话框都属于window对象方法,如alert()、prompt()等。


2.1 窗口加载事件

window.onload = function() {}
window.addEventListener("load",function() {})
document.addEventListener('DOMContentLoaded',function() {})
window.onload是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS文件等),就调用的处理函数。
DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表、图片、flash等等。如果页面的图片很多的话,从用户访问到onload触发可能需要较长的时间,交互效果就不能实现,必然影响用户的体验,此时用DOMContentLoaded事件比较合适。

注意

  1. 有了window.onload就可以把JS代码写到页面元素的上方,因为onload是等页面内容全部加载完毕,再去执行处理函数
  2. window.onload传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload为准
  3. 如果使用addEventListener则没有限制,可以叠加很多个
<!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>
    <script>
        window.addEventListener('load',function(){
            var btn = document.querySelector('button');
            btn.addEventListener('click',function(){
                alert('hh');
            })
            alert('11');
        })
        window.addEventListener('load',function(){
            alert('22');
        })
        document.addEventListener('DOMContentLoaded',function(){
            alert('33');
        })
    </script>
</head>
<body>
   <button>hhh</button>
</body>
</html>

最先显示33,而后是11,然后是22,之后才显示按钮以触发点击事件。


2.2 调整窗口大小事件

window.onresize = function() {}
window.addEventListener("resize",function() {})
window.onresize 是调整窗口大小加载事件,当触发时就调用的处理函数

注意

  1. 只要窗口大小发生像素变化,就会触发这个事件
  2. 我们经常利用这个事件完成响应式布局,window.innerWidth为当前屏幕的宽度

2.3 定时器

2.3.1 设置定时器

方法一setTimeout()
window.setTimeout(调用函数,[延迟的毫秒数])(这个window可以省略,延迟时间可以省略,省略后默认是0)
setTimeout()方法用于设置一个定时器,该定时器在定时到期后执行调用函数

<script>
        //第一种写法
        setTimeout(function(){
            console.log('时间到了');
        },2000);
        //第二种写法
        function callback(){
            console.log('时间到了');
        }
        setTimeout(callback,2000);
</script>

方法二setInterval()
window.setInterval(回调函数,[间隔的毫秒数])
setInterval()方法重复调用一个函数,每隔这个时间,就去调用一次回调函数
定时器可能有很多,所以我们经常给定时器赋值一个标识符


2.3.2 回调函数

setTimeout() 这个调用函数我们也称之为回调函数callback
普通函数是按照代码顺序直接调用,而这个函数需要等待一定时间,时间到了才去调用这个函数,因此称为回调函数。以前我们学的点击事件也是回调函数。


2.3.3 停止定时器

window.clearTimeout(timeoutID)
该方法可以取消先前通过调用setTimeout()建立的定时器

<body>
   <button>点击停止计时器</button>
   <script>
    var btn = document.querySelector('button');
    var timer = setTimeout(function(){
        console.log('时间到了');
    },2000);
    btn.addEventListener('click',function(){
        clearTimeout(timer);
    })
</script>
</body>

window可以省略,括号内的参数就是定时器的标识符
window.clearInterval(intervalID)
该方法可以取消先前通过调用setInterval()建立的定时器

<body>
   <button class="begin">点击开始定时器</button>
   <button class="stop">点击结束定时器</button>
   <script>
    var begin = document.querySelector('.begin');
    var stop = document.querySelector('.stop');
    var timer = null;
    begin.addEventListener('click',function(){
        timer = setInterval(function(){
            console.log('哈哈哈');
        },1000);
    })
    stop.addEventListener('click',function(){
        clearInterval(timer);
    })
</script>
</body>

三、JS执行队列

3.1 单线程

Javascript语言的一大特点就是单线程,也就是说同一时间只能做一件事,这是因为Javascript专门脚本语言诞生的使命所致——Javascript视为处理页面中用户的交互,以及操作DOM而生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行,应该先进行添加之后再删除。单线程就意味着所有任务需要排队,前一个任务结束才会执行后一个任务。这样所导致的问题就是,如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。


3.2 同步和异步

为了解决这个问题,利用多核CPU的计算能力,HTML5提出Web Worker标准,允许Javascript脚本创建多个线程,于是Javascript中出现了同步异步
同步
前一个任务结束后再执行。后一个任务程序的执行顺序与任务的排列顺序是一致的,同步的。比如做饭,我们要烧水煮饭,等水开了之后再去切菜炒菜。
异步
你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。比如做饭,我们在烧水的同时利用间隔时间去切菜炒菜。
在这里插入图片描述


3.3 JS执行机制

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

四、location对象

Window对象给我们提供了一个location属性,用于获取或设置窗体的url,并且可以用于解析url,因为这个属性返回的是一个对象,所以我们也将这个属性称为location对象

4.1 URL

在这里插入图片描述


4.2 location参数的属性

在这里插入图片描述

<body>
   <button>点击</button>
   <script>
    var btn = document.querySelector('button');
    btn.addEventListener('click',function(){
        console.log(location.href);
    })
   </script>
</body

在这里插入图片描述


4.3 location对象的常见方法

在这里插入图片描述

五、navigator对象

Navigator对象包含有关浏览器的信息,他有很多属性,我们最常用的是userAgent。该属性可以返回由客户机发送服务器的user -agent头部的值。
可以判断用户是使用哪个终端打开页面,实现跳转。

<script>
    if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))){
        window.location.href = "";//手机
    }else {
        window.location.href = "";//电脑
    }
</script>

六、 history对象

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

<body>
   <a href="#">点我去往列表页</a>
   <button>前进</button>
   <script>
    var btn = document.querySelector('button');
    btn.addEventListener('click',function(){
        history.forward();
    })
   </script>
</body>

七、PC端网页特效

7.1 元素偏移量offset系列

offset即元素偏移量,我们使用offset系列相关属性可以动态地得到该元素的位置(偏移)、大小等。

  • 获得元素距离带有定位父元素的位置
  • 获得元素自身的大小、宽高
  • 注意返回的数值都不带单位

offset系列常见属性
在这里插入图片描述

<!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>
        *{
            margin: 0;
            padding: 0;
        }
        .box{
            margin-top: 100px;
            margin-left: 100px;
            width: 200px;
            height: 200px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        var box = document.querySelector('.box');
        console.log(box.offsetTop);
        console.log(box.offsetLeft);
    </script>
</body>
</html>

在这里插入图片描述
注意宽高是包含padding、padding、width的
在这里插入图片描述


7.2 元素可视区client系列

client即客户端,我们使用client系列的相关属性来获取元素可视区的相关信息,通过client系列的相关属性可以动态地得到该元素的边框大小、元素大小等
在这里插入图片描述
与offset区别
client不包含border边框


7.3 元素滚动scroll系列

scroll即滚动,我们使用scroll系列的相关属性可以动态的得到该元素的大小、滚动距离等
在这里插入图片描述
scrollHeight是实际内容的大小
clientHeight是盒子的大小
在这里插入图片描述


总结(一定要看哦!!!)

这就是我们最后一次写博客了,不知不觉讨论班也要接近尾声了。感谢同在蓝旭并肩作战坚持到最后的我们,也要感谢每一位耐心为我们解答问题的学长学姐。

一段文字送给大家

我也曾赴过琼林宴,我也曾打马御街前。惟愿此去经年,于万物众生中磊落做人,身怀赤诚,告诉世界何谓勇敢。人世间山水迢迢,路遥马急,借此,祝所有相遇:天高海阔,万事胜意,山水有来路,早晚复相逢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于STM32和FPGA的区别,我认为STM32是一种微控制器,它的主要功能是实现控制逻辑,比如控制设备的运行状态或者处理一些简单的数据处理任务。而FPGA则是一种可编程逻辑器件,它可以实现复杂的逻辑功能,比如多层数据处理、多层控制逻辑、多层数据存储等。此外,FPGA更加灵活,可以根据不同的应用场景来定制其功能。 ### 回答2: STM32和FPGA是两种不同类型的嵌入式系统开发工具。STM32是一种基于ARM Cortex-M内核的32位微控制器,而FPGA是可编程逻辑门阵列。 首先,STM32是一种专用的微控制器,具有固定的硬件架构和功能。它的性能和功能在设计之初就被确定,并且无法根据需求进行扩展或修改。STM32适用于大多数应用场景,并且因其成本低、功耗低和易于开发的特点受到广泛推广。 与之不同,FPGA是可编程的芯片,可以通过逻辑门的配置来实现特定的功能。FPGA具有高度的灵活性和可重构性,可以根据需要逻辑门的重新配置。它适用于需要快速变更或自定义硬件逻辑的应用场景。 其次,STM32和FPGA在开发复杂性上也存在差异。STM32使用C语言进行编程,它可以通过编程语言的抽象层来隐藏底层硬件细节,使开发过程相对简单。而FPGA需要使用硬件描述语言(HDL)如VHDL或Verilog进行编程,需要对硬件结构和电路设计有深入的了解,开发过程相对复杂。 另外,STM32更适合于低功耗和资源有限的应用,如嵌入式系统、传感器和小型设备。而对于需要更高性能、更大规模和更复杂逻辑的应用,如图像处理、信号处理和高性能计算等,FPGA则更加适用。 总结而言,STM32和FPGA在硬件结构、灵活性、开发复杂性和应用范围等方面存在差异。选择使用哪一种取决于具体的应用需求和项目要求。 ### 回答3: STM32是一种基于ARM Cortex-M内核的32位微控制器芯片,而FPGA是可编程逻辑设备,可以根据需要进行配置和重新编程。这两者在应用范围、性能、开发难度和功耗等方面具有一些不同。 首先,在应用范围方面,STM32常用于嵌入式系统和智能设备,适合于需要高性能、实时性和低功耗的应用。而FPGA则更适用于需要灵活性和可编程性的应用,如数字信号处理、图像处理和计算加速等。 其次,在性能方面,STM32的性能通常较为有限,但其廉价、易用和低功耗的特点使其在大量应用得到广泛应用。而FPGA则具有更高的性能和更大的逻辑资源,可以实现复杂的算法和功能。 再次,在开发难度方面,STM32开发相对简单,主要使用C语言进行编程,并有较为完善的开发工具和文档支持。而FPGA的开发需要掌握硬件描述语言(如Verilog和VHDL),需要更深入的电路理论和设计知识。 最后,在功耗方面,STM32通常具有低功耗的特点,适合于电池供电和功耗要求较低的应用。而FPGA的功耗较高,适合于需要更大计算能力的应用。 综上所述,STM32和FPGA在应用范围、性能、开发难度和功耗等方面存在差异。选择合适的芯片取决于具体需求,如果需要低成本、低功耗的简单应用,可以选择STM32;如果需要灵活性、可编程性和高性能需求,可以选择FPGA。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值