Ajax 筆記(二)—— Ajax 案例

筆記目錄

  • 2. Ajax 綜合案例
    • 2.1 案例一-圖書管理
      • 2.1.1 渲染列表
      • 2.1.2 新增圖書
      • 2.1.3 刪除圖書
      • 2.1.4 編輯圖書
    • 2.2 案例二-背景圖的上傳和更換
      • 2.2.1 上傳
      • 2.2.2 更換
    • 2.3 案例三-個人信息設置
      • 2.3.1 信息渲染
      • 2.3.2 頭像修改
      • 2.2.3 信息修改
      • 2.3.4 提示框


Ajax 筆記:

Ajax 筆記(一)—— Ajax 入門

Ajax 筆記(二)—— Ajax 案例

Ajax 筆記(三)—— Ajax 原理

Ajax 筆記(四)—— Ajax 進階


Ajax 筆記接口文檔:https://apifox.com/apidoc/shared-fa9274ac-362e-4905-806b-6135df6aa90e/doc-842135


2. Ajax 綜合案例

2.1 案例一-圖書管理

2.1.1 渲染列表

獲取數據的時候,需要給自己起一個外號。由于都是上傳到同一服務器,為了區分不同同學的數據。

/*** 目標1:渲染圖書列表*  1.1 獲取數據*  1.2 渲染數據*/
const creator = '老張'
// 封裝-獲取并渲染圖書列表函數
function getBooksList() {// 1.1 獲取數據axios({url: 'http://hmajax.itheima.net/api/books',params: {// 外號:獲取對應數據creator}}).then(result => {// console.log(result)const bookList = result.data.data// console.log(bookList)// 1.2 渲染數據const htmlStr = bookList.map((item, index) => {return `<tr><td>${index + 1}</td><td>${item.bookname}</td><td>${item.author}</td><td>${item.publisher}</td><td data-id=${item.id}><span class="del">刪除</span><span class="edit">編輯</span></td></tr>`}).join('')// console.log(htmlStr)document.querySelector('.list').innerHTML = htmlStr})
}
// 網頁加載運行,獲取并渲染列表一次
getBooksList()

在這里插入圖片描述

2.1.2 新增圖書

/*** 目標2:新增圖書*  2.1 新增彈框->顯示和隱藏*  2.2 收集表單數據,并提交到服務器保存*  2.3 刷新圖書列表*/
// 2.1 創建彈框對象
const addModalDom = document.querySelector('.add-modal')
const addModal = new bootstrap.Modal(addModalDom)
// 保存按鈕->點擊->隱藏彈框
document.querySelector('.add-btn').addEventListener('click', () => {// 2.2 收集表單數據,并提交到服務器保存const addForm = document.querySelector('.add-form')const bookObj = serialize(addForm, { hash: true, empty: true })// console.log(bookObj)// 提交到服務器axios({url: 'http://hmajax.itheima.net/api/books',method: 'POST',data: {...bookObj,creator}}).then(result => {// console.log(result)// 2.3 添加成功后,重新請求并渲染圖書列表getBooksList()// 重置表單addForm.reset()// 隱藏彈框addModal.hide()})
})

在這里插入圖片描述

2.1.3 刪除圖書

/*** 目標3:刪除圖書*  3.1 刪除元素綁定點擊事件->獲取圖書id*  3.2 調用刪除接口*  3.3 刷新圖書列表*/
// 3.1 刪除元素->點擊(事件委托)
document.querySelector('.list').addEventListener('click', e => {// 獲取觸發事件目標元素// console.log(e.target)// 判斷點擊的是刪除元素if (e.target.classList.contains('del')) {// console.log('點擊刪除元素')// 獲取圖書id(自定義屬性id)const theId = e.target.parentNode.dataset.id// console.log(theId)// 3.2 調用刪除接口axios({url: `http://hmajax.itheima.net/api/books/${theId}`,method: 'DELETE'}).then(() => {// 3.3 刷新圖書列表getBooksList()})}
})

2.1.4 編輯圖書

