Ajax的学习笔记(包括原生的ajax,jquery,axios,fetch)

news2024/12/25 12:41:39

一、什么是ajax

AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

二、ajxa的创建使用

 const xhr=new XMLHttpRequest()//实例化
           xhr.open("POST","http://127.0.0.1:3101/server")//确定发请求的类型和url
           xhr.send("123")//响应体的内容
           xhr.onreadystatechange=function(){//响应之后的渲染
            if(xhr.readyState===4){
                if(xhr.status>=200&&xhr.status<300){
                    result.innerText=xhr.response
                }
            }
           }

事件绑定 处理服务器返回的结果
on 当…的时候
readystate是xhr的属性,表示状态,0初始化,1open,2send,3服务端返回部分结果,4服务端返回全部结果
change 改变

三、原生的ajax的实例

1、http报文的格式

//事件绑定 处理服务器返回的结果
            //on 当...的时候
            //readystate是xhr的属性,表示状态,0初始化,1open,2send,3服务端返回部分结果,4服务端返回全部结果
            //change 改变
            /*
             请求报文
             行 post url http/1.1
             头 host :baidu.com
             cookie :name=...
             user-agent :chrome 83

             空行

             体 username=admin&password=123
            */
            //响应报文
            /*
                行 http/1.1 200 ok

                头 Content-Type: text/html;charset=utf-8
                   Content-length:1024
                   Content-encoding:gzip

                空行

                体 <html>
                        <head>
                        </head>
                        <body>
                        </body>
                    </html>

            */

2、客户端的html

<!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>ajax</title>
    <style>
        #result{
            width: 150px;
            height: 110px;
            border: 1px yellow solid;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const Btn=document.getElementsByTagName("button")[0]
        const result=document.getElementById("result")
        Btn.onclick=function(){
            //创建对象
            const xhr=new XMLHttpRequest()
            //初始化
            xhr.open('GET',"http://127.0.0.1:3101/server")
            //发送
            xhr.send('123');                   
            xhr.onreadystatechange=function(){
            if( xhr.readyState==4){
                if(xhr.status>=200&&xhr.status<300){
                    // console.log(xhr.status)//相应的状态码
                    // console.log(xhr.statusText)//响应的状态字符串
                    // console.log(xhr.getAllResponseHeaders())//响应头
                    // console.log(xhr.response)//响应体
                    result.innerText=xhr.response;
                }
               
            }
            }

        }
    </script>
</body>
</html>

服务器端js

引入express
const express=require("express")
const app=express()//实例化app
app.get("/server",(require,response)=>{//设置get响应的方法
    //允许跨域的
    response.setHeader("Access-Control-Allow-Origin","*")
    //运行自定义头属性
    response.setHeader("Access-Control-Allow-Headers","*")
    //发送响应的报文
    response.send("hello ajax的get")
})
app.all("/server",(require,response)=>{// 允许自定义头的,要用all。
    //允许跨域的
    response.setHeader("Access-Control-Allow-Origin","*")
    //允许自定义头的
    response.setHeader("Access-Control-Allow-Headers","*")
    //发送响应的报文
    response.send("hello ajax的post")
})
app.listen(3101,()=>{//设置端口号
    console.log("服务器已经启动")
})

app.all适配所有
浏览器刷新和输入网址响应默认是get请求
服务器肯能会启动失败,那是因为需要node_model文件终端输入 npm link list即可

运行截图:
在这里插入图片描述
用谷歌浏览器,dege看不到一些网络的数据

四、ajax的一些属性

服务器的html:

<!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>
    <style>
        #result{
            width: 100px;
            height: 101px;
            border:1px sandybrown solid;
        }
    </style>
</head>
<body>
    <button id="btn1">点击请求ajax</button>
    <button id="btn2">手动取消ajax的</button>
    <button id="btn3">节流</button>
    <div id="result"></div>
    <script>
        let btn1=document.getElementById("btn1")
        let btn2=document.getElementById("btn2")
        let btn3=document.getElementById("btn3")
        let result1=document.getElementById("result")
        let isSending=false //是否正在发这个请求
        let xhr=null
        btn1.addEventListener("click",function(){
           xhr=new XMLHttpRequest()
           xhr.timeout=2000//设置超过2秒后取消此次请求
           xhr.ontimeout=function(){
            alert("请求超时,稍后再试下")
           }
           xhr.onerror=function(){//设置网络错误的提示
            alert("网络不正常")
           }
            xhr.open("POST","http://127.0.0.1:3101/timer")
            xhr.send()
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    if(xhr.status>=200&&xhr.status<300){
                        result1.innerText=xhr.response
                    }
                }
            }
        })
        btn2.addEventListener("click",function(){
            xhr.abort()//取消ajax的请求
        })
        btn3.addEventListener("click",function(){
            if(isSending==false){
                xhr=new XMLHttpRequest()
            isSending=true;
            xhr.open("POST","HTTP://127.0.0.1:3101/timer")
            xhr.send()
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    isSending=false
                }
            }
            }
        })
    </script>
