Skip to content

Latest commit

 

History

History
130 lines (85 loc) · 4.75 KB

XMLHttpRequest.md

File metadata and controls

130 lines (85 loc) · 4.75 KB

XMLHttpRequest

首先,我们先来了解什么是 AJAX

AJAX(Asynchronous JavaScript and XML,异步 JavaScript 与 XML),指的是一套综合了多项技术的浏览器端网页开发技术。用于创建快速动态网页的技术。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页。如 Form 表单提交,用户点击提交按钮,浏览器将会刷新页面。而通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

而 AJAX 的实现,正是基于本文将要讲的主题 XMLHttpRequest

XMLHttpRequest 介绍

XMLHttpRequest(XHR)是微软在九十年代发明的,在 2002-2006 期间,随着所有浏览器的实现,XHR 成为了标准。2006 年,W3C 标准化了 XMLHttpRequest。

在这几年的发展中,像 GMail 或 Google 地图,它们在很大程度上都基于 XHR。

且为了方便使用和跨浏览器 XHR 存在的一些不一致性,像 jQuery 这样的库通过为开发人员提供易于使用的抽象而得到了普及,这反过来又帮助推广了这种技术的使用。

XHR 请求示例

以下代码创建一个 XMLHttpRequest (XHR) 请求对象,并附加一个响应 onreadystatechange 事件的回调函数。

设置 xhr 连接是为了执行对 https://jsonplaceholder.typicode.com/todos/1 的 GET 请求,并使用 send() 方法发送:

const xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
  if (xhr.readyState === 4) {
    xhr.status === 200 ? console.log(xhr.responseText) : console.error('error')
  }
}
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1')
xhr.send()

其他 open() 参数

在上面的示例中,我们只是将方法和 URL 传递给请求。

我们还可以指定其他 HTTP 方法(getpostheadputdeleteoptions)。

其他参数允许您指定一个标志,以便在设置为 false 时使请求同步,以及一组用于 HTTP 身份验证的凭据:

open(method, url, asynchronous, username, password)

onreadystatechange

在 XHR 请求过程中多次调用 onreadystatechange。我们显式忽略除 readyState === 4 之外的所有状态,这意味着请求已完成。

状态为:

  • 1(OPEN):请求开始
  • 2 (HEADERS_RECEIVED):HTTP response header 已被接收
  • 3(LOADING):响应正在被加载
  • 4 (DONE):请求完成

中止 XHR 请求

可以通过调用 XHR 对象上的 abort() 方法中止 XHR 请求。

const xhr = new XMLHttpRequest()

xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1', true)
xhr.send()

// 取消发送请求
xhr.abort()

如果您对 axios 和 fetch 如何取消已发送的网络请求感兴趣,可以阅读取消已发送的网络请求

与 jQuery 的比较

使用 jQuery,这些行可以转换为:

$.get('https://jsonplaceholder.typicode.com/todos/1', (data) => {
  console.log(data)
}).fail((err) => {
  console.error(err)
})

与 Fetch 的比较

使用 Fetch API:

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then((res) => res.json())
  .then((data) => console.log(data))
  .catch((err) => {
    console.error(err)
  })

使用 async/await

const data = fetch('https://jsonplaceholder.typicode.com/todos/1').then((res) =>
  res.json()
)
const result = await data()
console.log(result)

它们都是与 XHR 请求等效的代码。

跨域请求

请注意,XMLHttpRequest 连接受到出于安全原因而强制执行的特定限制的约束。

其中最明显的一项是同源策略的执行。

您无法访问另一台服务器上的资源,除非该服务器使用 CORS(跨源资源共享)明确支持这一点。

最后

在本文,我们简单的了解了它的一些基本操作。

XMLHttpRequest 还有很多其他的内容,您可以在下面提供的文章中了解它们。

进一步阅读