入门AJAX——XMLHttpRequest(Post)

一、前言

在上篇文章中,我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法,并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章,强烈建议你在学习完上篇文章后再学习本篇文章:
🔗入门AJAX——XMLHttpRequest (Get)

本篇文章,我们将介绍 POST 请求,并练习一个简单的例子,同样的,我将提供远程接口,你可以直接调用,也可以跟着我搭建本地后端。

前置知识

在本篇文章学习之间,请确认你对以下概念已经具备了基础了解:

  • 网络请求: POST,请求头请求体。
  • 一些基础的 dom 操作
  • 对于代码具有封装的意识

完整代码在文末

二、本文任务

实现简单的删除功能:页面上设置两个按钮和一个搜索框;两个按钮分别用于获取列表和删除列表的元素。开始时,我们获取后端的全部列表信息,然后我们可以在输入框内输入想要删除的元素,点击删除按钮后向服务器发送 POST 请求删除元素(其实是将该元素过滤掉后返回)。页面布置如图:
在这里插入图片描述
我们将首先搭建本地的后端服务器,然后书写前端代码实现该逻辑。当然如果你选择使用我提供的远程接口,那么你可以跳过下一节的服务器接口搭建内容。

三、本地服务器接口

如果你没有看过上一篇的内容,再次建议你首先去学习上篇文章的知识:🔗入门AJAX——XMLHttpRequest (Get) 我们在这里直接贴代码:

// app.js
const express = require('express')
const cors = require('cors')
const app = express()app.use(cors())
app.use(express.json())app.post('/post/del', (req, res) => {const delChar = req.body?.delCharif (delChar) {res.send(arr.filter(item => item !== delChar))} else {res.send(arr)}
})app.listen(1234, () => {console.log('服务器运行在 http://localhost:1234')
})const arr = ['喜羊羊','美羊羊','懒羊羊','沸羊羊','暖洋洋','村长'
]

逻辑比较简单,主要是做了一个列表的过滤,我相信你一定看得懂。

三、前端设计

前端页面搭建更为简单,我们需要着重介绍的是 script 部分。依照上面的效果图,编写以下代码:

<button id="getBtn">获取数组</button>
<input type="text" >
<button id="delBtn">确认删除</button><div style="margin-top: 30px;">后端列表:</div>
<ul id = 'list-container'></ul>
<script>// js 代码
</script>

首先我们知道发起请求后我们会获取到一个列表,我们需要把列表的元素循环插入到 ul 中,我们先实现这样一个设置列表函数 setList 它将接受一个列表作为参数,我们将列表元素插入到 ul 中 :

function setList(list) {const container = document.getElementById('list-container')container.innerHTML = ''list.forEach(item => {const child = document.createElement('li')child.innerText = itemcontainer.appendChild(child)})
}

接下来我们给两个按钮绑定事件,每次点击都会向服务器发送请求:

// 如果你是用的是我提供的远程接口
// 请将 url 改为: http://39.105.227.198:1234/post/del
const url = 'http://localhost:9000/post/del'document.getElementById('getBtn').addEventListener('click', () => {postRequest(url, {}, setList)
})document.getElementById('delBtn').addEventListener('click', () => {const value = document.getElementsByTagName('input')[0].valuevalue && postRequest(url, {delChar: value}, setList)
})

他们两个按钮都会调用到一个 postRequest 的函数,只不过穿进去的第二个参数有所不同。第二个参数我们规定为负载,将最为请求体以 JSON 的格式传到接口,接口将根据该数据确定要删除(过滤)哪一个元素。而第一个按钮我们需要获取全部元素,故第二个参数为空对象。

现在让我们开始编写 postRequest 函数吧:

function postRequest(url, body, callback) {const xhr = new XMLHttpRequest()// 请求方法为 POST xhr.open('POST', url, true)// 通过请求头明确告知服务器本次请求携带的数据为 JSON 格式xhr.setRequestHeader('Content-Type', 'application/json')xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {// 服务器成功返回后,将返回的列表作为参数传递给回调函数,在这里也就是 setList 函数callback(JSON.parse(xhr.responseText))}}// 把将要被删除的数据转为 JSON 字符串作为请求体发送到服务器xhr.send(JSON.stringify(body))
}

四、效果

当我们刚进入页面时,页面上没有任何数据:
在这里插入图片描述
然后我们点击获取数组按钮,可以在下面看到后端返回的列表数据,同时浏览器发起了一次 POST请求(图片中的端口是 9000,不必在意,成功即可):

