BOM

Misaka10032Javascript基础浏览器顶级对象浏览器操作大约 7 分钟

全称 Browser Object Model 浏览器对象模型

BOM 可以使我们通过 JS 来操作浏览器

在 BOM 中为我们提供了一组对象,用来完成对浏览器的操作

BOM 对象

Window:

整个浏览器的窗口,同时也是网页中的全局对象。

下面的 Navigator、Location 这些对象都属于 window 属性。

事件

  1. onload

window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本 文件、CSS 文件等)。

注意:

1.有了 window.onload ,就可以把 JS 代码写到页面元素的上方,因为 onload 是等页面内容全 部加载完毕,再去执行处理函数

2.window.onload 传统注册事件方式 只能写一次,如果有多个,会以最后一个 window.onload 为准

3.如果使用 addEventListener 则没有限制


  1. onresize

window.onresize 是调整窗口大小加载事件, 当触发时就调用的处理函数。

1.只要窗口大小发生像素变化,就会触发这个事件

2.经常利用这个事件完成响应式布局

3.window.innerWidth:获取当前屏幕的宽度

方法

  1. open()

打开新窗口

语法:

window.open(URL,name,parameters)

URL 为子窗口页面地址

name 为子窗口句柄

parameters 为窗口参数(各参数用逗号分隔)


  1. close()

close() 方法用于关闭浏览器窗口。


  1. setInterval()

按照指定的周期(以毫秒计)来调用函数或计算表达式。

参数:

1.回调函数,该函数每隔一段时间被调用一次。

2.每次调用间隔的时间,单位毫秒。

返回值:一个 Number 类型的数据。数字用来作为定时器的唯一标识。


  1. clearInterval()

关闭一个定时器

方法中需要一个定时器的标识作为参数,这样将关闭标识对应定时器。

clearInterval()可以接收任意参数,如果参数标识有效,则停止对应定时器。

如果参数无效,则不执行。


  1. setTimeout()

延时调用一个函数,不马上执行,而是隔一段时间以后再执行。

与定时调用区别:定时调用执行多次,延时调用只执行一次。

当前浏览器的信息,通过该对象可以识别不同浏览器。由于历史原因,Navigator 对象中大部分属性已经不能帮助识别浏览器了。

一般只会使用 userAgent(字符串)来判断浏览器信息

userAgent:包含浏览器信息内容,不同浏览器内容不同。

IE11 已去除微软和 IE 相关标识,现在也不能通过 userAgent 识别浏览器是否为 IE 了。

现在常通过一些浏览器中特有对象,判断浏览器信息。

比如:ActiveXObject

Location:

当前浏览器的地址栏信息。通过它可以获取地址栏信息,操作浏览器跳转页面。

直接打印 location:获取到地址栏信息(当前页面的完整路径)。

修改 location 为完整路径 or 相对路径,会自动跳转到该路径,并且生成相应历史记录。

属性描述
hash设置或返回从井号(#)开始的 URL(锚)
host设置或返回主机名和当前 URL 的端口号
hostname设置或返回当前 URL 的主机名
href设置或返回完整的 URL
pathname设置或返回当前 URL 的路径部分
port设置或返回当前 URL 的端口号
protocol设置或返回当前 URL 的协议
search设置或返回从问号(?)开始的 URL(查询部分)
属性描述
assign()跳转到其他页面,作用和直接修改 location 一样
reload()重新加载当前页面,作用和刷新一样。方法中传递 true,强制清空缓存刷新页面
replace()使用一个新的页面替换当前页面,调用完毕后跳转页面。不会生成历史记录,不能使用回退按钮

从输入 URL 到页面加载的全过程

1.DNS 域名解析

2.建立 TCP 连接

3.发送 HTTP 请求

4.服务器返回响应结果(处理请求并返回 HTTP 报文)

5.浏览器解析 THML

6.浏览器渲染页面

7.连接结束

History

浏览器的历史记录,可以通过该对象操作浏览器的历史记录。由于隐私原因,该对象不能获取到具体历史记录,只能操作浏览器向前 or 向后翻页。而且该操作只在当次访问时有效。

属性描述
length返回浏览器历史列表中的 URL 数量
方法描述
back()加载 history 列表中的前一个 URL
forward()加载 history 列表中的下一个 URL
go()加载 history 列表中的某个具体页面

go()

跳转到指定页面

需要一个整数作为参数:

1:向前跳转1个页面 等于forward()

2:向前跳转2个页面

-1:向后跳转一个页面 等于back()

-2:向后跳转2个页面

Screen:

用户的屏幕信息,可获取到用户的显示器相关信息。(用的较少)。

总结

这些BOM对象在浏览器中都是作为window对象的属性保存的,可以通过window对象来使用,也可以直接使用。

定时器应用

思想

定时器设置,通过启动/停止事件给定时器设置关键值,用于启动和停止定时器。

定时器放置于事件中的时候,由于事件不断调用导致定时器叠加,所以每次定时器函数调用时必须先清除定时器再向下执行。

设置

定义一个变量timer,用来保存定时器标识。

参数:

obj,执行动画的对象。

attr:要执行动画的样式,比如:left top width height

target:执行动画的目标位置。

speed,移动速度。

判断speed正负值,如果从左向右移,speed为正;如果从右向左移,speed为负。

回调函数,这个函数将会在动画执行完毕之后执行。

两个及以上元素调用同一个定时器响应函数

无法调用同一个timer变量,因为后一个元素触发响应时总会清除前一个timer定时器。

需要给对象添加obj.timer属性,对象自己保存自己的定时器标识。

执行机制

JS是单线程

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

同步和异步

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

异步任务:JS 的异步是通过回调函数实现的,异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列),一般而言,异步任务有以下三种类型:

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

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

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

为了解决这个问题,JS 的设计者将这种耗时很长的任务先挂起,并添加到一个叫做任务队列 的处理机制中,等到其他任务执行完毕后,才会来执行它,这种任务叫做异步任务,而其他先被执 行的任务叫做同步任务。

异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数

3.执行流程

1.先执行执行栈中的同步任务

2.异步任务(回调函数)放入任务队列中

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

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