外观
Ajax 的原理是什么?
Ajax 是在不整页刷新的情况下,用脚本向服务器要数据。浏览器里最早的接口是 XMLHttpRequest,现在业务代码优先用 fetch。两者都受同源策略约束。
原理
XMLHttpRequest 的步骤:创建对象,open(method, url, async),设置请求头,send(body),在 onreadystatechange 里看 readyState === 4 和状态码。readyState 从 0 到 4,4 表示完成。
js
const xhr = new XMLHttpRequest()
xhr.open("GET", "/api/user")
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) console.log(xhr.responseText)
}
xhr.send()fetch 返回 Promise。注意:HTTP 404、500 不会 reject,要自己看 response.ok。网络断开、CORS 被拦、主动 abort 才会 reject。
取消用 AbortController。超时要自己计时后 abort,fetch 没有 timeout 选项。上传和下载进度仍是 XMLHttpRequest 的 upload.onprogress 更直接。
追问
和表单提交有什么不同?
表单提交会导航到响应页。Ajax 把响应交回脚本,页面自己决定怎么更新。改数据的请求仍然要防 CSRF,见 CSRF。
JSONP 算 Ajax 吗?
它靠 script 标签发 GET,并执行返回的脚本,不是 XHR。只能 GET,而且等于信任对方的代码。现在用 CORS,不要用 JSONP。
易错点
fetch的 404 走then,不走catch。- 自定义头或
Content-Type: application/json会触发预检。见 跨域。 - 同步 XHR(
open的第三个参数为false)会卡住页面,不要用。