Ajax基本使用


一. 初步使用

  • 服务器端操作
  1. 在服务器端初始化依赖
mkdir ajax-server
cd ajax-server
npm init
npm install express
  1. 在 ajax-server 目录下,新建名为 app.js 的文件,并写入如下内容
//引入模块
const express = require("express");
const path = require("path");
//创建web服务器
const app = express();
//静态资源访问服务功能
app.use(express.static(path.join(__dirname,"public")));
//处理 /first 的get请求
app.get('/first',(req,res)=>{
    res.send("Hello World");
});
//监听端口
app.listen(3000);
//控制台输出
console.log("服务器启动成功");
  1. 启动服务器
node app.js
  1. 测试 /first 路径是否可以成功访问
# 在浏览器地址栏中输入以下内容,测试是否可以正常输出 Hello World
http://62.234.149.220:3000/first
  • 客户端操作
  1. 编写客户端的Ajax程序
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script type="text/javascript">
        //1.创建ajax对象
        var xhr = new XMLHttpRequest();
        //2.初始化ajax对象
        xhr.open("get","http://62.234.149.220:3000/first");
        //3.发送请求
        xhr.send();
        //4.获取响应数据
        xhr.onload =function(){
            console.log(xhr.responseText);
        }     
    </script>
</head>
<body>
</body>
</html>
  1. 测试

运行该页面即可在控制台获取到ajax请求得到的数据 Hello World

二. ajax基本使用

  1. 处理服务器返回的JSON数据

实例:由于传输过程中均使用的为string字符串类型,而该类型不方便操作,故需要我们在客户端接收到string类型的数据后使用window对象内置的方法将string类型的数据转换为JSON类型的数据,方便处理。

  • 服务端程序

在之前程序的基础上,添加额外的get请求,返回json格式的字符串

const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
//发送json格式的字符串方法
app.get("/responseData",(req,res)=>{
    res.send({"name":"yorick","age":18});
});
app.listen(3000);
console.log("服务器启动成功");

  • 客户端程序
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
         var xhr = new XMLHttpRequest();
        xhr.open("get","http://62.234.149.220:3000/responseData");
        xhr.send();
        xhr.onload =function(){
            var jsonData = JSON.parse(this.responseText);
            console.log(jsonData);
        };
    </script>
</head>
<body>
</body>
</html>

测试发现控制台输出的为Json类型的对象

  1. 请求参数传递

GET请求类型

实例:客户端当点击提交按钮后,触发AJAX的请求,将input标签中的参数拼接到url路径中,提交给服务打的处理程序。服务器端程序将请求参数原样返回给客户端。

服务器端程序

const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
//接收来自 /get的GET类型请求,并将请求参数原样返回
app.get("/get",(req,res)=>{
    res.send(req.query);
});
app.listen(3000);
console.log("服务器启动成功");

客户端程序

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                var xhr = new XMLHttpRequest();
                //获取input输入框的数据
                var username = $("#username").val();
                var age = $("#age").val();
                //拼接请求参数
                var params = "username="+username+"&age="+age;
                //将请求参数加入访问路径中
                xhr.open("get","http://62.234.149.220:3000/get?"+params);
                xhr.send();
                xhr.onload = function(){
                    console.log(this.responseText);
                };
            }); 
        });
    </script>
</head>

<body>
    用户名:<input type="text" id="username"/>
    年龄:<input type="text" id="age" />
    <input type="button" id="btn" value="提交" />
</body>
</html>

POST请求类型

  • 类型为 application/x-www-form-urlencoded 的post请求

实例:向服务端发送POST请求,并携带参数

服务端程序

const express = require("express");
const path = require("path");
//引入body-parser
const bodyParser = require("body-parser");
const app = express();
//设置bodyParser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname,"public")));
//接收post请求
app.post("/post",(req,res)=>{
    res.send(req.body);
});
app.listen(3000);
console.log("服务器启动成功");

客户端程序

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                var xhr = new XMLHttpRequest();
                var username = $("#username").val();
                var age = $("#age").val();
                var params = "username="+username+"&age="+age;
                xhr.open("post","http://62.234.149.220:3000/post");
                //上述params格式的数据传输,需要设置如下的内容类型
                xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                //通过send发送数据
                xhr.send(params);
                xhr.onload = function(){
                    console.log(this.responseText);
                };
            }); 
        });
    </script>
</head>

<body>
    用户名:<input type="text" id="username"/>
    年龄:<input type="text" id="age" />
    <input type="button" id="btn" value="提交" />
</body>
</html>
  • 类型为 application/json 的post请求

服务端代码

const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const app = express();
//改为解析json类型
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname,"public")));
app.post("/json",(req,res)=>{
    res.send(req.body);
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            var xhr = new XMLHttpRequest();
            xhr.open("post","http://62.234.149.220:3000/json");
            //设置json类型
            xhr.setRequestHeader("Content-Type","application/json");
            //发送json前需要先转换为字符串类型
            xhr.send(JSON.stringify({name:"yorick",age:23}));
            xhr.onload = function(){
                console.log(this.responseText);
            };
        });
    </script>
</head>
<body>
</body>
</html>
  1. ajax状态码
# ajax状态码表示的是ajax请求的过程状态,与http状态码有所区别,后者为服务器发送的请求结果状态码
0 已经创建ajax对象,但没有对其进行配置
1 已经对ajax进行配置,但是没有发送请求
2 请求已经发送
3 已经接收到来自服务器端的部分数据
4 服务器端的响应数据已经接收完成

服务端代码

const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
app.get("/readyState",(req,res)=>{
    res.send("Finish");
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            var xhr = new XMLHttpRequest();
            //0 已经创建ajax对象,但没有对其进行配置
            console.log(xhr.readyState);
            xhr.open("get","http://62.234.149.220:3000/readyState");
            //1 已经对ajax进行配置,但是没有发送请求
            console.log(xhr.readyState);
            xhr.onreadystatechange = function(){
                //2 请求已经发送
                //3 已经接收到来自服务器端的部分数据
                //4 服务器端的响应数据已经接收完成
                console.log(xhr.readyState);
                //当状态码为4,代表数据已经接收完成,可以输出
                if(xhr.readyState == 4){
                    console.log(xhr.responseText);
                }
            };
            xhr.send();
        });
    </script>
</head>
<body>
</body>
</html>
  1. ajax的错误处理
# 1.服务器端可接收到请求,但不是预期结果。可以在客户端判断返回的状态码进行处理
# 2.服务器没有接收到请求 404
# 3.服务器后端程序问题 500
# 4.网络中断,会触发xhr对象的onerror事件,在其中可对错误进行处理

实例:服务器返回400状态码,客户端通过判别,执行400状态码的处理语句。网络中断调用onerror事件

服务器端代码

const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
app.get("/error",(req,res)=>{
    res.status(400).send("400错误");
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                var xhr = new XMLHttpRequest();
                xhr.open("get","http://62.234.149.220:3000/error");
                xhr.send();
                xhr.onload = function(){
                    //获取返回的服务端报错信息
                    console.log(this.responseText);
                    //获取状态码
                    console.log(this.status);
                };
                //网络中断,触发onerror事件
                xhr.onerror = function(){
                    console.log("服务器中断");
                }
            });
        });
    </script>
</head>
<body>
    <button id="btn">发送请求</button>
</body>
</html>
  1. ajax的函数封装

实例:将ajax请求进行函数封装,以对象的形式指定请求方式,地址以及结果的回调函数

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        function ajax(options) {
            var defaults = {
                type: "get",
                url: "",
                data: {},
                header: {
                    "Content-Type": "application/x-www-form-urlencoded"
                },
                success: function () { },
                error: function () { }
            }
            Object.assign(defaults,options);
            var xhr = new XMLHttpRequest();
            var params = "";
            $.each(defaults.data, function (key, value) {
                params += key + "=" + value + "&";
            });
            params = params.substr(0, params.length - 1);
            if (defaults.type == "get") {
                defaults.url = defaults.url + "?" + params;
            }
            xhr.open(defaults.type, defaults.url);
            if (defaults.type == "post") {
                var contentType = defaults.header["Content-Type"];
                xhr.setRequestHeader("Content-Type", contentType);
                if (contentType == "application/json") {
                    xhr.send(JSON.stringify(defaults.data));
                } else {
                    xhr.send(params);
                }
            } else {
                xhr.send();
            }
            xhr.onload = function () {
                var contentType = xhr.getResponseHeader("Content-Type");
                var responseText = xhr.responseText;
                if (contentType.includes("application/json")) {
                    responseText = JSON.parse(xhr.responseText);
                }
                if (this.status == 200) {
                    defaults.success(responseText, this);
                } else {
                    defaults.error(responseText, this);
                }

            };
        }

        ajax({
            type: "get",
            url: "http://62.234.149.220:3000/responseData",
            data: {
                name: "yorick",
                age: 23
            },
            header: {
                "Content-Type": "application/json"
            },
            success: function (data, xhr) {
                console.log(data);
                console.log(xhr);
            },
            error: function (data, xhr) {
                console.log(data);
                console.log(xhr);
            }
        });
        // ajax({
        //     url: "http://62.234.149.220:3000/responseData",
        //     success: function (data, xhr) {
        //         console.log(data);
        //         console.log(xhr);
        //     }
        // });
    </script>