/*** 目標4:編輯圖書*  4.1 編輯彈框->顯示和隱藏*  4.2 獲取當前編輯圖書數據->回顯到編輯表單中*  4.3 提交保存修改,并刷新列表*/
// 4.1 編輯彈框->顯示和隱藏
const editDom = document.querySelector('.edit-modal')
const editModal = new bootstrap.Modal(editDom)
// 編輯和刪除都是動態創建的元素,需要將事件委托給`.list`
// 編輯元素->點擊->彈框顯示
document.querySelector('.list').addEventListener('click', e => {// 判斷點擊的是否為編輯元素if (e.target.classList.contains('edit')) {// 4.2 獲取當前編輯圖書數據->回顯到編輯表單中const theId = e.target.parentNode.dataset.idaxios({url: `http://hmajax.itheima.net/api/books/${theId}`}).then(result => {const bookObj = result.data.data// document.querySelector('.edit-form .bookname').value = bookObj.bookname// document.querySelector('.edit-form .author').value = bookObj.author// 數據對象“屬性”和標簽“類名”一致// 遍歷數據對象,使用屬性去獲取對應的標簽,快速賦值const keys = Object.keys(bookObj) // ['id', 'bookname', 'author', 'publisher']keys.forEach(key => {document.querySelector(`.edit-form .${key}`).value = bookObj[key]})})editModal.show()}
})
// 修改按鈕->點擊->隱藏彈框
document.querySelector('.edit-btn').addEventListener('click', () => {// 4.3 提交保存修改,并刷新列表const editForm = document.querySelector('.edit-form')const { id, bookname, author, publisher } = serialize(editForm, { hash: true, empty: true})// 保存正在編輯的圖書id,隱藏起來:無需讓用戶修改// <input type="hidden" class="id" name="id" value="84783">axios({url: `http://hmajax.itheima.net/api/books/${id}`,method: 'PUT',data: {bookname,author,publisher,creator}}).then(() => {// 修改成功以后,重新獲取并刷新列表getBooksList()// 隱藏彈框editModal.hide()})
})

在這里插入圖片描述

2.2 案例二-背景圖的上傳和更換

2.2.1 上傳

先選擇的本地文件,接著提交到服務器保存,服務器會返回圖片的 url 網址,然后把網址加載到 img 標簽的 src 屬性中即可顯示。避免了瀏覽器保存是臨時性的問題。

圖片是文件,而不是以前的數字和字符串。所以傳遞文件一般需要放入 FormData 以鍵值對-文件流的數據傳遞

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>圖片上傳</title>
</head><body><!-- 文件選擇元素 --><input type="file" class="upload"><img src="" alt="" class="my-img"><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>/*** 目標:圖片上傳,顯示到網頁上*  1. 獲取圖片文件*  2. 使用 FormData 攜帶圖片文件*  3. 提交到服務器,獲取圖片url網址使用*/// 文件選擇元素->change改變事件document.querySelector('.upload').addEventListener('change', e => {// 1. 獲取圖片文件console.log(e.target.files[0])// 2. 使用 FormData 攜帶圖片文件const fd = new FormData()fd.append('img', e.target.files[0])// 3. 提交到服務器,獲取圖片url網址使用axios({url: 'http://hmajax.itheima.net/api/uploadimg',method: 'POST',data: fd}).then(result => {console.log(result)// 取出圖片url網址,用img標簽加載顯示const imgUrl = result.data.data.urldocument.querySelector('.my-img').src = imgUrl})})</script>
</body></html>

2.2.2 更換

/*** 目標:網站-更換背景*  1. 選擇圖片上傳,設置body背景*  2. 上傳成功時,"保存"圖片url網址*  3. 網頁運行后,"獲取"url網址使用* */
document.querySelector('.bg-ipt').addEventListener('change', e => {// 1. 選擇圖片上傳,設置body背景console.log(e.target.files[0])const fd = new FormData()fd.append('img', e.target.files[0])axios({url: 'http://hmajax.itheima.net/api/uploadimg',method: 'POST',data: fd}).then(result => {const imgUrl = result.data.data.urldocument.body.style.backgroundImage = `url(${imgUrl})`// 2. 上傳成功時,"保存"圖片url網址localStorage.setItem('bgImg', imgUrl)})
})// 3. 網頁運行后,"獲取"url網址使用
const bgUrl = localStorage.getItem('bgImg')
console.log(bgUrl)
bgUrl && (document.body.style.backgroundImage = `url(${bgUrl})`)

