BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。
BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。
DOM、BOM 比较
DOM | BOM |
---|---|
文档对象模型 | 浏览器对象模型 |
把文档当做一个对象来看待 | 把浏览器当做一个对象来看待 |
顶级对象是 document | 顶级对象是 window |
操作页面元素 | 浏览器窗口交互的一些对象 |
是W3C 标准规范 | 是浏览器厂商在各自浏览器上定义的,兼容性较差 |
window 对象是浏览器的顶级对象,具有双重角色。
定义在全局作用域中的变量、函数都会变成 window 对象的属性和方法。
在调用的时候可以省略 window。
注意:window下有个特殊属性 window.name
window.onload = function(){}
// 或者
window.addEventListener("load",function(){});
window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS 文件等), 就调用的处理函数。
注:
window.onload
可以把 js 代码写到页面元素的上方,因为 onload
是等页面内容全部加载完毕,再去执行处理函数;window.onload
这种传统注册事件方式,只能写一次,如果有多个会以最后一个window.onload
为准; 但使用 addEventListener
则无此限制。document.addEventListener('DOMContentLoaded',function(){})
DOMContentLoaded
事件触发时,仅DOM加载完成。不包括样式表,图片,flash等等。
IE9 以上才支持;
如页面图片较多, 从用户访问到onload触发可能需要较长的时间,则交互效果不能很好实现,影响用户体验,此时用 DOMContentLoaded 事件更合适。
window.onresize = function(){};
// 或者
window.addEventListener("resize",function(){});
window.onresize
是调整窗口大小加载事件, 当触发时就调用的处理函数。
注:
window.innerWidth
当前屏幕的宽度。window 对象提供的 2 个方法-定时器。
setTimeout
();setInterval
();// 语法结构
window.setTimeout(调用函数,[延迟的毫秒数]);
setTimeout
() 方法用于设置一个定时器,该定时器在定时器到期后执行调用函数。
注:
此调用函数可直接写函数,或者写函数名或者采取字符串‘函数名()'三种形式;第3种不推荐。延迟数省略默认是 0,单位为毫秒。
window.clearTimeout(timeoutID) //timeoutID即定时器标识符。
clearTimeout
()方法,取消了通过调用setTimeout
()建立的定时器。
window.setInterval(回调函数, [间隔的毫秒数]);
setInterval
() 方法,重复调用一个函数,每隔设定的间隔时间,就去调用一次回调函数。
第一次执行也是在间隔毫秒数之后执行,之后每隔毫秒数就执行一次。
window.clearInterval(intervalID); // 前面的window可省略
clearInterval
()方法,取消了通过调用 setInterval
()建立的定时器。
this
的指向在函数定义的时候无法确定,只有函数执行的时候才能确定其具体指向,通常,this最终指向的是调用它的对象;
this指向:
- 全局作用域或者普通函数中this指向全局对象window(注:定时器的this除外,其指向window);
- 方法调用中谁调用this,就指向谁;
- 构造函数中this指向构造函数的实例。
JavaScript 语言的一大特点就是单线程。
它是为处理页面中用户的交互,以及操作 DOM 而诞生的。
如对某个 DOM 元素进行添加和删除操作。应该先进行添加,之后再删除,它们不能同时进行。
单线程,即所有任务需排队,前一任务结束,才执行后一任务。
如果 JS 执行时间过长,会造成页面渲染不连贯,页面渲染加载阻塞。
为了解决单线程导致的问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程。于是,JS 中出现了同步和异步。
同步任务
同步任务都在主线程上执行,形成一个执行栈。
异步任务
JS 异步通过回调函数实现。
异步任务主要类型:
1、普通事件:如 click
、resize
等;
2、资源加载:如 load
、error
等;
3、定时器:包括 setInterval
、setTimeout
等。
异步任务相关回调函数添加到任务队列中(任务队列也称消息队列)。
由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环( event loop)。
window 对象给我们提供了一个 location 属性
用于获取或设置窗体的 URL
,并且可以用于解析URL
。 因为这个属性返回的是一个对象,所以我们将这个属性也称为 location 对象
。
统一资源定位符 (Uniform Resource Locator, URL) 是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理。
/* URL 一般语法格式为:*/
protocol://host[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#link
组成 | 说明 |
---|---|
protocol |
通信协议,常用的http、ftp、maito等 |
host |
主机(域名)如 www.webldm.com |
port |
端口号 可选。省略时,使用方案的默认端口。如http的默认端口为80 |
path |
路径由0或多个“/”符号隔开的字符串组成,一般用来表示主机上的一个目录或文件地址 |
query |
参数 以键值对的形式,通过&符号分隔开来 |
fragment |
片段 #后面内容 常见于链接 锚点 |
location对象属性 | 返回值 |
---|---|
location.href |
获取或者设置整个URL |
location.host |
返回主机(域名)www.webldm.com |
location.port |
返回端口号,如果未写,返回空字符串。 |
location.pathname |
返回路径 |
location.search |
返回参数 |
location.hash |
返回片段 #后面的内容,常见于链接 锚点 |
重点:
href
和search
location对象方法 | 返回值 |
---|---|
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 = ""; //手机
} else {
window.location.href = ""; //电脑
}
window 对象给我们提供了一个history
对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的 URL。
history对象方法 | 作用 |
---|---|
back () |
后退功能 |
forward |
前进功能 |
go (参数) |
前进后退功能,参数如果是1,前进1个页面;如果是-1,后退1个页面。 |
history
对象一般在实际开发中比较少用,但是会在一些OA 办公系统
中见到。如下图: