AJAX —— 学习(二)

目录

一、利用 JSON 字符串 返回数据

(一)基础代码

(二)原理及实现

二、nodmon 工具 自动重启服务

(一)用途

(二)下载

(三)使用

三、IE 缓存问题

(一)问题描述

(二)解决方法

三、AJAX 请求超时 / 网络异常处理

(一)处理方法

(二)完整代码

四、AJAX 取消请求

五、AJAX 请求重复发送问题


一、利用 JSON 字符串 返回数据

利用 AJAX 向服务端发送请求,服务端向我们返回的一般都是 JSON 格式的数据

在 div 中按键 向服务端发出请求 并在 div 中渲染返回结果

和前面类似不多解释了,不明白细节可以看上一篇

(一)基础代码

AJAX 前端代码:

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>AJAX POST 请求</title>
</head>
<style>
  #result {
    width: 200px;
    height: 100px;
    border: solid pink 1px;
  }
</style>

<body>
  <div id="result"></div>
  <script>
    // 获得元素对象
    const result = document.getElementById("result")
    // 绑定键盘按下事件
    window.onkeydown = function () {
      // 创建对象
      const xhr = new XMLHttpRequest();
      // 初始化设置请求方法 和url(就是发送的对象)
      xhr.open('GET', 'http://127.0.0.1:8000/json-server')
      // 设置请求头
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      // 自定义请求头
      xhr.setRequestHeader('name', 'hahaha')
      // 发送
      xhr.send('a=100&b=200')
      // 事件绑定 处理服务端返回的结果
      xhr.onreadystatechange = function () {
        // 在里面处理服务端返回的结果 在 4 时再处理
        if (xhr.readyState === 4) {
          // 判断响应的状态码 200 404 403 401 500
          // 2 开头都表示成功
          if (xhr.status >= 200 && xhr.status < 300) {
            result.innerHTML = xhr.response
          }
        }
      }
    }
  </script>
</body>

</html>

服务端代码:

// 1、先引入 express 框架
const express = require('express')
// 2、然后创建应用对象
const app = express()
// 3、创建路由规则,函数里面有两个参数,分别是请求报文和响应报文的封装
app.all('/json-server', (request, response) => {
  // 设置响应头 设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  // 特殊响应头
  response.setHeader('Access-Control-Allow-Headers', '*')
  // 设置响应体
  response.send('HELLO AJAX POST')
})
// 4、监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动,8000端口监听中...')
})

(二)原理及实现

我们想返回别的东西 不想只返回一堆字,比如说我们想返回一个对象 ,但是respond() 方法只能返回字符串,所以我们可以通过把 data 对象转换成 JSON 字符串的形式返回

const data = {
    name: '一个人'
  }
  let str = JSON.stringify(data)
  response.send(str)

结果展示:此时返回的是一个字符串

可以在前端代码中把字符串重新转换成对象

 if (xhr.readyState === 4) {
          // 判断响应的状态码 200 404 403 401 500
          // 2 开头都表示成功
          if (xhr.status >= 200 && xhr.status < 300) {
            let data = JSON.parse(xhr.response)
            console.log(data)
          }
        }

 输出检验一下,确实是对象

但是上面属于手动转换,我们可以自动转换

加上一句下面就可以自动转换了

xhr.responseType = 'json'

成功

在页面中显示数据 就稍微改一下渲染一下就行

结果展示:

二、nodmon 工具 自动重启服务

(一)用途

可以让我们修改服务端代码时不用重新启动服务器,节省时间

(二)下载

我们直接 在没有服务端启动的情况下 在终端界面 输入

npm install -g nodemon 就能下载了

(三)使用

然后我们以后启动服务器时用

nodemon.cmd 服务器文件名.js 就行了

三、IE 缓存问题

(一)问题描述

IE 浏览器会对 AJAX 的请求结果做一个缓存,下一次再发送请求时,走的是本地的缓存而不是服务器返回的最新的数据,对于时效性比较强的场景,AJAX 的缓存会影响结果

如果修改服务端传回的内容 在 ie 浏览器中刷新 显示内容不会发生改变,因为 ie 是从本地缓存中取出的数据

(二)解决方法

代码如下:在 open 方法代码中的 url 后面加上 当前时间戳 这样每次点击 ie 浏览器收到的请求都不一样,ie 以为我们发送了一个新的请求,这样就不会从本地缓存中读取数据了

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

三、AJAX 请求超时 / 网络异常处理

(一)处理方法

我们不能保证服务端一直准确快速响应 AJAX 请求,我们可以通过给 AJAX 加一个超时的设置,给用户提醒,网络异常的时候也给用户提醒,让产品体验更好

我们可以在服务器中设置一个延时函数 3秒后返回 延时响应

 setTimeout(() =>{
    response.send('延时响应')
  },3000)

在 AJAX 中设置一些代码 如果 2s 内还没返回请求就取消

xhr.timeout = 2000

超时回调,就是超时弹出对话框

xhr.ontimeout = function (){
      alert('网络异常,稍后再试')
    }