2.3 案例三-個人信息設置

2.3.1 信息渲染

/*** 目標1:信息渲染*  1.1 獲取用戶的數據*  1.2 回顯數據到標簽上* */
const creator = '播仔'
// 1.1 獲取用戶的數據
axios({url: 'http://hmajax.itheima.net/api/settings',params: {creator}
}).then(result => {const userObj = result.data.data// 1.2 回顯數據到標簽上Object.keys(userObj).forEach(key => {if (key === 'avatar') {// 賦予默認頭像document.querySelector('.prew').src = userObj[key]} else if (key === 'gender') {// 賦予默認性別// 獲取性別單選框:[男radio元素,女radio元素]const gRadioList = document.querySelectorAll('.gender')// 獲取性別數字:0男,1女const gNum = userObj[key]// 通過性別數字,作為下標,碰巧對應性別單選框元素的下標,設置選中狀態gRadioList[gNum].checked = true} else {// 賦予默認內容document.querySelector(`.${key}`).value = userObj[key]}})
})

在這里插入圖片描述

2.3.2 頭像修改

/*** 目標2:修改頭像*  2.1 獲取頭像文件*  2.2 提交服務器并更新頭像* */
// 文件選擇元素->change事件
document.querySelector('.upload').addEventListener('change', e => {// 2.1 獲取頭像文件console.log(e.target.files[0])const fd = new FormData()fd.append('avatar', e.target.files[0])fd.append('creator', creator)// 2.2 提交服務器并更新頭像axios({url: 'http://hmajax.itheima.net/api/avatar',method: 'PUT',data: fd}).then(result => {const imgUrl = result.data.data.avatar// 把新的頭像回顯到頁面上document.querySelector('.prew').src = imgUrl})
})

2.2.3 信息修改

/*** 目標3:提交表單*  3.1 收集表單信息*  3.2 提交到服務器保存*/
// 保存修改->點擊
document.querySelector('.submit').addEventListener('click', () => {// 3.1 收集表單信息const userForm = document.querySelector('.user-form')const userObj = serialize(userForm, { hash: true, empty: true })userObj.creator = creator// 性別數字字符串,轉成數字類型userObj.gender = +userObj.genderconsole.log(userObj)// 3.2 提交到服務器保存axios({url: 'http://hmajax.itheima.net/api/settings',method: 'PUT',data: userObj}).then(result => {})
})

在這里插入圖片描述

2.3.4 提示框

前置知識:bootstrap 的 toast 提示框:

  1. 先準備對應的標簽結構(模板里已有)

  2. 設置延遲自動消失的時間

<div class="toast" data-bs-delay="1500">提示框內容
</div>
  1. 使用 JS 的方式,在 axios 請求響應成功時,展示結果
 // 創建提示框對象const toastDom = document.querySelector('css選擇器')const toast = new bootstrap.Toast(toastDom)// 顯示提示框toast.show()

提示框代碼

/*** 目標3:提交表單*  3.1 收集表單信息*  3.2 提交到服務器保存*/
/*** 目標4:結果提示*  4.1 創建toast對象*  4.2 調用show方法->顯示提示框*/
// 保存修改->點擊
document.querySelector('.submit').addEventListener('click', () => {// 3.1 收集表單信息const userForm = document.querySelector('.user-form')const userObj = serialize(userForm, { hash: true, empty: true })userObj.creator = creator// 性別數字字符串,轉成數字類型userObj.gender = +userObj.genderconsole.log(userObj)// 3.2 提交到服務器保存axios({url: 'http://hmajax.itheima.net/api/settings',method: 'PUT',data: userObj}).then(result => {// 4.1 創建toast對象const toastDom = document.querySelector('.my-toast')const toast = new bootstrap.Toast(toastDom)// 4.2 調用show方法->顯示提示框toast.show()})
})

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React Native 列表組件基礎知識

ScrollView 組件 ScrollView組件是一個容器滾動組件&#xff0c;當容器超出指定寬高時就可以進行滾動交互。 ScrollView組件是一次性渲染所有的 React 子組件&#xff0c;這在性能上是比較差的&#xff0c;所以不建議當列表特別長的時候使用此組件。 接下來列舉幾個常用的一…

HTML(JavaEE初級系列12)

目錄 前言&#xff1a; 1.HTML結構 1.1認識HTML標簽 1.2HTML文件基本結構 1.3標簽層次結構 1.4快速生成代碼框架 2.HTML常見標簽 2.1注釋標簽 2.2標題標簽&#xff1a;h1-h6 2.3段落標簽&#xff1a;p 2.4換行標簽&#xff1a; br 2.5格式化標簽 2.6圖片標簽&#…

【數據結構?堆】經典問題:k路歸并

題目描述 k路歸并問題&#xff1a;   把k個有序表合并成一個有序表。&#xff08; k < 10^4 &#xff09; 輸入輸出格式 輸入格式&#xff1a; 輸入數據共有 2*k1 行。   第一行&#xff0c;一個整數k&#xff08; k < 10^4 &#xff09;&#xff0c;表示有k個有序…

【詳細教程】學會使用Python隧道代理

作為一名專業爬蟲程序猿&#xff0c;我深知在進行網絡數據采集時&#xff0c;可能會面臨網絡封鎖、隱私泄露等問題。今天&#xff0c;我將與大家分享如何學會使用Python隧道代理&#xff0c;幫助我們自由訪問受限網站&#xff0c;同時保護了解探索Python隧道代理&#xff01; …

3.1 Spring MVC概述

1. MVC概念 MVC是一種編程思想&#xff0c;它將應用分為模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三個層次&#xff0c;這三部分以最低的耦合進行協同工作&#xff0c;從而提高應用的可擴展性及可維護…

C++ opencv:視頻讀取、變換顏色風格、保存

1. 相關知識點 VideoCapture&#xff1b; applyColorMap&#xff1b; VideoWriter&#xff1b; 2. 代碼 編寫代碼main.cpp: #include<iostream> #include "opencv2/opencv.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgu…

解開謎團:為什么紅黑樹勝過AVL樹?

為什么紅黑樹勝過AVL樹 博主簡介一、引言1.1、紅黑樹和AVL樹簡介1.2、紅黑樹在某些方面優于AVL樹 二、紅黑樹和AVL樹的基本原理2.1、紅黑樹的定義和性質2.2、AVL樹的定義和性質2.3、對比兩種樹結構的特點 三、插入和刪除操作的復雜性比較3.1、紅黑樹的插入操作和平衡性維護3.2、…

冪次方(c++題解)

題目描述 任何一個正整數都可以用 22 的冪次方表示。例如 1372^72^32^0。 同時約定方次用括號來表示&#xff0c;即 a^b 可表示為 a(b)。 由此可知&#xff0c;137137 可表示為 2(7)2(3)2(0) 進一步&#xff1a; 7 2^222^0 ( 2^121 用 2 表示)&#xff0c;并且 322^0。 所…

Spring Boot 重啟命令

Spring Boot 重啟命令 本文描述了一個重啟Spring Boot命令執行過程和示例 本文利用kill -9 關閉進程&#xff0c;不優雅&#xff0c;會突然中斷程序&#xff0c;可能導致數據和邏輯異常 搜索微信小程序【亞特技術】在資源中搜索【優雅】可得到Spring Boot如何優化重啟 1. 過…

【Bert101】變壓器模型背后的復雜數學【02/4】

一、說明 眾所周知&#xff0c;變壓器架構是自然語言處理&#xff08;NLP&#xff09;領域的突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;無法捕獲文本中的長期依賴性的局限性。變壓器架構被證明是革命性架構&#xff08;如 BERT、GPT 和 T5 及其變體&…

【陣列信號處理】空間匹配濾波器、錐形/非錐形最佳波束成形器、樣本矩陣反演 (SMI) 研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

