title: ajax学习总结
date: 2021-08-18 08:55:59
tags:
  - node.js
  - JS
categories:
  - 学习笔记

1.什么是ajax:

AJAX = (async)异步 JavaScript 和 XML;

AJAX 是一种用于创建快速动态网页的技术;

它是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验;

1.1应用场景:

  1. 页面上拉加载更多数据

  2. 列表数据无刷新分页

  3. 表单项离开焦点数据验证

  4. 搜索框提示文字下拉列表

1.2 ajax的运行环境:

Ajax 技术需要运行在网站环境中才能生效,一般使用Node创建的服务器作为网站服务器;

2.Ajax实现步骤:

  1. 创建Ajax对象:

    let xhr = new XMLHttpRequest();
  2. 告诉Ajax请求地址以及请求方式:

    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/first');
  3. 发送请求:

    // 3.发送请求
    xhr.send();
  4. 获取服务器端响应到客户端的数据

    // 注意:发送请求之后数据不是一下子就能够接收的,
    // 需要时间才能够接收完毕,接收完毕后使用xhr.onload进行响应
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }
  5. 客户端完整(test.html):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <script type="text/javascript">
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/first');
    // 3.发送请求
    xhr.send();
    // 注意:发送请求之后数据不是一下子就能够接收的,
    // 需要时间才能够接收完毕,接收完毕后使用xhr.onload进行响应
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }

    </script>
    </body>
    </html>
  6. 创建服务器(app.js):

    // 引入express框架
    const express = require("express");
    // 路径处理模块
    const path = require("path");
    // 创建web服务器
    const app = express();
    // 静态资源访问服务功能
    app.use(express.static(path.join(__dirname, "public")));

    // 01ajax入门
    app.get("/first", (req, res) => {
     res.send("Hello Ajax!");
    });
    // 监听端口
    app.listen(3000);
    // 控制台提示输出
    console.log("服务器启动成功");
  7. 在浏览器中输入:http://localhost:3000/first 进行ajax请求访问

3.服务器端响应数据的格式

  • 在真实的项目中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中;

  • 在 http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输;

 JSON.parse() // 将 json 字符串转换为json对象
  • 服务器端:

    // 02处理服务器端返回的json数据
    app.get("/responseData", (req, res) => {
     res.send({ name: "张三" });
    });
  • 处理返回的数据:

    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    // 将JSON字符串转换成JSON对象
    let responseText = JSON.parse(xhr.responseText);
    console.log(responseText);
    // 对服务器返回的数据进行使用
    let str = '<h2>'+responseText.name+'</h2>';
    document.body.innerHTML=str;
    }

     

3.1向服务器中传递get请求参数

  • 客户端:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <p>
    <input id="username" name type="text">
    </p>
    <p>
    <input id="age" name type="text">
    </p>
    <p>
    <input id="btn" name type="button" value="提交">
    </p>
    <script>
    // 获取按钮元素
    let btn = document.getElementById('btn');
    let username = document.getElementById('username');
    let age = document.getElementById('age');
    // 为按钮添加点击事件
    btn.onclick=function(){
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    let nameValue = username.value;
    let ageValue = age.value;
    // 拼接请求参数
    let params = 'username='+nameValue+'&age='+ageValue;
    // 配置ajax对象
    xhr.open('get','http://localhost:3000/get?'+params);
    // 发送请求
    xhr.send();
    // 获取服务器端响应的数据
    xhr.onload = function(){
    // console.log(xhr.responseText);
    console.log(JSON.parse(xhr.responseText));
    }
    }
    </script>
    </body>
    </html>
  • 服务器端

    // 对应03
    app.get("/get", (req, res) => {
    res.send(req.query);
    });

     

3.2向服务器传递post请求参数

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <p>
    <input id="username" name type="text">
    </p>
    <p>
    <input id="age" name type="text">
    </p>
    <p>
    <input id="btn" name type="button" value="提交">
    </p>
    <script>
    // 获取按钮元素
    let btn = document.getElementById('btn');
    let username = document.getElementById('username');
    let age = document.getElementById('age');
    // 为按钮添加点击事件
    btn.onclick=function(){
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    let nameValue = username.value;
    let ageValue = age.value;
    // 拼接请求参数
    let params = 'username='+nameValue+'&age='+ageValue;
    // 配置ajax对象
    xhr.open('post','http://localhost:3000/post');
    // 设置请求参数格式的类型(post请求必须要设置)(如是拼接字符串的形式则是下面的类型)
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    // 发送请求
    xhr.send(params);
    // 获取服务器端响应的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // console.log(JSON.parse(xhr.responseText));
    }
    }
    </script>
    </body>
    </html>
  • 服务器端:

    // 对应04
    app.post("/post", (req, res) => {
    // 需要借助第三方模块body-parser才能够成功接受到
    res.send(req.body);
    });