(二)完整代码

AJAX部分:

<script>
  const btn = document.getElementsByTagName('button')[0]
  const result = document.getElementById("result")
  btn.addEventListener('click', function () {
    const xhr = new XMLHttpRequest();
    // 超时设置
    xhr.timeout = 2000
    // 超时回调
    xhr.ontimeout = function () {
      alert('网络异常,稍后再试')
    }
    xhr.onerror = function(){
      alert('你的网络似乎出现了问题')
    }
    // 初始化设置请求方法 和url(就是发送的对象)
    xhr.open('GET', 'http://127.0.0.1:8000/delay')
    // 发送
    xhr.send('')
    // 事件绑定 处理服务端返回的结果
    xhr.onreadystatechange = function () {
      // 在里面处理服务端返回的结果 在 4 时再处理
      if (xhr.readyState === 4) {
        // 判断响应的状态码 200 404 403 401 500
        // 2 开头都表示成功
        if (xhr.status >= 200 && xhr.status < 300) {
          result.innerHTML = xhr.response
        }
      }
    }
  })
</script>

服务端部分:

// 1、先引入 express 框架
const express = require('express')
// 2、然后创建应用对象
const app = express()
// 3、创建路由规则,函数里面有两个参数,分别是请求报文和响应报文的封装
app.all('/delay', (request, response) => {
  // 设置响应头 设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*')
  // 特殊响应头
  response.setHeader('Access-Control-Allow-Headers', '*')
  // 设置响应体
  setTimeout(() => {
    response.send('hello ie')
  }, 3000)
})
// 4、监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动,8000端口监听中...')
})

四、AJAX 取消请求

在我们通过 AJAX 向服务器发送请求时,在服务器返回数据前,我们可以通过代码手动取消请求

使用 abort 方法 属于 AJAX 对象

就如下面 使用 x.abort() 就能取消请求

注意下面用到前面 IE 缓存的问题 在 url 后面加上一个时间戳,会返回 304 错误,原本的内容会被服务器缓存接着用 注意一下

<script>
  let x = null
  const btns = document.querySelectorAll('button')
  btns[0].onclick = function () {
    x = new XMLHttpRequest();
    x.open('GET', 'http://127.0.0.1:8000/delay?t='+Date.now())
    x.send()
  }
  btns[1].onclick = function () {
    x.abort()
  }
</script>

取消请求的结果:

五、AJAX 请求重复发送问题

之前用户连续点击按钮 AJAX 一直向服务器发送请求,但是我们不想这么做,我们想让用户连续点击时 取消前一次发送,进行下一次发送 有点像 js 中的防抖,有利于性能提升

我们就加入一个标识变量 isSending 检测 是否发送请求,如果有请求就把之前的请求取消,然后设置 isSending 为 true 然后检测是否发送结束,如果服务器返回全部内容时 就是 

xhr.readyState === 4 时就认定发送结束了,然后设置 isSending 为 false

不要判断响应的状态码 因为有可能这个请求有可能不成功 不是 2 开头 一直在成功里面判断isSending 就不能为 false了 不能继续进行下去了

<script>
  let x = null
  // 标识变量 看是否在发送 AJAX 请求
  let isSending = false
  const btns = document.querySelectorAll('button')
  btns[0].onclick = function () {
    // 判断标识符变量
    if(isSending) x.abort()
    x = new XMLHttpRequest();
    // 修改 标识变量的值
    isSending = true
    x.open('GET', 'http://127.0.0.1:8000/delay?')
    x.send()
         xhr.onreadystatechange = function () {
        // 在里面处理服务端返回的结果 在 4 时再处理
        if (xhr.readyState === 4) {
          // 判断响应的状态码 200 404 403 401 500
          // 2 开头都表示成功
         isSending = false
        }
      }
  }
</script>

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

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

相关文章

开源模型应用落地-chatglm3-6b模型小试-入门篇(一)

一、前言 刚开始接触AI时&#xff0c;您可能会感到困惑&#xff0c;因为面对众多开源模型的选择&#xff0c;不知道应该选择哪个模型&#xff0c;也不知道如何调用最基本的模型。但是不用担心&#xff0c;我将陪伴您一起逐步入门&#xff0c;解决这些问题。 在信息时代&#xf…

ADB 命令之 模拟按键/输入

ADB 命令之 模拟按键/输入 模拟按键/输入 在 ​​adb shell​​​ 里有个很实用的命令叫 ​​input​​&#xff0c;通过它可以做一些有趣的事情。 ​​input​​ 命令的完整 help 信息如下&#xff1a; Usage: input [<source>] <command> [<arg>...] Th…

MySQL 中将使用逗号分隔的字段转换为多行数据

在我们的实际开发中&#xff0c;经常需要存储一些字段&#xff0c;它们使用像, - 等连接符进行连接。在查询过程中&#xff0c;有时需要将这些字段使用连接符分割&#xff0c;然后查询多条数据。今天&#xff0c;我们将使用一个实际的生产场景来详细解释这个解决方案。 场景介绍…

