入门AJAX——XMLHttpRequest(Post)

news2025/6/7 16:52:52

一、前言

在上篇文章中,我们已经介绍了 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?.delChar
  if (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 = item
    container.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].value
  value && 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/del
    const 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 = item
        container.appendChild(child)
      })
    }

    document.getElementById('getBtn').addEventListener('click', () => {
      postRequest(url, {}, setList)
    })

    document.getElementById('delBtn').addEventListener('click', () => {
      const value = document.getElementsByTagName('input')[0].value
      value && postRequest(url, {delChar: value}, setList)
    })

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

六、写在后面

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

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

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

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

相关文章

Qt(part1)Qpushbutton,信号与槽,对象树,自定义信号与槽,lamda表达式。

1、创建Qt程序 2、命名规范及快捷键 3、Qpushbutton按钮创建 4、对象树概念 5、信号与槽 6、自定义信号与槽 7、当自定义信号和槽发生重载时 8、信号可以连接信号&#xff0c;信号也可以断开。 9、lamda表达式

西北某省级联通公司:3D动环模块如何实现机房“一屏统管”?

一、运营商机房监控痛点凸显 在通信行业快速发展的当下&#xff0c;西北某省级联通公司肩负着保障区域通信畅通的重任。然而&#xff0c;公司分布广泛的机房面临着诸多监控难题&#xff0c;尤其是偏远机房环境风险无法实时感知这一痛点&#xff0c;严重影响了机房的稳定运行和通…

视觉分析在人员行为属性检测中的应用

基于视觉分析的人员行为属性检测方案 一、背景与需求分析 在工业生产、建筑施工、公共安全等领域&#xff0c;人员行为属性的合规性检测是保障安全生产的关键环节。例如&#xff0c;工地工人未佩戴安全帽、厨房人员未佩戴手套、作业现场人员使用手机等行为&#xff0c;均可能…

电子行业AI赋能软件开发经典案例——某金融软件公司

01.案例标题 金融行业某金融软件公司通过StarShip CodeSouler达成效率突破性增长&#xff0c;零流程侵入验证AI代码高度可行性 02.执行摘要 某金融软件公司在核心产品研发中引入开放传神&#xff08;OpenCSG&#xff09;的StarShip CodeSouler AI代码生成平台&#xff0c;在无…

摆脱硬件依赖:SkyEye在轨道交通中的仿真应用

在城市轨道交通系统中&#xff0c;信号系统承担着确保列车安全、高效运行的关键任务。从排列进路、信号开放&#xff0c;到终点折返与接发车&#xff0c;几乎每一个调度动作背后都依赖于信号系统的精密控制与实时响应。作为信号系统的重要组成部分&#xff0c;目标控制器&#…

使用变异系数增强 CFD 收敛标准

将描述性统计整合到 CFD 中&#xff0c;以评估可变性和收敛性。 挑战 在工程设计中&#xff0c;尤其是在进行仿真时&#xff0c;我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块

物联网通信技术全景指南&#xff08;2025&#xff09;之 如何挑选合适的物联网模块 物联网通信技术全景指南&#xff08;2025&#xff09;一、技术代际演进与退网背景二、5G 物联网技术体系&#xff08;Sub-6 GHz 核心&#xff09;1. 技术分层架构2. 蜂窝技术性能矩阵3. Sub-6 …

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…

Day46 Python打卡训练营

知识点回顾&#xff1a; 1. 不同CNN层的特征图&#xff1a;不同通道的特征图 2. 什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。 3. 通道注意力&#xff1a;模型的定义和插入的位置 4. 通道注意力后…

linux安全加固(非常详细)

安全加固方案原则 1.版本升级 对于系统和应用在使用过程中暴露的安全缺陷&#xff0c;系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本&#xff0c;可有效解决旧版本存在的安全风险。2.关闭端口服务 在不影响业务系统正常运行情况下&#xff0c;停止或禁用承…

动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;12.7. 参数服务器…

告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力

在现代科研的战场上&#xff0c;数据堪称科研人员手中的“弹药”。然而&#xff0c;许多实验室却深陷数据管理的泥沼&#xff1a;硬盘里堆满了不同年份的实验记录&#xff0c;U盘里塞着各种格式的谱图&#xff0c;Excel表格里还留着手动计算的痕迹……&#xff0c;当科研人员想…

智绅科技 —— 智慧养老 + 数字健康,构筑银发时代安全防护网

在老龄化率突破 21.3% 的当下&#xff0c;智绅科技以 "科技适老" 为核心理念&#xff0c;构建 "监测 - 预警 - 干预 - 照护" 的智慧养老闭环。 其自主研发的七彩喜智慧康养平台&#xff0c;通过物联网、AI 和边缘计算技术&#xff0c;实现对老年人健康与安…

Code Composer Studio CCS 工程设置,如何设置h文件查找路径?

右键工程,选Properties,在Build>MSP430 Compiler>Optinizution Include Options 设置头文件的搜索路径。 比如我设置了这些: ${CCS_BASE_ROOT}/msp430/include ${PROJECT_ROOT} ${CG_TOOL_ROOT}/include "${workspace_loc:/${ProjName}/F5xx_F6xx_Core_Lib}&quo…

Qt生成日志与以及捕获崩溃文件(mingw64位,winDbg)————附带详细解说

文章目录 Qt生成日志与以及报错文件(mingw64位&#xff0c;winDbg)0 背景与结果0.1 背景0.2 结果1 WinDbg1.1 安装1.2 使用 2 编写代码2.1 ccrashstack类2.2 编写输出捕获异常的dmp文件2.2 编写输出日志文件2.3 调用生成日志和dmp文件 参考 Qt生成日志与以及报错文件(mingw64位…

智能手表健康监测系统的PSRAM存储芯片CSS6404LS-LI—高带宽、耐高温、微尺寸的三重突破

一、直击智能手表三大核心痛点 痛点场景风险传统方案缺陷连续生物数据流存储100Hz PPG信号产生82MB/s数据洪峰SPI NOR Flash带宽不足(≤50MB/s)高温环境稳定性腕表表面温度达50℃&#xff08;烈日/运动场景&#xff09;商用级存储器件(85℃)易触发数据错误极限空间约束PCB面积…

蓝桥杯国赛题2022

首先这个题应该是一个01背包&#xff0c;背包容量为2022&#xff0c;有2022个物品&#xff0c;第i个物品的体积为i&#xff0c;只不过这里有两个限制条件&#xff0c;一个限制条件是和为2022&#xff0c;另一个限制条件为10个数&#xff0c;两个限制条件那就把加一维&#xff0…

关于如何使用VScode编译下载keil工程的步骤演示

1、vscode的插件市场下载keil Assistant 2 、点设置 3、复制keil的地址 4、粘贴到第…

Redis底层数据结构之深入理解跳表(2)

上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作&#xff0c;这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中&#xff0c;除了网络IO部分和大文件的后台复制涉及到多线程外&#xff0c;其余任务执行时全部都是单线程&#xff0c;这也就意味着在Redis…

[蓝桥杯]兰顿蚂蚁

兰顿蚂蚁 题目描述 兰顿蚂蚁&#xff0c;是于 1986 年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为&#xff1a;上下左右其中一方。 蚂蚁的移…