Ajax集合

本文详细介绍了Ajax的工作原理,包括其与XML的关系、特点和优缺点。同时,通过实例展示了如何使用Express.js搭建服务器并实现Ajax请求。讨论了参数传递、IE缓存问题、超时与网络延迟的处理,以及请求的取消与重复发送问题。最后,对比了JQuery和fetch发送Ajax请求的方式。
摘要由CSDN通过智能技术生成

Ajax

Ajax简介

ajax就是异步的js和xml,通过ajax可以在浏览器中向服务器发送异步请求

优势:无需刷新获取数据

XML简介

XML就是可扩展标记语言

XML被设计用来传输和储存数据

XML和HTML不同:HTML中都是预定义标签,而XML中没有预定义标签,说不来就是HTML就是在浏览器上展示数据的,而XML是传输和储存数据的

现在已经被JSON取代了
附JSON介绍:JSON介绍

Ajax的特点

优点:

  1. 可以无需刷新页面与服务器进行通信
  2. 允许你根据用户事件来更新部分页面内容

缺点:

  1. 没有浏览历史,不能回退
  2. 存在跨域问题
  3. SEO(搜索引擎优化)不友好
准备工作
  1. 打开终端

在这里插入图片描述

然后在终端打入 npm init --yes(做一个初始化)和 npm i express

注意:文件夹名要用英文,不然会报错

  1. 配置express.js文件
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用
const app = express();
//3.创建路由规则
app.get('/',(request,response)=>{
    response.send('hello');
});
//4.监听端口启动服务
app.listen(8080,()=>{
    console.log("已启动");
})
/*
回顾=>
========================
(x)=>x+6相当于:
function(x){
    return x+6;
}
*/
  1. 测试express.js文件

在终端中打入 node 你express.js文件的路径

在这里插入图片描述

在这里插入图片描述

准备HTML/server.js
<!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>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>

<body>
<input type="button" class="btn btn-primary" value="按钮">
<textarea name="" id="result" cols="30" rows="10" class="form-control"></textarea>


    <script>
        const btn = document.getElementsByClassName("btn")[0];
        const result = document.getElementById("result");
        btn.onclick = function () {
            //1.创建对象
            const xhr = new XMLHttpRequest();
            //2.初始化,设置请求方法和URL
            xhr.open("get", "http://127.0.0.1:8080/server");
            //3.发送
            xhr.send();
            //4.事件绑定 处理服务端返回的结果
            //onreadystatechange:每当xhr的readtstate发生改变的
            //xhr有五个值:0,1,2,3,4
            xhr.onreadystatechange = function () {
                //判断服务端是否返回了所有的响应结果
                if (xhr.readyState === 4) {
                    //判断响应状态是否成功,2xx都是成功
                    if (xhr.status >= 200 && xhr.status < 300) {
                        //处理结果
                        console.log(xhr.status); //状态码
                        console.log(xhr.statusText); //状态字符串
                        console.log(xhr.getAllResponseHeaders()); //响应头
                        console.log(xhr.response); //响应体
                        result.innerHTML = xhr.response;
                    } else {
                    }
                }
            };
        };
    </script>
</body>

</html>
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用
const app = express();
//3.创建路由规则
app.get('/server',(request,response)=>{
    response.setHeader('Access-Control-Allow-Origin','*');
    response.send('hello');
});
app.post('/server',(request,response)=>{
    response.setHeader('Access-Control-Allow-Origin','*');
    response.send('hello');
});
//4.监听端口启动服务
app.listen(8080,()=>{
    console.log("已启动8080端口");
})
关于参数

在get方法下传参:

xhr.open("get", "http://127.0.0.1:8080/server?a=100&b=200");

在post方法下传参:

xhr.send('a=100&b=200');
解决IE缓存问题
xhr.open("get", "http://127.0.0.1:8080/server?t="+Date.now());
请求超时以及网络延迟
 //超时设置为2s
            xhr.timeout = 2000;
            //超时回调
            xhr.ontimeout = function(){

            }
            //网络异常回调
            xhr.onerror = function(){

            }
取消请求
<button class="btn btn-primary">发送</button>
<button class="btn btn-primary">取消</button>
    <script>
const btn = document.querySelectorAll('button');
let xhr = null;
btn[0].onclick = function(){
    xhr = new XMLHttpRequest();
    xhr.open("get",'http://127.0.0.1:8080/delete')
    xhr.send();
}
btn[1].onclick = function(){
    xhr.abort(); //取消请求
}
    </script>
请求重复发送问题
 <button class="btn btn-primary">发送</button>
    <button class="btn btn-primary">取消</button>
    <script>
        const btn = document.querySelectorAll('button');
        let xhr = null;
        //识别变量
        let isSending = false; //是否正在发送Ajax请求
        btn[0].onclick = function () {
            // 如果正在发送,则取消该请求,保证只有一次请求
            if(isSending==true){
                xhr.abort(); 
            }
            isSending = true;
            xhr = new XMLHttpRequest();
            xhr.open("get", 'http://127.0.0.1:8080/delete')
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    isSending = false; //保证只有一次请求
                }
            }
        }
        btn[1].onclick = function () {
            xhr.abort();
        }
    </script>

JQuery发送Ajax请求

在:jquery (v3.6.1) - jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器,这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务中复制jQuery的连接

<!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>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
        integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
</head>
<body>
    <button class="btn btn-primary">get</button>
    <button class="btn btn-danger">post</button>
    <button class="btn btn-info">ajax</button>
    <script>
        $('button').eq(0).click(function(){
            $.get('http://127.0.0.1:8080/delete',{a:100,b:200},function(data){
                console.log(data);
            });
        });
        $('button').eq(1).click(function(){
            $.post('http://127.0.0.1:8080/delete',{a:100,b:200},function(data){
                console.log(data);
            });
        });
        $('button').eq(2).click(function(){
            $.ajax({
                //url
                url:'http://127.0.0.1:8080/delete',
                //参数
                data:{a:300,b:99},
                //请求类型
                type:'get',
                //响应体结果
                // dataType:'json',
                //成功回调
                success:function(data){
                    console.log(data);
                }
            });
        });
    </script>
</body>
</html>

fetch发送Ajax请求

 <button class="btn btn-primary">发送</button>
    <script>
        const btn = document.querySelector('button');
        btn.onclick = function(){
            fetch('http://127.0.0.1:8080/delete',{
                //请求方法
                method:'post',
                //请求头
                headers:{
                    name:'hai'
                },
                //请求体
                // body:'user=hai&pwd=123456'
            }).then(response =>{
                return response.text();
            }).then(response =>{
                console.log(response);
            });
        }
    </script>

参考:使用Fetch发送Ajax请求 - Mao - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海量的海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值