AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题

一、什么是AJAX

1.AJAX

就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

2.XML

可扩展标记语言。XML被设计用来传输和存储数据。XML和HTML类似,不同的是HTML是用来呈现数据的,而且HTML中都是预定义标签(已经定义好的),而XML中没有预定义标签,全部都是自定义标签,用来表示一些数据。(目前已经被JSON取代)

3.AJAX的优缺点

优点:
(1)可以无需刷新页面而与服务器端进行通信。
(2)允许你根据用户事件(鼠标、键盘事件等等)来更新部分页面内容。
缺点:
(1)没有浏览历史,不能回退。
(2)存在跨域问题(不同网站中请求不到)
(3)SEO不友好(查看源代码中无法查找到)

二、HTTP协议

HTTP全称为hypertext transport protocol 协议【超文本传输协议】,协议详细规定了浏览器和万维网服务器之间互相通信的规则。

1.请求报文

2.响应报文

发过来的响应体里面有html,然后接收方再去解析然后显示在页面上

三、AJAX案例准备工作

1.配置环境

终端中输入npm i express

2.创建一个服务端

sudo node express.js

//引入express
const express = require('express');

//创建应用对象
const app = express();

//创建路由规则
//request是请求报文的封装
//response是响应报文的封装
app.get('/', (request, response) => {
    response.send('hello express')
});

app.listen(8080, () => {
    console.log('服务已经启动,8080端口监听中')
})

网页输入链接http://127.0.0.1:8080/

网页中出现 hello express

四、发送AJAX请求

1.发送GET请求

我们现在想要实现点击按钮发送请求将数据显示到div盒子中

客户端发送请求时,如果url是server,就会执行回调函数(箭头函数),并且由response来作出响应

 <button>点击发送请求</button>
    <div id="result"></div>
<script>
        const btn=document.querySelector('button')
        const result=document.querySelector('#result')
        btn.onclick=function(){
            //创建对象
            const xhr=new XMLHttpRequest();
            //初始化,设置请求方法和url;
            //第一个参数:什么类型的请求,第二个参数给谁发
            xhr.open('GET','http://127.0.0.1:8080/server')
            //发送
            xhr.send();
            //事件绑定,处理服务端返回的结果
            //on在什么什么的时候,readystate是xhr对象的属性它的值有:
            //0-未初始化 1-open调用完毕 2-send调用完毕 3-服务端返回了部分结果 4-服务端返回了所有结果
            //改变的时候触发,所以会触发四次
            xhr.onreadystatechange=function(){
                //判断(服务器返回全部数据
                if(xhr.readyState==4){
                    //判断响应状态码 200 404 403 401 500
                    //响应状态中2开头都是表示成功
                    if(xhr.status>=200&&xhr.status<300)
                    {
                        //处理结果 行 头 空行 体
                        //响应行
                        console.log(xhr.status)//状态码
                        console.log(xhr.statusText)//状态字符串
                        console.log(xhr.getAllResponseHeaders())//所有响应头
                        console.log(xhr.response)//响应体
                        //设置result文本
                        result.innerHTML=xhr.response
                    }
                }
            }
        }
    </script>

服务端只修改了/server:

//引入express
const express = require('express');

//创建应用对象
const app = express();

//创建路由规则
//request是请求报文的封装
//response是响应报文的封装
app.get('/server', (request, response) => {
    //设置响应头,名为Access-Control-Allow-Origin
    //*设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*')
    response.send('hello AJAX')
});

app.listen(8080, () => {
    console.log('服务已经启动,8080端口监听中')
})
设置url参数:用?隔开,=赋值,&分隔
例如:http://127.0.0.1:8000/server?a=1&b=2&c=3

2.发送POST请求

鼠标经过div发送AJAX请求,然后拿回来响应体放在div中

post和get区别就是get从服务器获取数据,post向服务器传送数据

post可以设置参数(在xhr.send();中)

设置请求头信息用来校验用户身份

<body>
    <div id="result"></div>
    <script>
        const result=document.querySelector('#result')
        //绑定事件
        result.addEventListener("mouseover",function(){
            const xhr=new XMLHttpRequest();
            xhr.open('POST','http://127.0.0.1:8080/server')
            // 设置请求头,接收两个参数:头的名字和头的值
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
            //上面这句用来设置请求体内容的类型,后面参数是固定写法
            xhr.send('a=100&b=200&c=300');
            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文本
                        result.innerHTML=xhr.response
                    }
                }
            }
        })
    </script>
</body>
app.post('/server', (request, response) => {
    //设置响应头,名为Access-Control-Allow-Origin
    //*设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*')
    response.send('hello AJAX post')
});

鼠标经过就显示数据

3.JSON响应

响应一个数据,通过stringify(data)转化为JSON字符串发送过去

app.all('/json-server', (request, response) => {
    //设置响应头,名为Access-Control-Allow-Origin
    //*设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*')
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*')
    const data={
        name:'atguigu'
    }
    //对对象进行字符串转换
    let str =JSON.stringify(data)
    response.send(str)
});

页面拿到JSON字符串响应体的时候识别不了,需要转换为js对象