</head>

<body>
</body>
</html>

三. FormData对象

  1. 使用FormData传递表单参数

服务端代码

const express = require("express");
const path = require("path");
const formidable = require("formidable");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
app.post("/formData",(req,res)=>{
    //创建formidable表单解析对象
    const form = new formidable.IncomingForm();
    //解析传递过来的FormData对象
    form.parse(req,(err,fields,files)=>{
        res.send(fields);
    });
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                //将普通html表单转换为表单对象
                var formData = new FormData($("#form")[0]);
                var xhr = new XMLHttpRequest();
                //由于需将formData放入send方法中,故必须使用post提交方式
                xhr.open("post","http://62.234.149.220:3000/formData");
                xhr.send(formData);
                xhr.onload = function(){
                    if(this.status == 200){
                        console.log(this.responseText);
                    }
                };
            });
        });
    </script>
</head>

<body>
    <form id="form">
        <input type="text" name="username"/>
        <input type="password" name="password"/>
        <input type="button" id="btn" value="提交"/>
    </form>
</body>
</html>
  1. FormData对象中的实例方法
# 获取值
formData.get("key");
# 设置值,有该属性则替换值,没有则新添加值
formData.set("key","value");
# 删除值,服务器不会接收到passowrd属性
formData.delete("password");
# 追加值,与set的区别在于,当属性名存在时,set会覆盖属性值,append会保留两个值
formData.append("username","bob");

实例:在上述代码的基础上,获取username的属性值并且重新设置该值,添加新的age属性,删除password属性,追加已经存在的username属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                var formData = new FormData($("#form")[0]);

                //获取username属性值
                console.log(formData.get("username"));
                //设置值
                formData.set("username","alice");
                formData.set("age",23);
                //删除值
                formData.delete("password");
                //追加值
                formData.append("username","bob");

                var xhr = new XMLHttpRequest();
                xhr.open("post","http://62.234.149.220:3000/formData");
                xhr.send(formData);
                xhr.onload = function(){
                    if(this.status == 200){
                        console.log(this.responseText);
                    }
                };
            });
        });
    </script>
</head>

<body>
    <form id="form">
        <input type="text" name="username"/>
        <input type="password" name="password"/>
        <input type="button" id="btn" value="提交"/>
    </form>
</body>
</html>
  1. FormData文件上传

服务端代码

const express = require("express");
const path = require("path");
const formidable = require("formidable");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
app.post("/upload",(req,res)=>{
    const form = new formidable.IncomingForm();
    //添加文件上传的存储路径
    form.uploadDir = path.join(__dirname,"public","uploads");
    //保留后缀
    form.keepExtensions = true;
    form.parse(req,(err,fields,files)=>{
        res.send("ok");
    });
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#file").change(function(){
                var formData = new FormData();
                //追加文件
                formData.append("attrName",this.files[0]);
                var xhr = new XMLHttpRequest();
                xhr.open("post","http://62.234.149.220:3000/upload");
                xhr.send(formData);
                xhr.onload = function(){
                    if(this.status == 200){
                        console.log(this.responseText);
                    } 
                };
            });
        });
    </script>
</head>

<body>
    <input type="file" id="file"/>
</body>
</html>

四. 同源问题

  1. 同源

若两个页面拥有相同的协议,域名和端口。那么这两个网页就属于同源。有一个不相同则不属于同源。

  1. JSONP解决同源问题
1.将不同源的服务器请求地址写在script标签的src属性上
2.服务器响应的数据必须是函数的调用,发送给客户端的数据需要作为函数调用的参数
3.在客户端全局作用域下定义函数
4.在该函数内部对服务器端返回的数据进行处理

实例:通过JSONP的方式请求不同源的服务器数据

服务端代码

//引入express框架
const express = require("express");
//路径处理模块
const path = require("path");
//创建web服务
const app = express();
//静态资源访问服务功能
app.use(express.static(path.join(__dirname,"public")));
//JSONP请求测试
app.get("/test",(req,res)=>{
    const result = "fun({name:'yorick'})";
    res.send(result);
});
//监听端口
app.listen(3000);
//控制台提示输出
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
</head>
<body>
    <script>
        function fun(data){
            console.log("客户端的fun函数被调用");
            console.log(data);
        }
    </script>
    <script src="http://62.234.149.220:3000/test"></script>
