Ajax学习笔记(一):原生AJAX、HTTP协议、AJAX案例准备工作、发送AJAX请求、AJAX 请求状态

目录

一、原生AJAX

1.1AJAX 简介

1.2 XML 简介

1.3 AJAX的特点

二、HTTP协议

三、AJAX案例准备工作

四、发送AJAX请求

1.发送GET请求

2.发送POST请求

3.JSON响应

IE缓存问题:

五、AJAX 请求状态


一、原生AJAX

  • 1.1AJAX 简介

AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。

通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。

AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式

比如百度搜索框:

搜索abcd,下面出现的提示框就是用到Ajax,提示框中的信息不是自动生成的,而是向服务器发送请求,数据从服务器返回。

注册页面:

当我们输入一个用户名,不可以时,会提示此用户名太受欢迎,请更换一个,也是运用了Ajax。

  • 1.2 XML 简介

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

 

  • 1.3 AJAX的特点

1.3.1 AJAX的优点

1) 可以无需刷新页面而与服务器端进行通信。

2) 允许你根据用户事件来更新部分页面内容。

1.3.2 AJAX的缺点

1) 没有浏览历史,不能回退

2) 存在跨域问题(同源)

3) SEO 不友好

二、HTTP协议

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

重点是格式与参数:

1.请求报文

行:     GET/POST  /URL  HTTP  协议版本

头:    Host:值  cookie:值  Content-type:值   User-Agent:值 等等

空行:

体:   如果是GET请求体为空,如果是POST可以不为空

2.响应报文

行: HTTP协议版本  响应状态码 响应状态字符串

头: Content-type:值  Content-length:值  Content-encoding:值 等等

体: HTML语法内容

        <html>

              <head>

              </head>

               <body>

                       <h1>月薪过万</h1>

               </body>

       </html>

三、AJAX案例准备工作

1.安装express

只需要在vscode => 终端 => 当前目录中 => 输入npm init --yes。

2.创建一个js文件

在当前目录下新建js文件(不一定非要在express安装的根目录),然后在终端=>当前目录下=>输入 node 文件名 就可以启动服务

报错:Error: listen EADDRINUSE: address already in use :::8000

如果端口被占用,找到前一个服务关闭,在终端CTRL+C端口释放,然后重新再到需要开启服务的终端输入node 文件名

四、发送AJAX请求

1.发送GET请求

点击按钮div:点击按钮发送AJAX请求给服务器,然后把响应体拿过来放到div中。

这部分看不太懂,只是照着敲了一边,后面再回来补。

<button>点击发送请求</button>
 <div id="result"></div>

<script>
      // 获取button元素
      const btn = document.getElementsByTagName('button')[0]
      const result = document.getElementById('result')
      // 绑定事件
      btn.onclick = function () {
        //1. 创建对象
        const xhr = new XMLHttpRequest()
        //2. 初始化 设置请求方法和 url
        xhr.open('GET', 'http:127.0.0.1:8000/server?a=100&b=200&c=300')
        //3. 发送
        xhr.send()
        //4. 事件绑定 处理服务端返回的结果
        // on    当....时候
        // readystate 是 xhr 对象中的属性 , 表示状态 0 1 2 3 4
        //其中0-未初始化 1-open调用完毕 2-send调用完毕 3-服务端返回了部分结果 4-服
务端返回了所有结果
        //change 改变
        xhr.onreadystatechange = function () {
          // 判断(服务器返回了所有的结果)
          if (xhr.readyState === 4) {
            // 判断响应状态码 200   404   403   401    500
            // 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 的文本
              result.innerHTML = xhr.response
            }
          }
        }
      }
    </script>

设置url参数:用?隔开,=赋值,&分隔

例如:http://127.0.0.1:8000/server?a=1&b=2&c=3

Server.js 文件:

//1. 引入express
const express = require('express')
//2. 创建应用对象
const app = express()
//3. 创建路由规则
// resquest 是对请求报文的封装
// response 是对响应报文的封装
app.get('/server', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  // 设置响应体
  response.send('HELLO AJAX')
})
//4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动,8000 端口监听中...')
})

2.发送POST请求

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

 <div id="result"></div>

传参在send中写,任何类型都可以

