Ajax原理

149 阅读3分钟

Ajax是用来前后端分离的一种,它的全称是Asynchronous Javascript And XML,其作用是用JS发请求和收响应

背景

  • Ajax是浏览上的一种功能
  • 浏览器可以发请求收响应,浏览器在window上加了一个XMLHttpRequest函数
  • 用这个构造函数(类)可以构造出一个对象
  • JS通过它实现发请求,收响应

实例

server.js

首先准备一个server.js作为服务器

var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if(!port){
  console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
  process.exit(1)
}

var server = http.createServer(function(request, response){
  var parsedUrl = url.parse(request.url, true)
  var pathWithQuery = request.url 
  var queryString = ''
  if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  var path = parsedUrl.pathname
  var query = parsedUrl.query
  var method = request.method

  /******** 从这里开始看,上面不要看 ************/

  console.log('有个傻子发请求过来啦!路径(带查询参数)为:' + pathWithQuery)

  if(path === '/'){
    response.statusCode = 200
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write(`二哈`)
    response.end()
  } else if(path === '/x'){
    response.statusCode = 200
    response.setHeader('Content-Type', 'text/css;charset=utf-8')
    response.write(`body{color: red;}`)
    response.end()
  } else {
    response.statusCode = 404
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write(`你输入的路径不存在对应的内容`)
    response.end()
  }

  /******** 代码结束,下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)

index.html路由

写index.html路由 ,路由就是if else

index.html

response.write(`
<!DOCTYPE>
<html>
<head><title>AJAX</title></head>
<body>
    <h1>AJAX demo1</h1>
</body>
</html>
`)

main.js路由

else if (path === '/main.js') {
        response.statusCode = 200
        response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
        response.write(`console.log('主要js')`)
        response.end()
    }

合并路由

<!DOCTYPE>
<html>
<head><title>AJAX</title></head>
<body>
    <h1>AJAX demo1</h1>
<script src='main.js'></script>
</body>
</html>

简化response.write(‘字符串’)

文件转字符串fs.readFileSync(‘public/index.html’)

const string = fs.readFileSync('public/index.html')
response.write(string)

Ajax 加载 CSS/HTML/JS

四个步骤

  1. 创建HttpRequest对象(全称是XMLHTttpRequest)
  2. 调用对象的open方法
  3. 监听对象的onload和onerror事件
    • 专业前端会改用onreadystatechange事件
  4. 调用对象的send方法
getCSS.onclick = () => {
    const request = new XMLHttpRequest();//第一步:创造新的对象
    request.open('GET', '/style.css')//第二步:实现对象open()方法,初始化请求
    request.onload = () => {//第三步,对象监听事件
        console.log('成功')
        console.log(request.response)
        //创建style标签
        const style = document.createElement('style')
        //style插入内容
        style.innerHTML = request.response
        //把style插入头部
        document.head.appendChild(style)
    }
    request.onerror = () => {
        console.log('失败')
    }
    request.send() //第四步:调用对象send方法,发送 HTTP 请求
}

onreadystatechange事件

由于onload和onerror功能不够,发生错误时会把404页面渲染出来

.readyState属性代表的是请求的状态

0 代表被创建(const request = new XMLHttpRequest())

1代表已打开open(.open)

2代表响应头已接收send(.send)

3 代表浏览器开始下载(第一个信息出现在浏览器(开始下载))

4 浏览器下载完毕(下载完)

getCSS.onclick = () => {
    const request = new XMLHttpRequest();
    request.open("GET","/style.css");
    request.onreadystatechange = () =>{
        //下载完成,但不知道是成功 2xx 还是失败 4xx 5xx
        if(request.readyState === 4){
            if(request.status >= 200 && request.status < 300){
                //创建 style 标签
                const style = document.createElement('style')
                //填写 style 内容
                style.innerHTML = request.response;
                //插到头里面
                document.head.appendChild(style)
            }else{
                alert('加载 css 失败')
            }
        } 
    };
    request.send();
}

小结

HTTP是个框,什么都能往里装

  • 可以装HTML,CSS,JS,XML...
  • 记得使用正确的Content-Type

解析方法

  • 得到CSS之后生产style标签
  • 得到JS之后生产script标签
  • 得到HTML之后使用 innerHtml 和 DOM API
  • 得到XML之后使用 responseXML 和 DOM API
  • 不同类型的数据有不同类型的解析决方法

JSON

中文官网

JSON全称JavaScript Object Notation(JS对象标记语言),JSON是一门标记语言,不是一个对象,跟Makedown,Xml,Html一样,用来展示数据

JSON支持的数据类型

  • string(只支持双引号)
  • number
  • bool
  • null
  • objec
  • array
  • 不支持函数,不支持变量