3.4请求报文

在 HTTP 请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式;

3.5请求参数的格式

  1. application/x-www-form-urlencoded

     name=zhangsan&age=20&sex=男
  2. application/json

     {name: 'zhangsan', age: '20', sex: '男'}
  • 在请求头中指定 Content-Type 属性的值是 application/json,告诉服务器端当前请求参数的格式是 json。

  • JSON.stringify() // 将json对象转换为json字符串
  1. 注意:get 请求是不能提交 json 对象数据格式的,传统网站的表单提交也是不支持 json 对象数据格式的。

 

3.6向服务器传递json格式参数

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <script>
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    // 配置ajax对象
    xhr.open('post','http://localhost:3000/json');
    // 设置请求参数格式的类型(post请求必须要设置)(如是拼接字符串的形式则是下面的类型)
    xhr.setRequestHeader('Content-Type','application/json');
    // JSON.stringify()将JSON对象转换成json字符串
    // 发送请求
    xhr.send(JSON.stringify({name:'lisi',age:50}));
    // 获取服务器端响应的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }
    </script>
    </body>
    </html>
  • 服务器端

    // 解析传递过来的请求参数
    app.use(bodyParser.json());
    app.post("/json", (req, res) => {
    // 需要借助第三方模块body-parser才能够成功接受到
    res.send(req.body);
    });

3.7Ajax状态码

在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码;

  • 0:请求未初始化(还没有调用open())1:请求已经建立,但是还没有发送(还没有调用send())2:请求已经发送3:请求正在处理中,通常响应中已经有部分数据可以用了4:响应已经完成,可以获取并使用服务器的响应了

    xhr.readyState // 获取Ajax状态码
  • onreadystatechange 事件,当 Ajax 状态码发生变化时将自动触发该事件

    在事件处理函数中可以获取 Ajax 状态码并对其进行判断,当状态码为 4 时就可以通过 xhr.responseText 获取服务器端的响应数据了;

    <script>
    let xhr = new XMLHttpRequest();
    // 0已经创建ajax对象,但是还没有对ajax对象进行配置
    console.log(xhr.readyState);
    xhr.open('get','http://localhost:3000/readystate')
    // 1已经对ajax对象进行配置,但是还没有发送数据
    console.log(xhr.readyState);
    // 当ajax状态发生改变时触发
    xhr.onreadystatechange = function(){
    // 2请求已经发送了
    // 3已经接收到服务器的部分数据了
    // 4服务器端的响应数据已经接收完成
    console.log(xhr.readyState);
    if(xhr.readyState==4){
    console.log(xhr.responseText);
    }
    }
    xhr.send();
    </script>

     

 

4.Ajax错误处理

  1. 网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。可以判断服务器端返回的状态码,分别进行处理。xhr.status 获取http状态码

  2. 网络畅通,服务器端没有接收到请求,返回404状态码。检查请求地址是否错误。

  3. 网络畅通,服务器端能接收到请求,服务器端返回500状态码。服务器端错误,找后端程序员进行沟通。

  4. 网络中断,请求无法发送到服务器端。会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。

  • 客户端:

    <button id="btn">提交ajax数据</button>
    <script>
    let btn = document.getElementById('btn');
    btn.onclick=function(){
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/error');
    // 3.发送请求
    xhr.send();
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // 获取http状态码 xhr.status
    console.log(xhr.status);
    if(xhr.status==400){
    alert('请求发生错误');
    }
    }
    // 当网络中断时,不会触发onload事件,会触发onerror事件
    xhr.onerror = function(){
    alert('网络中断,无法发送ajax请求!');
    }
    // Ajax状态码:表示Ajax请求的过程状态 ajax对象返回的
    // Http状态码:表示请求的处理结果 是服务器返回
    }
    </script>
  • 服务器端:

    // 对应07
    app.get("/error", (req, res) => {
    // console.log(asdfa);
    res.status(400).send("not ok");
    });

     

5.Ajax函数封装

