AJAX基础知识

384 阅读2分钟

AJAX出现前,网页发送请求的有哪些呢?

  • 用 form 可以发请求,但是会刷新页面或新开页面
  • 用 a 可以发 get 请求,但是也会刷新页面或新开页面
  • 用 img 可以发 get 请求,但是只能以图片的形式展示
  • 用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
  • 用 script 可以发 get 请求,但是只能以脚本的形式运行

有没有什么其它的方法?

  • get、post、put、delete 请求都行
  • 想以什么形式展示就以什么形式展示

IE5率先在JavaScript中引入ActiveX对象(API),使得JavaScript可以直接发起HTTP请求。随后MozillaSafariOpera也跟进了,取名XMLHttpRequest,并被纳入W3C规范当中。

AJAX:异步的JavaScriptXML

  • 使用XMLHttpRequest发请求
  • 服务器返回XML格式的字符串
  • JS 解析XML,并更新局部页面

如何使用XMLHttpRequest

myButton.addEventListener('click', (e)=>{
  let request = new XMLHttpRequest()
  request.open('get', '/xxx') // 配置request
  request.send()
  request.onreadystatechange = ()=>{
    if(request.readyState === 4){
      console.log('请求响应都完毕了')
      console.log(request.status)
      if(request.status >= 200 && request.status < 300){
        console.log('说明请求成功')
        console.log(typeof request.responseText)
        console.log(request.responseText)
        let string = request.responseText
        // 把符合 JSON 语法的字符串转换成 JS 对应的值
        let object = window.JSON.parse(string) 
        // JSON.parse 是浏览器提供的
        console.log(typeof object)
        console.log(object)
      } else if(request.status >= 400){
        console.log('说明请求失败') 
      }
    }
  }
})

后端代码:

if(path==='/xxx'){
  response.statusCode = 200
  response.setHeader('Content-Type', 'text/json;charset=utf-8')
  response.setHeader('Access-Control-Allow-Origin', 'http://lvbin.com:8001')
  response.write(`
    {
      "note":{
        "to": "future",
        "from": "now",
        "heading": "greet",
        "content": "Hello World"
      }
    }
 `)
  response.end()

同源策略(Cross-Origin Resource Sharing

  • 只有 协议+端口+域名 一模一样才允许发 AJAX 请求

例如以下的都是不可以的

那为什么form可以跨域请求呢?因为提交到另一个域名之后,原页面的脚步无法获取新页面中的内容,浏览器认为这是安全的。

AJAX是可以读取响应的内容,因此浏览器不能允许你这么做。其实请求已经发送出去了,只是拿不到响应的内容。总结来说就是这个策略的本质是,一个域名的JS,在未经允许的情况下,不得读取另一个域名的内容,但浏览器不会阻止向另一个域名发送请求。

CORS跨域 假设http://lvbin.com:8001需要访问http://lvbin.com:8002,并且获取内容。那么只需要在http://lvbin.com:8002后端添加下面一行代码:

response.setHeader('Access-Control-Allow-Origin', 'http://lvbin.com:8001')