可以在xhr.setRequestHeader 设置请求头,不懂可以看下注释

<script>
      // 获取元素对象
      const result = document.getElementById('result')
      // 绑定事件
      result.addEventListener('mouseover', function () {
        //1. 创建对象
        const xhr = new XMLHttpRequest()
        //2. 初始化 设置类型与 URL
        xhr.open('POST', 'http://127.0.0.1:8000/server')
        // 设置请求头:固定写法,第一个参数设置请求体内容类型,第二个参数是参数查询字符串的类型
        xhr.setRequestHeader(
          'Content-Type',
          'application/x-www-form-urlencoded'
        )
        //3. 发送  在这里传值 任何类型都可
        xhr.send('a=100&b=200&c=300')
        // xhr.send('a:100&b:200&c:300')
        // xhr.send('123456')
        //4. 事件绑定
        xhr.onreadystatechange = function () {
          // 判断
          if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300) {
              // 处理服务端返回的结果
              result.innerHTML = xhr.response
            }
          }
        }
      })
    </script>

server.js

//1. 引入express
const express = require('express')
//2. 创建应用对象
const app = express()
//3. 创建路由规则
// resquest 是对请求报文的封装
// response 是对响应报文的封装
app.post('/server', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  // 设置响应体
  response.send('HELLO AJAX POST')
})
//4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动,8000 端口监听中...')
})

3.JSON响应

键盘按下任意按下一个按键,就会向服务端发送请求,服务端返回结果,结果在div中呈现

服务端响应体也可以设置为一个数据发送过去,但是不能直接写,要通过JSON.stringify(数据)把数据转换为JSON字符串

app.get('/json-server', (request, response) => {
    //设置响应头
    response.setHeader('Access-Control-Allow-Origin', '*');
    //响应一个数据
    const data = { name: 'atguigu'};
    let str = JSON.stringify(data); //对对象进行字符串转换
    //设置响应体
    response.send(str);
})

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

借助JSON.parse(xhr.response)

let data = JSON.parse(xhr.response);
console.log(data);  //js对象:{ name: 'ht' }
result.innerHTML = data.name;

(2)自动把JSON字符串转换为js对象

  借助 xhr.responseType = 'json';

xhr.responseType = 'json';
......
console.log(xhr.response); //js对象:{ name: 'ht' }
result.innerHTML = xhr.response.name;

nodemon实现保存自动重启服务

终端运行npm install -g nodemon安装nodemon,这样每次保存就会自动重启服务,比较方便(副作用是所有html都无法保存时自动调整格式),使用时还是在当前目录nodemon+文件名 ,如

nodemon server.js(之前是node server.js

IE缓存问题:

在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩

余多次请求不会在发送给浏览器而是直接加载缓存中的数据。

解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址

即可避免缓存问题

xhr.open("get","/testAJAX?t="+Date.now());

app.get('/ie', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  // 设置响应体
  response.send('HELLO IE - 3')
})


 xhr.open('GET', 'http://127.0.0.1:8000/ie?t=' + Date.now()) //获取当前时间戳

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

服务器写个定时器,3秒后发送响应体

//延时响应
app.get('/delay', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  setTimeout(() => {
    // 设置响应体
    response.send('延时响应')
  }, 3000)
})

然后点击按钮发送请求时,可以设置超时xhr.timeout和超时回调xhr.ontimeout,还有网络异常回

xhr.onerror

const xhr = new XMLHttpRequest()
        //超时设置 2s 设置
        xhr.timeout = 2000
        //超时回调
        xhr.ontimeout = function () {
          alert('网络异常,请稍后重试!!!')
        }
        //网络异常回调
        xhr.onerror = function () {
          alert('您的网络似乎出现了一些问题')
        }

浏览器可以手动断网offine

3.AJAX手动取消请求

定时器发送响应体

app.get('/cancel', (request, response) => {
  //设置响应头
  response.setHeader('Access-Control-Allow-Origin', '*')
  //设置响应体
  setTimeout(() => {
    response.send('HELLO 我请求被取消了,没法发过去了')
  }, 3000)
})

写两个按钮

<button>点击发送</button>
    <button>点击取消</button>

取消请求,用xhr.abort()方法,abort中文意思是中止