</body>
</html>
  1. JSONP优化

服务端代码

  • 服务器端可以直接调用jsonp方法,返回数据
const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
//JSONP优化,根据客户端的要求动态改变调用的函数名
app.get("/better",(req,res)=>{
    // const funName = req.query.callback;
    // const params = JSON.stringify({name: 'alice',age: 22});
    // const result = funName + "("+ params +")";
    // res.send(result);
    res.jsonp({name:"bob",age: 18});
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

  • 客户端通过传递callback参数,使得可以根据客户端的要求动态改变调用的函数名
  • 点击按钮动态发送请求,点击按钮动态创建script标签发送JSONP请求
  • 将JSONP封装为函数
  • 将回调函数写在success中
  • 回调函数的函数名可以随机生成
  • 可以动态添加请求参数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
</head>
<body>
    <button id="btn">发送请求</button>
    <script>
        $(function(){
            function jsonp(options){
                //动态创建script标签
                var script = document.createElement("script");
                //随机生成回调函数名
                var fnName = "myJsonp" + Math.random().toString().replace(".","");
                //拼接请求参数
                var params = "";
                for(var param in options.data){
                    params += "&" + param + "=" + options.data[param];
                }
                //将success的函数挂载到window对象中,变为全局函数
                window[fnName] = options.success;
                //由于script的src是get请求,故将回调函数和参数拼接到访问路径中
                script.src = options.url + "?callback=" + fnName + params;
                //将内存中的变量追加到body标签中,实现JSONP请求
                document.body.appendChild(script);
                //当加载完成删除该标签,防止重复添加
                script.onload = function(){
                    document.body.removeChild(script);
                };
            }
            
            $("#btn").click(function(){
               jsonp({
                   url: "http://62.234.149.220:3000/better",
                   data: {
                       name: "yorick",
                       age: 23
                   },
                   success: function(data){
                        console.log("客户端的fun函数被调用");
                        console.log(data);
                   }
               });
            });   
        });
    </script>
</body>
</html>
  1. CORS跨域资源共享解决同源问题,需要在服务器端设置两个响应头信息

服务端代码

const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname,"public")));
//解决非同源请求问题
app.use((req,res,next)=>{
    res.header("Access-Control-Allow-Origin","*");
    res.header("Access-Control-Allow-Methods","get,post");
    next();
});
//get请求
app.get("/cross",(req,res)=>{
    res.send("ok");
});
app.listen(3000);
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script src="./ajax.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                ajax({
                    type: "get",
                    url: "http://62.234.149.220:3000/cross",
                    success: function(result){
                        console.log(result);
                    }
                });
            });
        });
    </script>
</head>
<body>
    <button id="btn">提交请求</button>
</body>
</html>
  1. 跨域传递Cookie
# 1. 需要在客户端的ajax请求中添加
xhr.withCredentials = true;
# 2. 需要在服务器端添加响应头信息
res.header("Access-Control-Allow-Credentials",true);

五. JQuery对ajax的封装

  1. $.ajax()方法的使用

服务端代码

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

app.get("/first",(req,res)=>{
    res.send("Hello World");
});
//监听端口
app.listen(3000);
//控制台提示输出
console.log("服务器启动成功");

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    type: "get",
                    url: "/first",
                    success: function(response){
                        console.log(response);
                    },
                    error: function(xhr){
                        console.log(xhr);
                    }
                });
            });
        });
    </script>
</head>
<body>
    <button id="btn">发送请求</button>
</body>
</html>
  1. $.ajax()方法的参数传递
  • application/x-www-form-urlencoded 类型的 get和post请求,contentType属性的默认值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    //get 或者 post
                    type: "post",
                    url: "/post",
                    data: {
                        name: "yorick",
                        age: 22
                    },
                    //或者
                    //data: "name=yorick&age=22",
                    success: function(response){
                        console.log(response);
                    },
                    error: function(xhr){
                        console.log(xhr);
                    }
                });
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>
</html>
  • application/json 类型的post请求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    type: "post",
                    url: "/json",
                    //指定类型
                    contentType: "application/json",
                    //转换json格式为字符串的形式
                    data: JSON.stringify({
                        name: "yorick",
                        age: 12
                    }),
                    success: function(response){
                        console.log(response);
                    },
                    error: function(xhr){
                        console.log(xhr);
                    }
                });
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>
</html>
  1. $.ajax()方法中beforeSend的使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    type: "post",
                    url: "/json",
                    contentType: "application/json",
                    data: JSON.stringify({
                        name: "yorick",
                        age: 12
                    }),
                    //请求发送前调用
                    beforeSend: function(){
                        alert("发送前对数据进行处理");  
                        //若return false 则不会发送数据  
                        return false;
                    },
                    success: function(response){
                        console.log(response);
                    },
                    error: function(xhr){
                        console.log(xhr);
                    }
                });
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>
</html>
  1. serialize()和serializeArray()方法