在这里插入图片描述
然后我们试着删除一个元素“沸羊羊”,我们需要在输入框内输入“沸羊羊”,然后点击确认删除,发现列表中对应的元素已经被删除,并且浏览器再次发送了一条 POST 请求,该请求携带了我们要删除的与与元素:
在这里插入图片描述

五、完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><button id="getBtn">获取数组</button><input type="text" ><button id="delBtn">确认删除</button><div style="margin-top: 30px;">后端列表:</div><ul id = 'list-container'></ul><script>// 如果你是用的是我提供的远程接口// 请将 url 改为: http://39.105.227.198:1234/post/delconst url = 'http://localhost:9000/post/del'function postRequest(url, body, callback) {const xhr = new XMLHttpRequest()xhr.open('POST', url, true)xhr.setRequestHeader('Content-Type', 'application/json')xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {callback(JSON.parse(xhr.responseText))}}xhr.send(JSON.stringify(body))}function setList(list) {const container = document.getElementById('list-container')container.innerHTML = ''list.forEach(item => {const child = document.createElement('li')child.innerText = itemcontainer.appendChild(child)})}document.getElementById('getBtn').addEventListener('click', () => {postRequest(url, {}, setList)})document.getElementById('delBtn').addEventListener('click', () => {const value = document.getElementsByTagName('input')[0].valuevalue && postRequest(url, {delChar: value}, setList)})</script>
</body>
</html>

六、写在后面

随着技术的不断发展,像 XMLHttpRequest 这类底层方法的直接使用率已逐渐降低,取而代之的是更高效简洁的 fetch API,以及更多封装完善的库(如 axios)。这些工具使用便捷、功能集成度高,既无需开发者反复编写冗余代码,也不必操心底层实现原理。

然而,XMLHttpRequest 的学习仍有其必要性。作为前端开发工程师,若仅停留在“调库”层面,核心竞争力将难以体现。理解底层原理(如 HTTP 请求生命周期、状态管理、异步机制等),能够帮助开发者更精准地定位问题、优化请求逻辑,甚至在面对复杂场景时自主实现定制化解决方案。毕竟,框架与库的本质是“工具”,而扎实的基础才是技术深度的核心体现。

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

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

相关文章

​BEV和OCC学习-3:mmdet3d 坐标系

目录 坐标系 转向角 (yaw) 的定义 框尺寸的定义 与支持的数据集的原始坐标系的关系 KITTI Waymo NuScenes Lyft ScanNet SUN RGB-D S3DIS 坐标系 坐标系 — MMDetection3D 1.4.0 文档https://mmdetection3d.readthedocs.io/zh-cn/latest/user_guides/coord_sys_tuto…

Redis高可用架构

概述 Redis作为常用的缓存中间件&#xff0c;因其高性能&#xff0c;丰富的数据结构&#xff0c;使用简单等&#xff0c;常被用在需要一定高性能的To C业务场景中&#xff0c;如「秒杀场景」「用户信息中心」「帖子」「群聊」等等大家常见的业务场景中&#xff0c;以提高服务的…

使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件

Nuget下载之后记得要先引用下面的 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" <!-- 鼠标事件 --> <i:EventTrigger EventName"MouseEnter"/> <!-- 鼠标进入 --> <i:EventTrigger EventName"MouseLeave"/&g…

敏捷开发中如何避免过度加班

在敏捷开发过程中避免过度加班&#xff0c;需要明确敏捷原则、合理规划迭代任务、加强团队沟通、优化流程效率、设定合理的工作负荷、注重团队士气和成员健康。明确敏捷原则&#xff0c;即保证可持续发展的步调&#xff0c;避免频繁地变更需求、过度承诺任务量。合理规划迭代任…

JSON解析崩溃原因及解决方案

问题记录&#xff1a; /************************************************| * 描述: 将ID124执行NFC操作-JSON解析为结构体* 函数名: cJSON_ID124_to_struct* 参数[ I]: *json_string 待解析的指针* 参数[II]: *wireless_rxd 结构体指针* 返回: 成功返回0 失…

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…

Edge(Bing)自动领积分脚本部署——基于python和Selenium(附源码)

微软的 Microsoft Rewards 计划可以通过 Bing 搜索赚取积分&#xff0c;积分可以兑换礼品卡、游戏等。每天的搜索任务不多&#xff0c;我们可以用脚本自动完成&#xff0c;提高效率&#xff0c;解放双手。 本文将手把手教你如何部署一个自动刷积分脚本&#xff0c;并解释其背…