</body>
</html>

服务器的js

const express=require("express")
const app= express()
app.post("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
    setTimeout(() => {
        response.send("超时测试")
    }, 3000);

})
app.get("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
    
    setTimeout(() => {
    let data={name:"hwk"}
    data=JSON.stringify(data)
    response.send(data)
    }, 3000);

})
app.all("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
     //运行自定义头属性
     response.setHeader("Access-Control-Allow-Headers","*")


    setTimeout(() => {
        response.send("超时测试")
    }, 3000);

})
app.listen(3101,()=>{
    console.log("3101服务器启动成功")
})

运行截图:
在这里插入图片描述
可以设置断网来检测网络异常
在这里插入图片描述
选offline
在这里插入图片描述
防止发送重复的请求,减小服务器的压力(节流)
在这里插入图片描述

四、用jquery发送ajax(了解即可)

客户端(bootstarp)
记得引入jquery和bootstarp

<!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">
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <h2 class="page-heade">jquery发送ajax请求1</h2>
        <button class="btn btn-primary">GET</button>
        <button class="btn btn-danger">POST</button>
        <button class="btn btn-info">通用形的方法</button>
    </div>
    <script>
         $("button").eq(0).click(function(){
            $.get("http://127.0.0.1:3101/timer",{a:100},function(data){
                console.log(data)
            },"json")//加json这个可以将服务器发来的json数据直接变成对象
        })
        $("button").eq(1).click(function(){
            $.post("http://127.0.0.1:3101/timer",{a:100},function(data){
                console.log(data)
            })
        })
        $("button").eq(2).click(function(){
            $.ajax({url:"http://127.0.0.1:3101/timer",
            data:{a:100},
            type:"GET",
            dataType:"json",
            success:function(data){
                console.log(data)
            }}
            )
        })
    </script>
</body>
</html>

服务端:

const express=require("express")
const app= express()
app.post("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
    setTimeout(() => {
        response.send("超时测试")
    }, 3000);

})
app.get("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
    
    setTimeout(() => {
    let data={name:"hwk"}
    data=JSON.stringify(data)
    response.send(data)
    }, 3000);

})
app.all("/timer",(require,response)=>{ 
    response.setHeader("Access-Control-Allow-Origin","*")
     //运行自定义头属性
     response.setHeader("Access-Control-Allow-Headers","*")


    setTimeout(() => {
        response.send("超时测试")
    }, 3000);

})
app.listen(3101,()=>{
    console.log("3101服务器启动成功")
})

运行截图:
相继按下这几个按钮
在这里插入图片描述

五、axios的写法

Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。vue里面用到也是axios。
客户端的三个按钮分别对应axios的3种请求方式axios.get,axios.post,axios
因为服务端用的是command.js,为了避免影响故这里的axios是用的link(cdn)

客户端:

<!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">
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <title>axios</title>
</head>
<body>
    <button id="b1">GET</button>
    <button id="b2">POST</button>
    <BUtton id="b3">ajax</BUtton>
</body>
<script>
    const b1=document.getElementById("b1")
    const b2=document.getElementById("b2")
    const b3=document.getElementById("b3")
    axios.defaults.baseURL="http://127.0.0.1:3101"
    b1.onclick=function(){
        axios.get("/timer",{
            //url参数
            params:{
                id:1
            },
            //头信息
            headers:{
                name:"123",
                age:"801"
            }//axios返回的是promise的对象
        }).then(value=>{
            console.log(value)
        })
    }
    b2.onclick=function(){
        axios.post("/timer",{//第一个参数为url,第二个为请求体的数据,第三个为其他配置,如果只有两个参数,第二个为请求体
                name:"hwk",
                pwd:123
            },{
            //url参数
            params:{
                id:2
            },
            //头信息
            headers:{
                name:"123",
                age:"801"
            },
           
        }).then(value=>{
            console.log(value)
        })
    }
    b3.onclick=function(){
        axios({
            url:"/timer",
            params:{
                id:"3"
            },
            headers:{
                a:1,
            },
            data:{
                name:"hwk",
                pwd:123
            },
            method:"POST"
        }).then((response)=>{
            console.log(response)
        })
    }