数据结构——红黑树详解

一、红黑树的定义 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c…

转专业:集成电路、微电子、电子信息选哪个?

目录 集成电路专业 微电子技术专业 电子信息工程专业 综合分析 在考虑转专业到集成电路、微电子或电子信息时&#xff0c;您需要考虑多个因素&#xff0c;包括个人兴趣、专业课程内容、行业前景以及未来就业市场的需求。以下是关于这三个专业的详细分析&#xff0c;以及它们…

酷开科技智慧AI让酷开系统大显身手!

时代的浪潮汹涌而至&#xff0c;人工智能作为技术革新和产业变革的重要引擎&#xff0c;正深刻地影响着各行各业。在科技的海洋中&#xff0c;AI技术正逐渐渗透到我们的日常生活中&#xff0c;为我们带来前所未有的便捷和智慧。酷开科技用技术探索智慧AI&#xff0c;别看它只是…

让六西格玛培训有效的三个步骤,拿走不谢!

近年来&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;被众多企业视为提升产品质量、优化流程、减少浪费的利器。然而&#xff0c;如何使六西格玛培训真正落地生根&#xff0c;发挥出其应有的效果&#xff0c;成为了许多企业关注的焦点。本文&#xff0c;天行健Si…

Java零基础入门到精通_Day 4

方法的重载 就是同一个类中的相同方法名的多个方法&#xff0c;但是他们的参数不同&#xff0c;类型不同或者参数个数不同。 &#xff08;与返回值无关&#xff09; package Base_One;public class Base_005 {public static void main(String[] args) {// Main method logic …

探析Drools规则引擎的工作机制

目录 一、工作原理 二、工作流程 2.1 初始化环境 2.2 添加规则文件 2.3 编译规则文件 2.4 插入到工作内存 2.5 规则匹配与激活 2.6 规则执行 三、Drools 其他特性 3.1 符合事实 3.2 决策表 3.3 规则生命周期管理 3.4 规则流 四、Rete 算法 一、工作原理 Drools 规则引擎的工…

如何理解Java注解反射

Java 8 中文版 - 在线API手册 - 码工具 什么是注解 ◆Annotation是从JDK5.0开始引入的新技术 ◆Annotation的作用: 不是程序本身&#xff0c;可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如:编译器等)读取 Annotation的格式: > 注解是以&quo…

OSError: Can‘t load tokenizer for ‘bert-base-chinese‘

文章目录 OSError: Cant load tokenizer for bert-base-chinese1.问题描述2.解决办法 OSError: Can’t load tokenizer for ‘bert-base-chinese’ 1.问题描述 使用from_pretrained()函数从预训练的权重中加载模型时报错&#xff1a; OSError: Can’t load tokenizer for ‘…

数据结构栈和堆列

目录 栈&#xff1a; 栈的概念&#xff1a; 栈的实现&#xff1a; 栈接口的实现&#xff1a; 1.初始化栈&#xff1a; 2.入栈&#xff1a; 3.出栈&#xff1a; 4. 获取栈顶元素&#xff1a; 5.获取栈中有效数据的个数&#xff1a; 6.检测栈是否为空&#xff0c;如果为…

搜索二维矩阵 II - LeetCode 热题 21

大家好&#xff01;我是曾续缘&#x1f497; 今天是《LeetCode 热题 100》系列 发车第 21 天 矩阵第 4 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&…

20240402—Qt如何通过动态属性设置按钮样式?

前言 正文 1、点击UI文件 2、选择Bool型或是QString 3、设置后这里出现动态属性 4、这qss文件中绑定该动态属性 QPushButton[PopBlueBtn"PopBlueBtn"]{background-color:#1050B7;color:#FFFFFF;font-size:20px;font-family:Source Han Sans CN;//思源黑体 CNbor…

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(上)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工…

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…

程序的编译、链接过程分析(简洁浓缩版)!

《嵌入式工程师自我修养/C语言》系列——程序的编译、链接过程分析&#xff08;简洁浓缩版&#xff09;&#xff01; 一、程序的编译1.1 预编译指令 pragma1.2 编译过程概述1.3 符号表和重定位表 二、程序的链接2.1 分段组装2.2 符号决议2.2.1 强符号与弱符号2.2.2 GNU编译器的…

了解与生成火焰图

目录 一、如何看懂火焰图 1、基本特征 2、基本分类 二、如何生成火焰图 1、捕获调用栈 2、折叠栈 3、转换为 svg 格式 4、展示 svg 一、如何看懂火焰图 1、基本特征 &#xff08;1&#xff09;纵轴&#xff1a;即每一列代表一个调用栈&#xff0c;每一个格子代表一个函…

智能仓储变革在即,从业者该何去何从?

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。行业群 新书《智能物流系统构成与技术实践》 随着2024年的到来&#xff0c;物流和仓储行业正处于一个技术革命的关键时刻。人工智能&#xff08;AI&#xff09;的融入不仅预示…

【二叉树】Leetcode 437. 路径总和 III【中等】

路径总和 III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节…