(1)手动把JSON字符串转换为js对象

JSON.parse(xhr.response)

if(xhr.status>=200&&xhr.status<300)
                    {
                        //对数据的手动转换
                        let data=JSON.parse(xhr.response)
                        console.log(data)
                        result.innerHTML=data.name
(2)自动把JSON字符串转换为js对象

xhr.responseType = 'json';

 //设置响应体数据的类型
            xhr.responseType='json'
、、、
if(xhr.status>=200&&xhr.status<300)
                    {
                        //自动转换
                        console.log(xhr.response)
                        result.innerHTML=xhr.response.name
                    }

五、AJAX请求的几个问题

以前在server写代码就得重新启动终端,安装 npm install -g nodemon就可以自动刷新了

1.IE缓存问题

ie浏览器会对ajax请求的结果做缓存,所以下一次请求时它走的是本地的缓存而不是服务器返回的最新数据

 xhr.open('GET','http://127.0.0.1:8000/ie?t='+Date.now())

在请求的url这里加上时间戳,这样ie就认为你每次请求的都不一样就去给你拿最新的

2.AJAX请求超时与网络异常处理

在请求超时和网络异常的时候给用户来一个友好的提醒,服务端写个定时器,3秒后发送响应体

app.get('/delay', (request, response) => {
    //设置响应头,名为Access-Control-Allow-Origin
    //*设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*')
    setTimeout(()=>{
        response.send('hello ie-2')
    },3000)
    
});
//2s还没收到响应体就取消请求
            xhr.timeout=2000
            //超时回调
            xhr.ontimeout=function(){
                alert('网络异常')
            }
            //网络异常回调
            xhr.onerror=function(){
                alert('你的网络似乎出了点问题')
            }

设置超时xhr.timeout, 超时回调xhr.ontimeout,还有网络异常回调xhr.onerror

3.AJAX手动取消请求

在请求的结果还没回来之前手动取消 abort方法

<script>
        const btns=document.querySelectorAll('button');
        let x=null;
        btns[0].onclick=function(){
            x=new XMLHttpRequest();
            x.open("GET",'http://127.0.0.1:8000/delay')
            x.send()
            //这里的x是这个函数的局部变量我还想在下面用就得去声明
        }
        btns[1].onclick=function(){
            x.abort();
        }
    </script>

本来x在第一个函数用const声明,但是下面还想用就不能再用const了,全局一个let x

4.AJAX请求重复发送问题

如果用户一直点击一个按钮,就是在重复请求,那么我们就把前面重复请求的停掉

定义一个isSending变量来判断是否在发送状态

 <button>点击发送</button>
    <script>
        const btn=document.querySelector('button');
        let x=null;

        let isSending=false
        //是否正在发送AJAX请求

        btn.onclick=function(){
            if(isSending) x.abort();
            //如果正在发送就取消这个请求,创建一个新的
            x=new XMLHttpRequest();
            isSending=true;
            x.open('GET','http://127.0.0.1:8000/delay')
            x.send()
            x.onreadystatechange=function(){
                if(x.readyState==4)
                {
                    isSending=false;
                }
            }
            //这里的x是这个函数的局部变量我还想在下面用就得去声明
        }
        
    </script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++(13) STL 库初识

文章目录 STL 库初识1. STL 库1.1 STL 库的案例1.2 C 标准模板库的三个组件1.3 案例展示 2. 迭代器1.1 概述和分类2.2 代码案例 STL 库初识 1. STL 库 1.1 STL 库的案例 类似学习了模板的概念。CSTL (标准模板库) 是一套功能强大的 C 模板类&#xff0c;提供了通用的模板类和…

【Linux详解】——进程信号

&#x1f4d6; 前言&#xff1a;本期介绍进程信号。 目录 &#x1f552; 1. 生活角度的信号&#x1f552; 2. 技术角度的信号&#x1f558; 2.1 Linux中的信号&#x1f558; 2.2 进程对信号的处理 &#x1f552; 3. 信号的产生方式&#x1f558; 3.1 键盘产生&#x1f558; 3.2…

svn如何合并代码以及解决合并冲突的问题(把分支代码合并到主版本)

1.选择主版本的文件夹。 ​​​​​​​ 2.选择合并一个不同的分支 3.选择主分支的路径和要合并的代码范围 4.点解next 选择这两个选项 5.然后点击Test merge&#xff0c;查看能否和并成功 有红色的提示&#xff0c;说明是有冲突的&#xff0c; 都是黑色说明能够合并成功 …

【无标题】如何使用 MuLogin 设置代理

如何使用 MuLogin 设置代理 使用 MuLogin 浏览器设置我们的代理&#xff0c;轻松管理多个社交媒体或电子商务帐户。 什么是MuLogin&#xff1f; MuLogin 是一款虚拟反检测浏览器&#xff0c;使用户能够管理多个电子商务、社交媒体和广告帐户&#xff0c;而无需验证码或 IP 禁…

星巴克终止Odyssey Beta NFT计划

日前&#xff0c;咖啡品牌星巴克宣布将于3月31日终止其NFT产品Odyssey Beta客户忠诚度计划。这意味着&#xff0c;曾经旨在改进会员忠诚度的Web3 产品Starbucks Odyssey将终止&#xff0c;构筑多年的Web2会员系统“星享俱乐部”脱去了Web3外衣&#xff0c;回到了本来的面貌。 至…

体验分低导致闭店!抖音小店体验分是什么?教你如何提高体验分!

哈喽~我是电商月月 相信开抖音小店的伙伴们对体验分这个东西都不陌生&#xff0c;但如何有效的提高体验分你们知道吗&#xff1f; 今天&#xff0c;我就来讲讲抖音小店体验分低有什么后果&#xff0c;同时在后面说一下体验分降低如何提高&#xff01; 大家可根据情况不同自行…

羊大师羊奶靠谱么?品质保障深度解析

羊大师羊奶靠谱么&#xff1f;品质保障深度解析 羊大师羊奶&#xff0c;作为市场上的知名品牌&#xff0c;其靠谱性一直备受消费者关注。那么&#xff0c;羊大师羊奶究竟靠谱不靠谱呢&#xff1f;这就需要从品质保障和消费者信赖两个方面进行深入解析。 从品质保障的角度来看&…

【JAVA】数据类型与变量(主要学习与c语言不同之处)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 字面常量 2. 数据类型 3. 变量 1.字面常量 在上节课 Hello…

Mysql的高级语句2

目录 引言&#xff1a; 一、按关键字进行排序 1、语句以及用法 2、先创建一个新的数据库以及数据表&#xff0c;并且导入内容 二、关键字排序操作 1、单个字段排序 ①按照分数进行排序&#xff0c;默认不指定就是升序排列 ②按照分数降序排列 ③结合where进行条件过滤…

C# LINQ笔记

C# LINQ笔记 from子句 foreach语句命令式指定了按顺序一个个访问集合中的项。from子句只是声明式地规定集合中的每个项都要访问&#xff0c;并没有指定顺序。foreach在遇到代码时就执行其主体。from子句什么也不执行&#xff0c;只有在遇到访问查询变量的语句时才会执行。 u…

【zlm】问题记录:chrome更新引起的拉不出webrtc; 证书校验引起的放几秒中断

目录 chrome更新引起的拉不出webrtc 证书校验引起的放几秒中断 chrome更新引起的拉不出webrtc 【zlm】最新的chrome版本中的报错&#xff1a; 我有个问题event.js:8 [RTCPusherPlayer] DOMException: Failed to execute setRemoteDescription on RTCPeerConnection: Failed …

太牛逼了!视频号下载器手机版(工具+方法)绝了

在众多的视频号下载中&#xff0c;可以说这个工具真的是很牛逼了&#xff01;这里问大家一个问题&#xff01; 你使用视频号下载工具以及视频号下载器都会不会因时间导致而失效呢&#xff1f; 自从小编使用了这款工具后&#xff0c;就不会因为视频失效而烦恼。 很多人免费推荐…

互斥锁与信号量的区别

信号量与互斥锁都是用于多线程编程中&#xff0c;以实现资源共享和线程同步的机制&#xff0c;但它们在应用场景、实现方式和性能特点上有所不同。以下是详细介绍&#xff1a; 应用场景。信号量主要用于线程同步&#xff0c;其核心思想是控制对共享资源的访问许可&#xff0c;…

javaWeb项目-快捷酒店信息管理系统功能介绍

开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

Windows虚拟主机上的网站如何来设置默认首页

近期有网友咨询想要知道Windows虚拟主机上的网站如何来设置默认首页,以便后期他需要时可以自行处理。这边了解到他当前使用的是Hostease 的Windows 虚拟主机&#xff0c;而设置默认首页的操作步骤如下&#xff1a; 1.Hostease的Windows虚拟主机都是带Plesk面板的,因此需要先进入…

智慧公厕的先进技术应用

公共厕所一直以来都是城市管理中一个重要的工作&#xff0c;但设施老化、环境脏乱、服务质量低下等问题一直困扰着城市居民。然而&#xff0c;随着科技的进步和数字技术的应用&#xff0c;智慧公厕的建设正在改变这一现状。 智慧公厕通过对所在辖区内所有公共厕所的全域感知、…

面试经典150题【91-100】

文章目录 面试经典150题【91-100】70.爬楼梯198.打家劫舍139.单词拆分322.零钱兑换300.递增最长子序列77.组合46.全排列39.组合总和&#xff08;※&#xff09;22.括号生成79.单词搜索 面试经典150题【91-100】 五道一维dp题五道回溯题。 70.爬楼梯 从递归到动态规划 public …

详解Java 中的 Lambda 表达式

引言&#xff1a; Lambda 表达式是 Java 8 中引入的一个重要特性&#xff0c;它可以使代码更加简洁、易读&#xff0c;并且更加具有函数式编程风格。Lambda 表达式本质上是一个匿名函数&#xff0c;它可以作为方法参数传递&#xff0c;也可以直接赋值给一个变量。 一、Lambda 表…

Day20:LeedCode 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

【Rust】——提取函数消除重复代码和泛型

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…