</script>
</html>

注意axios()函数如果是一个形参,那个形参就是配置;
两个形参,写法第一个参数是url,第二个是其他配置;
三个形参的话,就是第一个是url,的、第二个是请求体,第三个是其他配置。(params,headers
服务器端和上面的是一模一样的。
运行截图:
发get
在这里插入图片描述

发post
在这里插入图片描述
发axios方法的"POST"
在这里插入图片描述

六、fetch的普通使用

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。
这种功能以前是使用 XMLHttpRequest 实现的。Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用,例如 Service Workers。Fetch 还提供了专门的逻辑空间来定义其他与 HTTP 相关的概念,例如 CORS 和 HTTP 的扩展。
客户端

<!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>ajax的fetch</title>
</head>
<body>
    <button id="btn1">ajax请求</button>
</body>
<script>
    const btn=document.getElementById("btn1")
    btn.onclick=function(){
        fetch("http://127.0.0.1:3101/timer?A=10",{
            method:"POST",
            headers:{
                a:1,
                b:1
            },
            body:JSON.stringify({
                a:1
            })
        }).then(response=>{
           return response.text()
        }).then(response=>{
            console.log(response)
        })
    }
</script>
</html>

非常类似于axios接收请求体变成了body,然后不能传对象,然后是params只能在路径后面用query的形式
运行截图:
在这里插入图片描述

七、温故才能知新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【尚硅谷】Java数据结构与算法笔记10 - 树结构的基础部分

文章目录一、二叉树1.1 为什么需要树结构1.1.1 数组存储方式的分析1.1.2 链式存储方式的分析1.1.3 树存储方式的分析1.2 树示意图1.3 二叉树的概念1.4 二叉树 - 遍历节点1.5 二叉树 - 查找指定节点1.6 二叉树 - 删除节点二、顺序存储二叉树2.1 顺序存储二叉树的概念2.2 顺序存储…

过气明星组合大衣哥、李嘉明、唐磊,谁录制祝福视频能价值100万

有人说大衣哥、李嘉明和唐磊&#xff0c;都属于过气的明星&#xff0c;只能说仁者见仁&#xff0c;智者见智了&#xff0c;毕竟每个人对事情的的看法不同&#xff0c;得到的结论也不会一样。大衣哥是农民歌唱家&#xff0c;本来就是泥腿子出身&#xff0c;就算有人气流量也不懂…

Ai检测人员穿衣规范系统 opencv

Ai检测人员穿衣规范系统可以通过opencvyolo深度学习技术对现场画面中人员穿衣自动检测&#xff0c;发现现场人员未正确按要求穿衣进行抓拍留档。OpenCV可以在不同的系统平台上使用&#xff0c;包括Windows&#xff0c;Linux&#xff0c;OS&#xff0c;X&#xff0c;Android和iO…

【数据安全】一起聊聊数据安全

信息安全的本质就是保护数据被合法地使用&#xff0c;或者一句话“让对的人看到对的数据&#xff01;”。 近来各种各样的安全名词满天飞&#xff0c;什么信息安全、网络安全、应用安全、数据安全、物联网安全、AI安全… 相应的法律、标准、资质、认证、安全方向产品、创业公司…

HTTP(类似TCP/TUP协议)、Tomact(对整个web操作的集成软件)、Servlet(动态显示,需要Tomcat才能运行)

javaWeb&#xff1a;web为网站&#xff0c;javaWab就是用java来解决web互联网领域的技术栈 B/S架构&#xff1a;Brower/Server&#xff0c;浏览器/服务器 架构模式&#xff0c;他的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器&#…

HBase RowKey设计和实现

HBase由于存储特性和读写性能&#xff0c;在OLAP即时分析中发挥重要作用&#xff0c;Rowkey的设计好坏关乎到HBase的使用情况。 我们知道HBase中定位一条数据需要四个维度的限制&#xff1a;RowKey&#xff0c;Column Family&#xff0c;Column Qualifier&#xff0c;Timestamp…

同源策略和跨域请求的实现

一、什么是同源策略 如果两个 URL 的 protocol、port (en-US) (如果有指定的话) 和 host 都相同的话&#xff0c;则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”&#xff0c;或者直接是“元组”。&#xff08;“元组”是指一组项目构成的整体&#xff0c;双重/…

C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#

文章目录前言1. 为什么使用文件2. 什么是文件程序文件数据文件3. 文件的打开和关闭4. 文件的顺序读写fgetcfputcfgetsfputsfprintffscanf流的介绍fwritefread5. 文本文件和二进制文件6. 文件读取结束的判定被错误使用的feof7. 文件缓冲区写在最后前言 相信大家对文件都不陌生&a…

4、数据类型

目录 1. 基本类型 &#xff08;1&#xff09;数值类型 &#xff08;2&#xff09;字符类型 &#xff08;3&#xff09;布尔类型 2. 构造类型 3. 空类型 本文主要介绍基本数据类型。 1. 基本类型 基本类型也就是C语言中的基础类型&#xff0c;其中包括整型、字符型、浮点…

我的 git 实战记录

我的 git 实战记录 1. 将本次提交追加到上一次提交 1.1. 情景描述 有些时候&#xff0c;我提交东西太勤快了&#xff0c;导致有部分内容没有提交上去。分为两种情况&#xff1a; 已经 push 远程仓库还没有 push 到远程仓库 1.2. 已经 push到远程仓库 先 git add 提交修改…

Windows免费MQTT服务器搭建及使用

1、EMQ X&#xff08;简称 EMQ) 简介 EMQ的源代码完全开源&#xff0c;支持百万级并发连接&#xff0c;支持完整的MQTT协议&#xff0c;可以简单方便地部署在Linux、Mac OS X或Windows等平台上&#xff0c;支持MySQL、Redis等扩展插件&#xff0c;总的来说&#xff0c;EMQ满足…

Java设计模式-访问者模式Visitor

介绍 访问者模式&#xff08;Visitor Pattern&#xff09;&#xff0c;封装一些作用于某种数据结构的各元素的操作&#xff0c;它可以在不改变数据结构的前 提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离&#xff0c;解决 数据结构和操作耦合性问题访问者模…

day15|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 问题分析&#xff1a; 递归法&#x…

【基础篇】3 # 数组:为什么很多编程语言中数组都从0开始编号?

说明 【数据结构与算法之美】专栏学习笔记 什么是数组&#xff1f; 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 线性表和非线性表 线性表&#xff08;Linear List&#xff09;&#xff1…

第07章 面向对象编程(中级部分OOP)

文章目录IDE(集成开发环境)IDEA介绍idea运行包包的作用包基本语法包的本质分析(原理)包的命名命名规则命名规范常用的包如何引入包注意事项和使用细节访问修饰符【modifier】基本介绍使用的注意事项封装【encapsulation】介绍封装的好处和理解封装的实现步骤封装练习继承【exte…

【阶段四】Python深度学习02篇:深度学习基础知识:神经网络可调超参数:优化器

本篇的思维导图: 神经网络可调超参数:优化器 优化器相当于是用来调解神经网络模型的‘手柄’。 代码 # 编译神经网络,

【C语言】小王带您轻松实现动态内存管理(简单易懂)

在上文通讯录制作中&#xff0c;动态通讯录的使用中就用到了动态内存管理&#xff0c;如果有同学想看一看是如何运用的内存管理函数的&#xff0c;请参考这篇文章&#xff0c;接下来我们一起学习动态内存管理的相关知识。【C语言】使用C语言实现静态、动态的通讯录&#xff08;…

浅显易懂的三次握手与四次挥手

目录 一、三次握手 什么是三次握手&#xff1f; 三次握手图解&#xff1a; 过程解析&#xff1a; &#xff08;1&#xff09;第一次握手&#xff1a; &#xff08;2&#xff09;第二次握手&#xff1a; &#xff08;3&#xff09;第三次握手&#xff1a; 二、四次挥手 …

已解决Python读取20GB超大文件内存溢出报错MemoryError

已解决Python读取20GB超大文件内存溢出报错MemoryError 文章目录报错问题报错翻译报错原因解决方法1解决方法2&#xff08;推荐使用&#xff09;帮忙解决报错问题 日常数据分析工作中&#xff0c;难免碰到数据量特别大的情况&#xff0c;动不动就2、3千万行&#xff0c;如果…

操作系统进程调度算法

进程调度 高级调度&#xff08;作业调度&#xff09;&#xff1a;按一定的原则从外存的作业后备队列中挑选一个作业调入内存&#xff0c;并创建进程。每个作业只调入一次&#xff0c;调出一次。作业调入时会建立PCB&#xff0c;调出时会撤销PCB。 中级调度&#xff08;内存调度…