- 能够说出什么是BOM
- 能够知道浏览器的顶级对象window
- 能够写出页面加载事件以及注意事项
- 能够写出两种定时器函数并说出区别
- 能够说出JS执行机制
- 能够使用location对象完成页面之间的跳转
- 能够知道navigator对象涉及的属性
- 能够使用history提供的方法实现页面刷新
BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window
BOM由一系列相关的对象构成,每个对象都提供了很多方法和属性
BOM缺乏标准,JS语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape(网景)浏览器标准的一部分。
DOM:
- 文档对象模型
- 把「
文档
」看做一个「对象
」 - 顶级对象是
document
- 主要作用是操作页面元素
- W3C规范
BOM:
- 浏览器对象模型
- 把「
浏览器
」看做一个「对象
」 - 顶级对象是
window
- 主要作用是浏览器窗口交互
- 规范性较差
BOM比DOM更大,它包含DOM。
window:
- document
- location
- navigation
- screen
- history
window对象是浏览器的顶级对象,它具有双重角色:
- 它是JS访问浏览器的
一个接口
- 它是
一个全局对象
。定义在全局作用域下的变量、函数都会成为window对象的属性和方法
在调用的时候可以省略window
注意:为什么声明变量时最好不要用name,因为window有一个属性就是name
window.onload = function(){}
或者:
window.addEventListener("load",function(){});
load
窗口加载事件,只有当页面加载完毕(包括图片,脚本文件,css)后才会调用执行函数
document.addEventListener("DOMContentLoaded",function(){})
DOMContentLoaded
事件触发时,仅是当DOM加载完成,不包括图片,CSS等内容 IE9以上才支持。
如果页面的图片较多,使用onload
那么就会影响交互准备完毕的时间,此时使用DOMContentLoaded
更加合适。
window.onresize = function(){}
window.addEventListener("resize",function(){})
resize
是调整窗口大小加载事件,当触发时就会调用函数
注意:
- 只要窗口发生像素变化,就会触发这个事件
- 我们经常利用这个事件完成响应式布局。
window.innerWidth
:当前屏幕宽度
window.addEventListener("resize", function() {
// 我们让这个div在屏幕小于900px时隐藏起来
var div = document.querySelector("div");
// window.innerWidth 屏幕宽度
if (window.innerWidth < 900) {
div.style.display = "none";
} else {
div.style.display = "block";
}
});
window
给我们提供了两种定时器方法
setTimeout()
setInterval()
window.setTimeout(调用函数,[延迟的毫秒数]);
setTimeout()
用于设置一个定时器,该定时器在定时器到期时执行函数
- 在使用时
window
可以省略 - 注意时间是毫秒数,默认是0
- 调用函数可以写匿名函数,还可以写函数名,还有一种写法"函数名()"不提倡
- 页面中可能有很多定时器,我们经常给定时器赋值一个标识符
setTimeout()
调用的函数我们也称为回调函数(callback)
。普通的函数是按照代码顺序去调用的,而这个函数,需要等待时间
,时间到了才会调用函数,因此叫做回调函数。
之前的element.onclick = function(){}
或者element.addEventListener("click",fn)
像这种函数其实都是回调函数
window.clearTimeout(timeoutID)
clearTimeout()
方法取消之前通过setTimeout()
设定的定时器。
window
可省略- 里面的参数是定时器的标识符
window.setInterval(回调函数,[间隔的毫秒数]);
setInterval()
方法重复调用一个函数,每隔一段时间,就调用一次回调函数
window
可省略setTimeout
只调用一次回调函数,setInterval
会重复调用回调函数
window.clearInterval(intervalID)
clearInterval()
方法取消之前setInterval()
建立的定时器
- window可以省略
this
的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this
到底指向谁,一般情况下this
的最终指向的是那个调用它的对象
JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事。这是因为JS这门脚本语言诞生的使命所致的——JavaScript是为了处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行,应该先进行添加,再进行删除。
为了解决等待的问题,利用多核CPU的计算能力,H5提出Web Worker
标准,允许JS脚本创建多个线程,因此,JS出现了同步
和异步
前一个任务结束后才会执行下一个任务,任务的执行顺序和任务的排列顺序是一致的。
如果一个任务耗费时间较长,可以在执行这个任务的同时,执行下个任务
同步任务都在主线程上执行,形成一个执行栈
JS的异步是通过回调函数
实现的,一般而言:异步任务有以下三种类型:
- 普通事件,如:click、resize等
- 资源加载,如:load、error等
- 定时器,如:setInterval、setTimeout等
所以在JS中,所有的回调函数的执行
放入到异步任务中。
- 先执行执行栈中的
同步任务
- 异步任务(
回调函数
)放入到任务队列中 - 一旦执行栈中的所有
同步任务
执行完毕,系统就会按次序读取任务队列
中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈
开始执行
- 如果遇到多个异步任务,那么就按照进入任务队列
异步任务
的顺序依次执行
- 如果遇到点击事件、鼠标移动事件等等这种情况,那么此时如果鼠标不点击,那么异步队列就是空的状态,鼠标点击,回调函数进行异步队列;鼠标再一点击,回调函数又进入异步队列......像这种情况,由于主程序不断重复的
获取任务
、执行任务
、再获取任务
、再执行任务
这种机制叫做事件循环
(event loop
)。
window
对象给我们提供了一个location
属性用于获取或设置窗体的URL
,并且可以解析URL
。因为这个属性返回的是一个对象,所以我们也把这个属性叫做location对象
。
统一资源定位符(Uniform Resource Locator,URL)是互联网上标准资源的地址。互联网上的每个文件都有唯一的URL,它包含的信息指出文件的位置以及浏览器如何处理它。
URL的语法格式为:
protocol://host[:port]/path/[?query]#fragment
http://www.baidu.com/index.html?wd='123'#link
组成 | 说明 |
---|---|
protocol | 通信协议 常用的http、ftp、mailto等 |
host | 主机(域名) www.baidu.com |
port | 端口号,可选,省略时使用方案的默认端口,如http默认端口80 |
path | 路径,由零或者多个/符号隔开的字符串,一般用于表示主机的一个目录或者文件地址 |
query | 参数 以键值对的方式通过&符号隔开 |
fragment | 片段 #后面的内容 常见于链接锚点 |
属性 | 返回值 |
---|---|
location.href |
获取或者设置整个URL |
location.host |
返回主机(域名) |
location.port |
返回端口号,如果未写返回空字符串 |
location.pathname |
返回路径 |
location.search |
返回参数 |
location.hash |
返回片段 #后面的内容 |
重点记住:href
和search
方法 | 返回值 |
---|---|
location.assign() |
跟href 一样,可以跳转页面(也称为重定向页面) |
location.replace() |
替换当前页面,因为不记录历史,所以不能后退页面 |
location.reload() |
重新加载页面,相当于刷新按钮或者F5。如果参数是true ,那么就相当于ctrl+F5 强制刷新 |
navigator
对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent
,该属性可以返回由客户机发送服务器的user-agent
的值
下面代码可以判断客户端的类型,返回不同的结果
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 = "https://m.baidu.com"; //手机
}
window
对象给我们提供了一个history
对象,与浏览器历史记录
进行交互,该对象包含用户(在浏览器窗口中)访问过的URL。
方法 | 作用 |
---|---|
history.back() |
后退 |
history.forward() |
前进 |
history.go(参数) |
前进后退,参数是1 表示前进 1个页面,如果是-1 ,那么是后退 1个页面 |
这个对象不经常使用,但是会在一些OA
系统上能看到