这里边儿有个作用域的问题,解决方法是把xhr定义在外边给个null,然后赋值xhr实例,再调用方法。(重复赋值不要用const,能用const就用const,不能const就let,反正不能用var)

// 获取元素对象
      const btns = document.querySelectorAll('button')
      let xhr = null
      btns[0].onclick = function () {
        xhr = new XMLHttpRequest()
        xhr.open('GET', 'http://127.0.0.1:8000/cancel')
        xhr.send() // 不用拿响应体,所有后面不写了
      }
      //取消请求 abort
      btns[1].onclick = function () {
        xhr.abort() //先点send再点cancel不会报错,反之报错
        // console.log(xhr)
      }

4.AJAX请求重复发送问题

服务端还是用的前面的定时器,这里重复请求写个逻辑,如果没处在请求中,就创建新的请求;如果已经请求了,就废掉,再重新创建请求。

 // 获取元素对象
      const btns = document.querySelectorAll('button')
      let xhr = null
      // 标识变量
      let isSending = false // 是否正在发送AJAX请求
      btns[0].onclick = function () {
        // 判断标识符变量
        if (isSending) xhr.abort() // 如果正在发生,则取消该请求,创建一个新的请求
        xhr = new XMLHttpRequest()
        // 修改 标识变量的值
        isSending = true
        xhr.open('GET', 'http://127.0.0.1:8000/cancel')
        xhr.send()
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4) {
            // 修改标识变量 有可能请求失败,所以这里不用再做判断,只要拿到结果,就算请求完成
            isSending = false // 拿到服务器的全部结果后,置为false
          }
        }
      }

五、AJAX 请求状态

xhr.readyState 可以用来查看请求当前的状态

XMLHttpRequest.readyState - Web API 接口参考 | MDN

0: 表示 XMLHttpRequest 实例已经生成,但是 open()方法还没有被调用。

1: 表示 send()方法还没有被调用,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。

2: 表示 send()方法已经执行,并且头信息和状态码已经收到。

3: 表示正在接收服务器传来的 body 部分的数据。

4: 表示服务器数据已经完全接收,或者本次接收已经失败了

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

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

相关文章

使用Nginx进行负载均衡

什么是负载均衡 Nginx是一个高性能的开源反向代理服务器&#xff0c;也可以用作负载均衡器。通过Nginx的负载均衡功能&#xff0c;可以将流量分发到多台后端服务器上&#xff0c;实现负载均衡&#xff0c;提高系统的性能、可用性和稳定性。 如下图所示&#xff1a; Nginx负…

shell控制多线程并发处理

一、前言 我们在用shell编程时&#xff0c;当用到循环语句时&#xff0c;如果循环的对象数量比较多&#xff0c;则代码一条一条处理&#xff0c;时间消耗会特别慢。如果此时机器资源充足&#xff0c;不妨学会多线程并发处理这招&#xff0c;帮助你提前打卡完成工作。 二、控制…

MySQL数据库自动备份(Linux操作系统)

方式一 参考&#xff1a;https://blog.csdn.net/qq_48157004/article/details/126683610?spm1001.2014.3001.5506 1.MySQL备份脚本 在/home/backups/下建立.sh文件&#xff0c;文件名称 mysql_backup.sh ,内容如下 #!/bin/bash #备份路径 BACKUP/home/backups/mysqlBackup…

酷开系统走在前列,品牌重启增长,酷开科技成为品牌商合作目标

区别于火热的移动端&#xff0c;手机屏作为私密屏&#xff0c;往往面向的是用户个体&#xff0c;而电视作为家庭连接的重要枢纽&#xff0c;不仅仅定位于公共屏&#xff0c;同时也面向客厅场景发挥着其大屏传播的作用&#xff0c;这里不仅牵扯到大屏营销&#xff0c;也关联着大…

奥赛满分金牌得主出品,硅谷诞生超级AI码农

又是让程序员们兴奋而焦绿&#x1f34c;的一刻&#xff0c;昨天业界又发布了一款 AI 编程产品 Devin。号称是业界第一个 AI 软件工程师。 作者 Scott Wu 曾是国际信息奥赛 (IOI) 连续三届的金牌得主&#xff0c;其中还有一届是满分。 Devin 背后的公司名字叫 Cognition。中文翻…

