1.知识点

  • XMLHttpRequest
  • 状态码
  • 跨域:同源策略,跨域解决方案

Ajax请求
  1. //GET请求
  2. const xhr = new XMLHttpRequest();
  3. xhr.open('GET',url,true); // 此时还没有发送 当您使用 async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可:
  4. xhr.onreadystatechange = function(){
  5. if(xhr.readyState === 4){
  6. if(xhr.status === 200){
  7. alert(xhr.response)
  8. }
  9. }
  10. }
  11. xhr.send(null)
  12. //POST请求
  13. const xhr = new XMLHttpRequest();
  14. xhr.open('POST',url,true); // 此时还没有发送 当您使用 async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可:
  15. xhr.onreadystatechange = function(){
  16. if(xhr.readyState === 4){
  17. if(xhr.status === 200){
  18. alert(xhr.response)
  19. }
  20. }
  21. }
  22. const postData = {
  23. userName : "zhangsan",
  24. password : "xx"
  25. }
  26. xhr.send(JSON.stringify(postData))

xhr.readyState
  • 0-(未初始化)还没有调用send()方法
  • 1-(载入) 已调用send()方法,正在发送请求
  • 2-(载入完成)send()方法执行完成,已经接收到全部响应
  • 3-(交互)正在解析响应内容
  • 4-(完成)响应内容解析完成,可以在客户端调用

xhr.status
  • 2xx-表示成功处理请求,如200
  • 3xx-需要重定向,浏览器直接跳转,如301(永久重定向) ,302(临时重定向),304(资源未改变)
  • 4xx-客户端请求错误,如404(页面找不到),403(没有权限)
  • 5xx-服务器端错误

什么是跨域
  • 跨域是浏览器为了安全而做出的限制策略
  • 浏览器请求必须遵循同源策略:同域名、同端口、同协议

同源策略
  • ajax请求时,浏览器要求当前网页和server必须同源(安全)
  • 加载图片css js可以无视同源策略
  1. <img src=跨域的图片地址/>
  2. <link href=跨域的css地址/>
  3. <script src=跨域的js地址></script>
  • img可用于统计打点,可以使用三方统计服务
  • link、script可使用CDN,CDN一般都在外域
  • script可以实现JSONP

CORS跨域
  • 服务器端设置,前端直接调用
  • 说明:后台允许前端某个站点进行访问

JSONP跨域
  • 前台适配,后台配合
  • 说明:前后台同时改造

典型题

手写一个简易的ajax
  1. function ajax(url){
  2. const p = new Promise((resolve,reject)=>{
  3. const xhr = new XMLHttpRequest();
  4. xhr.open('GET',url,true)
  5. xhr.onreadystatechange = function(){
  6. if(xhr.readyState === 4){
  7. if(xhr.status === 200){
  8. resolve(
  9. JSON.parse(xhr.responseText)
  10. )
  11. }else if(xhr.status == 404){
  12. reject(new Error('404 not found'))
  13. }
  14. }
  15. }
  16. xhr.send(null)
  17. })
  18. return p;
  19. }
  20. const url = 'xx.json'
  21. ajax(url).then(res=>console.log(res))
  22. .catch(err=>console.log(err))

跨域常用的实现形式
  • CORS跨域
  • JSONP跨域
  • 代理跨域