发送一次请求代码过多,发送多次请求代码冗余且重复时,将请求代码封装到函数中,发请求时调用函数即可;

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <button id="btn">提交ajax数据</button>
    <script>
    let btn = document.getElementById('btn');
    btn.onclick=function(){
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/error');
    // 3.发送请求
    xhr.send();
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // 获取http状态码 xhr.status
    console.log(xhr.status);
    if(xhr.status==400){
    alert('请求发生错误');
    }
    }
    // 当网络中断时,不会触发onload事件,会触发onerror事件
    xhr.onerror = function(){
    alert('网络中断,无法发送ajax请求!');
    }
    // Ajax状态码:表示Ajax请求的过程状态 ajax对象返回的
    // Http状态码:表示请求的处理结果 是服务器返回
    }
    </script>
    </body>
    </html>

 

6.服务器端总代码:

 

// 引入express框架
const express = require("express");
// 路径处理模块
const path = require("path");
const bodyParser = require("body-parser");
const { parse } = require("path");
const { fstat } = require("fs");
// 创建web服务器
const app = express();
// 解析传递过来的请求参数
app.use(bodyParser.json());
// 静态资源访问服务功能
app.use(express.static(path.join(__dirname, "public")));

// 01ajax入门
app.get("/first", (req, res) => {
res.send("Hello Ajax!");
});

// 02处理服务器端返回的json数据
app.get("/responseData", (req, res) => {
// 将JSON字符串转换成JSON对象
res.send({ name: "张三" });
});

// 对应03
app.get("/get", (req, res) => {
res.send(req.query);
});

// 对应04
app.post("/post", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send(req.body);
});

// 对应05
app.post("/json", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send(req.body);
});

// 对应06
app.get("/readystate", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send("hello world");
});

// 对应07
app.get("/error", (req, res) => {
// console.log(asdfa);
res.status(400).send("not ok");
});

//08 当前的路由意思是,当访问的是cache时,要将读取到的内容返回到浏览器中
app.get("/cache", (req, res) => {
fs.readFile("./test.txt", (err, result) => {
res.send(result);
});
});

// 监听端口
app.listen(3000);
// 控制台提示输出
console.log("服务器启动成功");
title: ajax学习总结
date: 2021-08-18 08:55:59
tags:
  - node.js
  - JS
categories:
  - 学习笔记

1.什么是ajax:

AJAX = (async)异步 JavaScript 和 XML;

AJAX 是一种用于创建快速动态网页的技术;

它是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验;

1.1应用场景:

  1. 页面上拉加载更多数据

  2. 列表数据无刷新分页

  3. 表单项离开焦点数据验证

  4. 搜索框提示文字下拉列表

1.2 ajax的运行环境:

Ajax 技术需要运行在网站环境中才能生效,一般使用Node创建的服务器作为网站服务器;

2.Ajax实现步骤:

  1. 创建Ajax对象:

    let xhr = new XMLHttpRequest();
  2. 告诉Ajax请求地址以及请求方式:

    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/first');
  3. 发送请求:

    // 3.发送请求
    xhr.send();
  4. 获取服务器端响应到客户端的数据

    // 注意:发送请求之后数据不是一下子就能够接收的,
    // 需要时间才能够接收完毕,接收完毕后使用xhr.onload进行响应
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }
  5. 客户端完整(test.html):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <script type="text/javascript">
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/first');
    // 3.发送请求
    xhr.send();
    // 注意:发送请求之后数据不是一下子就能够接收的,
    // 需要时间才能够接收完毕,接收完毕后使用xhr.onload进行响应
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }

    </script>
    </body>
    </html>
  6. 创建服务器(app.js):

    // 引入express框架
    const express = require("express");
    // 路径处理模块
    const path = require("path");
    // 创建web服务器
    const app = express();
    // 静态资源访问服务功能
    app.use(express.static(path.join(__dirname, "public")));

    // 01ajax入门
    app.get("/first", (req, res) => {
     res.send("Hello Ajax!");
    });
    // 监听端口
    app.listen(3000);
    // 控制台提示输出
    console.log("服务器启动成功");
  7. 在浏览器中输入:http://localhost:3000/first 进行ajax请求访问

3.服务器端响应数据的格式

  • 在真实的项目中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中;

  • 在 http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输;

 JSON.parse() // 将 json 字符串转换为json对象
  • 服务器端:

    // 02处理服务器端返回的json数据
    app.get("/responseData", (req, res) => {
     res.send({ name: "张三" });
    });
  • 处理返回的数据:

    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    // 将JSON字符串转换成JSON对象
    let responseText = JSON.parse(xhr.responseText);
    console.log(responseText);
    // 对服务器返回的数据进行使用
    let str = '<h2>'+responseText.name+'</h2>';
    document.body.innerHTML=str;
    }

     