Matlab有限元结果后处理 | 不规则云图绘制(二维/三维)|【Matlab源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

SSA-LSTM多输入回归预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

换掉ES!Redis官方搜索引擎来了,性能炸裂!

RediSearch 一、介绍二、实现特性1. 对比 Elasticsearch2. 索引构建测试3. 查询性能测试 三、安装1. 源码安装2. docker安装3. 判断是否安装成功 四、命令行操作1. 创建1.1 创建索引1.2 创建文档 2. 查询2.1 基本查询2.1.1 全量查询2.1.2 匹配查询 2.2 模糊匹配2.2.1 后置匹配2…

java数据结构与算法刷题-----LeetCode491. 非递减子序列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n 2 ∗ n n^2*n n2∗n),空间复…

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

目录 1.模块的总体结构 1.1从工作空间导入输入信号 1.2FIR滤波器 2.Subsystem 3.MATLAB Function 文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我…

【数据结构与算法】排序

目 录 一.排序的概念及引用1.1 排序的概念1.2 常见的排序算法 二.常见排序算法的实现2.1 插入排序直接插入排序希尔排序( 缩小增量排序 ) 2.2 选择排序直接选择排序堆排序 2.3 交换排序冒泡排序快速排序快速排序优化&#xff1a;非递归实现快速排序 2.4归并排序2.4.3 海量数据的…

专题二 - 滑动窗口 - leetcode 30. 串联所有单词的子串 | 困难难度

leetcode 30. 串联所有单词的子串 leetcode 30. 串联所有单词的子串 | 困难难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现滑动窗口&#xff0c;并使用遍历判断两个哈希表是否相等滑动窗口&#xff0c;引入有效字符计数co…

libusb_Qt使用

Libusb libusb_github 建议直接下载库&#xff0c;编译好麻烦 QT调用 .pro文件添加&#xff1a; win32: LIBS -L$$PWD/LIB/libusb/x64/ -llibusb-1.0.cpp调用即可 #include "LIB/libusb/libusb.h" void class_name::fun(){/* 1. */libusb_init(NULL);/**/str…

软考高级:信息系统开发方法2(形式化方法、统计过程方法等)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【深度学习目标检测】二十三、基于深度学习的行人检测计数系统-含数据集、GUI和源码(python,yolov8)

行人检测计数系统是一种重要的智能交通监控系统&#xff0c;它能够通过图像处理技术对行人进行实时检测、跟踪和计数&#xff0c;为城市交通规划、人流控制和安全管理提供重要数据支持。本系统基于先进的YOLOv8目标检测算法和PyQt5图形界面框架开发&#xff0c;具有高效、准确、…

42.坑王驾到第八期:uniCloud报错

uniCloud 报错 今天调用云函数来调试小程序的时候突然暴了一个奇葩错误&#xff0c;require(…).main is not a function。翻官方文档后发现&#xff0c;原来是这样&#xff1a;**如果你写的是云对象&#xff0c;入口文件应为 index.obj.js&#xff0c;如果你写的是云函数入口…

在centOS服务器安装docker,并使用docker配置nacos

遇到安装慢的情况可以优先选择阿里镜像 安装docker 更新yum版本 yum update安装所需软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep…

CentOS 7安装MySQL及初始化操作教程

一、引言 MySQL是一款广泛使用的开源关系型数据库管理系统&#xff0c;适用于各种规模的应用场景。在CentOS 7系统中安装MySQL并进行初始化操作&#xff0c;可以为我们的应用程序提供稳定、可靠的数据存储服务。本文将详细介绍CentOS 7安装MySQL及初始化操作的步骤。 目录 一、…

Midjourney绘图欣赏系列【人物篇】(一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

2024 年排名前 5 名的 Mac 数据恢复软件分享

如果您已经在 Mac 上丢失了数据并且正在寻找恢复数据的方法&#xff0c;那么您来对地方了。互联网上有超过 50 个适用于 Mac 的数据恢复程序。哪个是最好的 Mac 数据恢复软件&#xff1f;不用担心。本文列出了 5 款 Mac 数据恢复软件&#xff0c;可帮助您在 Mac OS 下恢复丢失的…