实例:通过serialize()方法将表单内容拼接为字符串类型的参数,通过自定义的serializeObject()方法将表单用户输入的内容转换为对象类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#form").on("submit",function(){
                //将表单内容拼接为字符串类型的参数
                var params = $(this).serialize();
                //username=yorick&password=123
                console.log(params);
                //将表单用户输入的内容转换为对象类型
                var paramsObj = serializeObject($(this));
                //{username: "yorick", password: "123"}
                console.log(paramsObj);
                //禁用默认行为
                return false;
            });

            //将表单用户输入的内容转换为对象类型
            function serializeObject(obj){
                var result = {};
                // [{name:"username",value:"yorick"},{name:"password",value:"123456"}]
                var params = obj.serializeArray();
                //遍历数组,变为 {username:"yorick",password:"123456"}
                $.each(params,function(index,value){
                    result[value.name] = value.value;
                });
                return result;
            }
        });
    </script>
</head>

<body>
    <form id="form">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>
</body>
</html>
  1. 发送jsonp请求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                   url: "http://62.234.149.220:3000/jsonp",
                   //向服务端传递函数名字,将原先的callback换为自定义的cb
                   //jsonp: "cb",
                   //定义回调函数,此时需要在客户端自行定义fn函数,删除success回调函数
                   //jsonpCallback: "fn",
                   //代表发送jsonp请求
                   dataType: "jsonp",
                   success: function(response){
                       console.log(response);
                   } 
                });
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>
</html>
  1. .get()和.post()方法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.get("http://62.234.149.220:3000/get",{name:"alice",age:20},function(response){
                    console.log(response);
                });
                $.post("http://62.234.149.220:3000/post",{name:"bob",age:21},function(response){
                    console.log(response);
                })
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>

</html>
  1. ajax的全局事件
.ajaxStart()
.ajaxComplete()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    type: "get",
                    url: "http://62.234.149.220:3000/get",
                    data: {
                        name: "Tom",
                        age: 21
                    },
                    success: function (response) {
                        console.log(response);
                    }
                });
            });
            //在document对象上绑定ajaxStart事件,在发送ajax请求前被调用
            $(document).on("ajaxStart",function(){
                console.log("start ajax...");
            });
            //在document对象上绑定ajaxComplete事件,在发送ajax请求后被调用
            $(document).on("ajaxComplete",function() {
                console.log("end ajax...");
            });
        });
    </script>
</head>

<body>
    <button id="btn">发送请求</button>
</body>

</html>
  1. restful风格的请求格式

服务器端代码

//引入express框架
const express = require("express");
//路径处理模块
const path = require("path");
//创建web服务
const app = express();
const bodyParser = require("body-parser");
const formidable = require("formidable");
//静态资源访问服务功能
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname,"public")));

app.get("/users",(req,res)=>{
    res.send("获取用户列表数据");
});
app.get("/users/:id",(req,res)=>{
    var id = req.params.id;
    res.send(`获取id为${id}的用户信息`);
});
app.delete("/users/:id",(req,res)=>{
    var id = req.params.id;
    res.send(`删除id为${id}的用户信息`);
});
app.put("/users/:id",(req,res)=>{
    var id = req.params.id;
    res.send(`修改id为${id}的用户信息`);
});

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

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.4.1 copy.js"></script>
    <script>
        $(function() {
            // get请求获取用户列表信息
            $.ajax({
                type: "get",
                url: "http://62.234.149.220:3000/users",
                success: function(response){
                    console.log(response);
                }
            });

            //get请求获取某个id用户的信息
            $.ajax({
                type: "get",
                url: "http://62.234.149.220:3000/users/10",
                success: function(response){
                    console.log(response);
                }
            });

            //deltet请求删除某个id用户的信息
            $.ajax({
                type: "delete",
                url: "http://62.234.149.220:3000/users/9",
                success: function(response){
                    console.log(response);
                }
            });

            //put请求修改某个id用户的信息
            $.ajax({
                type: "put",
                url: "http://62.234.149.220:3000/users/8",
                success: function(response){
                    console.log(response);
                }
            });

        });
    </script>
</head>
<body>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343