九耶丨閣瑞鈦倫特-產品經理面試題

在產品上線后&#xff0c;會著重觀察6類指標&#xff1a; 1、活躍用戶指標 衡量APP用戶規模的指標&#xff0c;一個產品是否成功&#xff0c;如果只看一個指標&#xff0c;那么這個指標一定是活躍用戶數。 日活(DAU)&#xff1a;一天內日均活躍設備數(去重&#xff0c;每個公…

關于使用pycharm遇到只能使用unittest方式運行,無法直接選擇Run

相信大家可能都遇到過這個問題&#xff0c;使用pycharm直接運行腳本的時候&#xff0c;只能選擇unittest的方式&#xff0c;能愁死個人 經過幾次各種嘗試無果之后&#xff0c;博主就放棄死磕了&#xff0c;原諒博主是個菜鳥 后來遇到這樣的問題&#xff0c;往往也就直接使用cm…

Python爬蟲-抓取的目標數據為#x開頭,怎么解決?

前言 本文是該專欄的第4篇,后面會持續分享python爬蟲案例干貨,記得關注。 在做爬蟲項目的時候,有時候抓取的平臺目標數據為&#x開頭,如下圖所示: 瀏覽器顯示的正常數據,但通過爬蟲協議獲取到的網頁源碼數據卻是以&#x開頭的隱藏數據,遇到這種情況,爬蟲需要怎么處…

【Linux從入門到精通】文件I/O操作(C語言vs系統調用)

文章目錄 一、C語言的文件IO相關函數操作 1、1 fopen與fclose 1、2 fwrite 1、3 fprintf與fscanf 1、4 fgets與fputs 二、系統調用相關接口 2、1 open與close 2、2 write和read 三、簡易模擬實現cat指令 四、總結 &#x1f64b;?♂? 作者&#xff1a;Ggggggtm &#x1f64b;?…

Golang bitset 基本使用

安裝&#xff1a; go get github.com/bits-and-blooms/bitset下面代碼把fmtx換成fmt就行 //------------基本操作------------//構建一個64bit長度的bitsetb : bitset.New(64)//放入一個數b.Set(10)fmtx.Println("add-10&#xff1a;", b.DumpAsBits()) // 0000000…

針對英特爾酷睿 CPU 優化,Canonical 發布 Ubuntu 實時內核

導讀Canonical 今天宣布針對支持時序協調運算&#xff08;TCC&#xff09;和時間敏感網絡&#xff08;IEEE TSN&#xff09;的英特爾酷睿處理器&#xff0c;推出優化版實時 Ubuntu 內核。 Canonical 于今年 2 月宣布&#xff0c;為購買 Ubuntu Pro 訂閱&#xff0c;使用代號為 …

OPENCV C++(七)霍夫線檢測+找出輪廓和外接矩形+改進旋轉

霍夫線檢測 vector<Vec2f> lines1;HoughLines(canny_mat, lines1, 1, CV_PI / 180.0,90 );//45可以檢測里面兩條線 80檢測出外邊兩條線 定義存放輸出線的向量 此向量輸出有<距離&#xff0c;角度> 因為檢測的原理就是在變換霍夫空間里面去檢測的&#xff0c;這里可…

ESP8266(RTOS SDK)內嵌網頁以實現WEB配網以及數據交互

【本文發布于https://blog.csdn.net/Stack_/article/details/131997098&#xff0c;未經允許不得轉載&#xff0c;轉載須注明出處】 1、執行make menuconfig&#xff0c;將http頭由512改為更大的值&#xff0c;否則用電腦瀏覽器訪問正常&#xff0c;但用手機瀏覽器訪問會因為ht…

基于weka手工實現K-means

一、K-means聚類算法 K均值聚類&#xff08;K-means clustering&#xff09;是一種常見的無監督學習算法&#xff0c;用于將數據集中的樣本劃分為K個不同的類別或簇。它通過最小化樣本點與所屬簇中心點之間的距離來確定最佳的簇劃分。 K均值聚類的基本思想如下&#xff1a; …