入門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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83986.shtml
英文地址,請注明出處:http://en.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;數字孿生平臺正模擬次日峰值流量壓力…