3.1向服务器中传递get请求参数

  • 客户端:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <p>
    <input id="username" name type="text">
    </p>
    <p>
    <input id="age" name type="text">
    </p>
    <p>
    <input id="btn" name type="button" value="提交">
    </p>
    <script>
    // 获取按钮元素
    let btn = document.getElementById('btn');
    let username = document.getElementById('username');
    let age = document.getElementById('age');
    // 为按钮添加点击事件
    btn.onclick=function(){
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    let nameValue = username.value;
    let ageValue = age.value;
    // 拼接请求参数
    let params = 'username='+nameValue+'&age='+ageValue;
    // 配置ajax对象
    xhr.open('get','http://localhost:3000/get?'+params);
    // 发送请求
    xhr.send();
    // 获取服务器端响应的数据
    xhr.onload = function(){
    // console.log(xhr.responseText);
    console.log(JSON.parse(xhr.responseText));
    }
    }
    </script>
    </body>
    </html>
  • 服务器端

    // 对应03
    app.get("/get", (req, res) => {
    res.send(req.query);
    });

     

3.2向服务器传递post请求参数

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <p>
    <input id="username" name type="text">
    </p>
    <p>
    <input id="age" name type="text">
    </p>
    <p>
    <input id="btn" name type="button" value="提交">
    </p>
    <script>
    // 获取按钮元素
    let btn = document.getElementById('btn');
    let username = document.getElementById('username');
    let age = document.getElementById('age');
    // 为按钮添加点击事件
    btn.onclick=function(){
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    let nameValue = username.value;
    let ageValue = age.value;
    // 拼接请求参数
    let params = 'username='+nameValue+'&age='+ageValue;
    // 配置ajax对象
    xhr.open('post','http://localhost:3000/post');
    // 设置请求参数格式的类型(post请求必须要设置)(如是拼接字符串的形式则是下面的类型)
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    // 发送请求
    xhr.send(params);
    // 获取服务器端响应的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // console.log(JSON.parse(xhr.responseText));
    }
    }
    </script>
    </body>
    </html>
  • 服务器端:

    // 对应04
    app.post("/post", (req, res) => {
    // 需要借助第三方模块body-parser才能够成功接受到
    res.send(req.body);
    });

3.4请求报文

在 HTTP 请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式;

3.5请求参数的格式

  1. application/x-www-form-urlencoded

     name=zhangsan&age=20&sex=男
  2. application/json

     {name: 'zhangsan', age: '20', sex: '男'}
  • 在请求头中指定 Content-Type 属性的值是 application/json,告诉服务器端当前请求参数的格式是 json。

  • JSON.stringify() // 将json对象转换为json字符串
  1. 注意:get 请求是不能提交 json 对象数据格式的,传统网站的表单提交也是不支持 json 对象数据格式的。

 

3.6向服务器传递json格式参数

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <script>
    // 创建ajax对象
    let xhr = new XMLHttpRequest();
    // 配置ajax对象
    xhr.open('post','http://localhost:3000/json');
    // 设置请求参数格式的类型(post请求必须要设置)(如是拼接字符串的形式则是下面的类型)
    xhr.setRequestHeader('Content-Type','application/json');
    // JSON.stringify()将JSON对象转换成json字符串
    // 发送请求
    xhr.send(JSON.stringify({name:'lisi',age:50}));
    // 获取服务器端响应的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    }
    </script>
    </body>
    </html>
  • 服务器端

    // 解析传递过来的请求参数
    app.use(bodyParser.json());
    app.post("/json", (req, res) => {
    // 需要借助第三方模块body-parser才能够成功接受到
    res.send(req.body);
    });

3.7Ajax状态码

在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码;

  • 0:请求未初始化(还没有调用open())1:请求已经建立,但是还没有发送(还没有调用send())2:请求已经发送3:请求正在处理中,通常响应中已经有部分数据可以用了4:响应已经完成,可以获取并使用服务器的响应了

    xhr.readyState // 获取Ajax状态码
  • onreadystatechange 事件,当 Ajax 状态码发生变化时将自动触发该事件

    在事件处理函数中可以获取 Ajax 状态码并对其进行判断,当状态码为 4 时就可以通过 xhr.responseText 获取服务器端的响应数据了;

    <script>
    let xhr = new XMLHttpRequest();
    // 0已经创建ajax对象,但是还没有对ajax对象进行配置
    console.log(xhr.readyState);
    xhr.open('get','http://localhost:3000/readystate')
    // 1已经对ajax对象进行配置,但是还没有发送数据
    console.log(xhr.readyState);
    // 当ajax状态发生改变时触发
    xhr.onreadystatechange = function(){
    // 2请求已经发送了
    // 3已经接收到服务器的部分数据了
    // 4服务器端的响应数据已经接收完成
    console.log(xhr.readyState);
    if(xhr.readyState==4){
    console.log(xhr.responseText);
    }
    }
    xhr.send();
    </script>

     

 

