BOM 的核心是 window 对象,表示浏览器的实例。
location 对象是最有用的 BOM 对象之一,提供当前窗口中加载文档的信息及常用导航功能。它既是 window 属性又是 document 属性。
navigator 对象的属性通常用于确定浏览器的类型。
screen 对象保存的纯粹是客户端能力信息,也就是浏览器窗口外面的客户端显示器信息
history 对象表示当前窗口首次使用以来用户的导航历史记录,该对象并不会暴露用户访问过的 URL,但可以在不知道实际 URL 的情况下实现前进和后退。
使用 go 方法可以在用户历史记录中沿任何方向导航,接收一个参数表示前进或后退多少步。可以使用 back 和 forward 方法简写,模拟浏览器的前进后退按钮。history 对象还有一个 length 属性表示历史记录中有多少条目。
history.pushState 方法可以让开发者改变浏览器 URL 而不会加载新页面,该方法接收3个参数:一个 state 对象、一个新状态的标题和一个(可选)相对 URL。
let stateObject = {foo:'bar'}
history.pushState(stateObject, 'My Title', 'baz.html')
pushState 方法执行后,状态信息会被推到历史记录中,浏览器地址也会改变以反映新的相对 URL。虽然 location.href 返回的是地址栏中的新内容但是浏览器页不会向服务器发送请求。
可以通过 history.state 获取当前状态对象,使用 replaceState 覆盖当前状态。
任何 HTML 和 XML 文档都可以用 DOM 表示为一个由节点组成的层级结构
DOM元素新增的5个属性:
事件流描述了页面接收时间的顺序。
事件冒泡的事件被定义为从最具体的元素开始触发,然后向上传播到没那么具体的元素。现代浏览器中的事件会一直冒泡到 windows 对象。
事件捕获的意思是最不具体的元素最先收到事件,最具体的节点最后收到事件。事件捕获是为了在事件到达最终目标前拦截事件。
DOM 事件流规定事件流分为3个阶段:事件捕获、到达目标和事件冒泡。
为响应事件而调用的函数称为事件处理程序(或事件监听器)。
JavaScript 中传统的事件处理程序是把一个函数赋值给元素的一个事件处理程序属性。例如:
let btn = document.getElementById('myBtn');
btn.onClick = function() {
console.log('Clicked');
};
DOM2 Events 为事件处理程序的赋值和移除定义了两个方法:addEventListener 和 removeEventListener。方法接收3个参数:事件名、事件处理函数和一个布尔值(true 表示在捕获阶段调用事件处理程序,false 表示在冒泡阶段调用事件处理程序)。使用 DOM2 方式的主要优势是可以为同一个事件添加多个事件处理程序。
在 DOM 中发生事件时,所有相关信息会存储在 event 对象中,event 对象也是传给事件处理程序的唯一参数。
焦点事件在页面元素获得或失去焦点时触发。常用焦点事件包括:
XHR 对象通过 XMLHttpRequest 构造函数创建,使用 open 方法配置并使用 send 方法发送。open 方法接收3个参数:请求类型,URL 以及 请求是否异步的布尔值。send 方法接收一个参数,作为请求体发送的数据。如果不需要请求体则必须传 null。
let xhr = new XMLHttpRequest()
xhr.open('get', 'example.php', false)
xhr.send(null)
收到服务器响应后,XHR 对象的以下属性会被填充数据:
此外 XHR 对象有一个 readyState 属性,表示当前处在请求/响应过程的哪个阶段。常用的值为 4,表示收到所有响应。readyState 改变时会触发 readystatechange 事件,可以为 XHR 对象添加事件处理程序。
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
alert(xhr.responseText)
} else {
alert('request was unsuccessful:' + xhr.status)
}
}
}
xhr.open('get', 'example.txt', true)
xhr.send(null)
可以调用 abort 方法在收到响应前取消异步请求。
XHR 对象可以使用 setRequestHeader 方法设置额外的请求头,使用 getResponseHeader 方法传入想要获取的头部名称获取响应头,使用 getAllResponseHeaders 方法获取所有响应头的字符串。
FormData 类型用于表单序列化,也便于创建与表单类似格式的数据通过 XHR 对象发送。
跨源资源共享(CORS)定义了浏览器与服务器如何实现跨源通信。其基本思路是使用自定义 HTTP 头部允许浏览器和服务器相互了解以确认请求或响应应该成功还是失败。
对于简单的请求,比如:GET 或 POST 类型,没有自定义头部且请求体是 text/plain 类型,这样的请求会在发送时有一个额外的头部 Origin,包含发送请求的页面的源(协议、域名和端口)。如果服务器决定响应请求,应该发送 Access-Control-Allow-Origin 头部包含相同的源或 *(表示资源公开)。如果没有这个头部或源不匹配则表明不会响应浏览器请求。无论请求还是响应都不会包含 cookie 信息。
对于上述简单请求外的情况,CORS 通过一种叫预检请求的服务器验证机制实现跨源。在发送自定义头部、GET 和 POST 外的方法以及不同请求体内容类型时,会先向服务器发送一个“预检”请求,这个请求使用 OPTIONS 方法发送并包含以下头部:
服务器在这个请求发送后可以确定是否允许这种类型的请求并在响应中发送如下头部:
预检请求返回后,结果会按照响应指定时间缓存一段时间。
默认情况下,跨源请求不提供凭据(cookie、HTTP 认证和客户端 SSL 证书)。可以通过 WithCredentials 属性设置为 true 来表明请求会发送凭据。如果服务器允许带凭据的请求,可以在响应中包含头部:Access-Control-Allow-Credentials: true。