前端基础之《Vue(19)—状态管理》

一、什么是状态管理 1、Vue版本问题 Vue2 Vuex3 Vue3 Vuex4 / Pinia2 在使用任何技术的时候&#xff0c;都先要去搜索一下版本&#xff0c;你的版本和脚手架环境是否兼容。 2、安装Vuex yarn add vuex3.6.2 3、状态管理 状态&#xff0c;在应用程序中表示数据&#xff0c…

【图像处理基石】如何进行图像畸变校正?

图像畸变校正常用于计算机视觉、摄影测量学和机器人导航等领域&#xff0c;能够修正因镜头光学特性或传感器排列问题导致的图像失真。下面我将介绍几种常用的图像畸变校正算法&#xff0c;并提供Python实现和测试用例。 常用算法及Python实现 1. 径向畸变校正 径向畸变是最常…

蓝桥杯_DS18B20温度传感器---新手入门级别超级详细解析

目录 一、引言 DS18B20的原理图 单总线简介&#xff1a; ​编辑暂存器简介&#xff1a; DS18B20的温度转换与读取流程 二、代码配置 maic文件 疑问 关于不同格式化输出符号的使用 为什么要rd_temperature()/16.0&#xff1f; onewire.h文件 这个配置为什么要先读lo…

MySQL的并发事务问题及事务隔离级别

一、并发事务问题 1). 赃读&#xff1a;一个事务读到另外一个事务还没有提交的数据。 比如 B 读取到了 A 未提交的数据。 2). 不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同&#xff0c;称之为不可重复读。 事务 A 两次读取同一条记录&…

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…

练习:对象数组 4

定义数组存储 4 个女朋友的对象。女朋友的属性&#xff1a;姓名、年龄、性别、爱好&#xff1b;要求1&#xff1a;计算出四个女朋友的平均年龄&#xff1b;要求2&#xff1a;统计年龄比平均值低的女朋友有几个&#xff1f;并把他们的所有信息打印出来。 代码&#xff1a; //对…

React Hooks 基础指南

React Hooks 是 React 16.8 引入的重要特性&#xff0c;它允许开发者在函数组件中使用状态和其他 React 特性。本文将详细介绍 6 个最常用的 React Hooks。 1. useState useState 是最常用的 Hook&#xff0c;用于在函数组件中添加 state。 import React, { useState } from…

【Python 算法零基础 4.排序 ⑥ 快速排序】

既有锦绣前程可奔赴&#xff0c;亦有往日岁月可回首 —— 25.5.25 选择排序回顾 ① 遍历数组&#xff1a;从索引 0 到 n-1&#xff08;n 为数组长度&#xff09;。 ② 每轮确定最小值&#xff1a;假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历&#xff0c;若找到…

处理git没做修改,但是文件显示变更的情况

使用 TortoiseGit&#xff08;小乌龟 Git&#xff09; 时遇到 “文件内容没改&#xff0c;但显示为变更&#xff0c;提示有 n 行删除、n 行添加”&#xff0c;你可以按照以下步骤操作来排查并解决问题&#xff1a; ✅ 一、定位问题根源&#xff08;是否为行尾差异&#xff09;…

智慧货运飞船多维度可视化管控系统

图扑搭建智慧货运飞船可视化系统&#xff0c;借数字孪生技术&#xff0c;高精度复刻货运飞船外观、结构与运行场景。整合多维度数据&#xff0c;实时呈现飞行状态、设备参数等信息&#xff0c;助力直观洞察货运飞船运行逻辑&#xff0c;为航天运维、任务推演及决策提供数字化支…

maven微服务${revision}依赖打包无法识别

1、场景描述 我现在又一个微服务项目&#xff0c;父pom的版本&#xff0c;使用<properties>定义好&#xff0c;如下所示&#xff1a; <name>ypsx-finance-center</name> <artifactId>ypsx-finance</artifactId> <packaging>pom</pack…

详解代理型RAG与MCP服务器集成

检索增强型生成(RAG)将语言模型与外部知识检索相结合,让模型的回答基于最新的事实,而不仅仅是其训练数据呢。 RAG(高级别) 在 RAG 流程中,用户查询用于搜索知识库(通常通过向量数据库中的嵌入来实现),并将检索到的最相关文档“增强”到模型的提示中,以帮助生成事实…

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…