4.Ajax错误处理

  1. 网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。可以判断服务器端返回的状态码,分别进行处理。xhr.status 获取http状态码

  2. 网络畅通,服务器端没有接收到请求,返回404状态码。检查请求地址是否错误。

  3. 网络畅通,服务器端能接收到请求,服务器端返回500状态码。服务器端错误,找后端程序员进行沟通。

  4. 网络中断,请求无法发送到服务器端。会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。

  • 客户端:

    <button id="btn">提交ajax数据</button>
    <script>
    let btn = document.getElementById('btn');
    btn.onclick=function(){
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/error');
    // 3.发送请求
    xhr.send();
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // 获取http状态码 xhr.status
    console.log(xhr.status);
    if(xhr.status==400){
    alert('请求发生错误');
    }
    }
    // 当网络中断时,不会触发onload事件,会触发onerror事件
    xhr.onerror = function(){
    alert('网络中断,无法发送ajax请求!');
    }
    // Ajax状态码:表示Ajax请求的过程状态 ajax对象返回的
    // Http状态码:表示请求的处理结果 是服务器返回
    }
    </script>
  • 服务器端:

    // 对应07
    app.get("/error", (req, res) => {
    // console.log(asdfa);
    res.status(400).send("not ok");
    });

     

5.Ajax函数封装

发送一次请求代码过多,发送多次请求代码冗余且重复时,将请求代码封装到函数中,发请求时调用函数即可;

  • 客户端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <button id="btn">提交ajax数据</button>
    <script>
    let btn = document.getElementById('btn');
    btn.onclick=function(){
    // 1.创建ajax对象
    let xhr = new XMLHttpRequest();
    // 2.告诉Ajax对象要向哪里发送请求,以什么方式发送请求
    // 1)请求方式 2)请求地址
    xhr.open('get','http://localhost:3000/error');
    // 3.发送请求
    xhr.send();
    // 4.获取服务器端响应到客户端的数据
    xhr.onload = function(){
    console.log(xhr.responseText);
    // 获取http状态码 xhr.status
    console.log(xhr.status);
    if(xhr.status==400){
    alert('请求发生错误');
    }
    }
    // 当网络中断时,不会触发onload事件,会触发onerror事件
    xhr.onerror = function(){
    alert('网络中断,无法发送ajax请求!');
    }
    // Ajax状态码:表示Ajax请求的过程状态 ajax对象返回的
    // Http状态码:表示请求的处理结果 是服务器返回
    }
    </script>
    </body>
    </html>

 

6.服务器端总代码:

// 引入express框架
const express = require("express");
// 路径处理模块
const path = require("path");
const bodyParser = require("body-parser");
const { parse } = require("path");
const { fstat } = require("fs");
// 创建web服务器
const app = express();
// 解析传递过来的请求参数
app.use(bodyParser.json());
// 静态资源访问服务功能
app.use(express.static(path.join(__dirname, "public")));

// 01ajax入门
app.get("/first", (req, res) => {
res.send("Hello Ajax!");
});

// 02处理服务器端返回的json数据
app.get("/responseData", (req, res) => {
// 将JSON字符串转换成JSON对象
res.send({ name: "张三" });
});

// 对应03
app.get("/get", (req, res) => {
res.send(req.query);
});

// 对应04
app.post("/post", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send(req.body);
});

// 对应05
app.post("/json", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send(req.body);
});

// 对应06
app.get("/readystate", (req, res) => {
// 需要借助第三方模块body-parser才能够成功接受到
res.send("hello world");
});

// 对应07
app.get("/error", (req, res) => {
// console.log(asdfa);
res.status(400).send("not ok");
});

//08 当前的路由意思是,当访问的是cache时,要将读取到的内容返回到浏览器中
app.get("/cache", (req, res) => {
fs.readFile("./test.txt", (err, result) => {
res.send(result);
});
});

// 监听端口
app.listen(3000);
// 控制台提示输出
console.log("服务器启动成功");