AJAX---個人信息案例

来源:https://www.cnblogs.com/Ayako/archive/2022/11/17/16900651.html
-Advertisement-
Play Games

案例分析: 如圖所示,頁面載入時有數據回填,同時實現select表單同步和圖片上傳,保存後上傳至伺服器等功能 HTML模板: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA ...


案例分析:

如圖所示,頁面載入時有數據回填,同時實現select表單同步和圖片上傳,保存後上傳至伺服器等功能

HTML模板:


<!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>08.案例_個人信息修改</title>
  <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/css/bootstrap.min.css" />
  <style>
    .form-select {
      width: 103px;
      display: inline-block;
    }

    .col-form-label {
      text-align: right;
    }

    .figure-img {
      width: 100px;
      height: 100px;
      cursor: pointer;
    }

    #upload {
      display: none;
    }
  </style>
</head>

<body>
  <div class="container">
    <h1 class="p-5">個人設置</h1>
    <form class="col-6">
      <div class="row mb-3">
        <label class="col-form-label col-3">昵稱:</label>
        <div class="col-9">
          <input class="form-control col-9" type="text" name="nickname" />
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-form-label col-3">籍貫:</label>
        <div class="col-9">
          <select class="form-select col-4" name="province">
            <option value="">--省--</option>
          </select>
          <select class="form-select col-4" name="city">
            <option value="">--市--</option>
          </select>
          <select class="form-select col-4" name="area">
            <option value="">--區--</option>
          </select>
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-form-label col-3">頭像:</label>
        <div class="col-9">
          <input class="form-control col-9" type="hidden" name="avatar" />
          <figure class="figure">
            <input type="file" id="upload" />
            <img src="https://yanxuan-item.nosdn.127.net/12a882699bd531a1bd428bffe1989525.jpg"
              class="figure-img img-fluid rounded" alt="..." />
            <figcaption class="figure-caption">修改頭像</figcaption>
          </figure>
        </div>
      </div>
      <div class="row mb-3">
        <label class="col-3"></label>
        <div class="col-9">
          <button class="btn btn-primary">保存</button>
        </div>
      </div>
    </form>
  </div>

  <script src="https://unpkg.com/[email protected]/dist/js/bootstrap.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
  <script src="./lib/form-serialize.js"></script>
 
</body>

</html>

一.頁面回填

通過獲取內置個人信息進行頁面回填

<script>
    // 首碼基地址
    axios.defaults.baseURL = 'http://ajax-api.itheima.net/'
    // 獲取標簽方法$
    function $(id) {
        return document.querySelector('#' + id)
    }
    // 數據回填方法
    async function getInfo() {
        const res = await axios.get('api/settings')
        const { nickname, province, city, area, avatar } = res.data.data
        // 昵稱
        $('nickname').value = nickname
        // 頭像地址
        $('avatar').src = avatar
        // 給頭像框input進行賦值,方便後期拿取數據
        $('avatarInp').value = avatar
        // 省數據
        const provinceAll = await axios.get('api/province')
        $('province').innerHTML += provinceAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('province').value = province
        // 市數據
        const cityAll = await axios.get('api/city?pname=' + province)
        $('city').innerHTML += cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('city').value = city
        // 區數據
        const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`)
        $('area').innerHTML += areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        $('area').value = area

    }
    // 調用回填方法
    getInfo()
</script>

二.省市區下拉框的聯動

<script>
    // 省數據下拉框
    $('province').addEventListener('change', async () => {
        // 獲取省下市數據
        const cityAll = await axios.get('api/city?pname=' + $('province').value)
        // 渲染市數據
        $('city').innerHTML = cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        // 獲取市下區數據
        const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
        // 渲染區數據
        $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })

    $('city').addEventListener('change', async () => {
        const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
        $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
    })
</script>

三.頭像圖片上傳功能

<script>
    // 圖片上傳功能
    $('upload').addEventListener('change', (e) => {
        // 非空判斷
        if (e.target.files.length === 0) {
            return
        }
        // 創建FormData接收
        const fd = new FormData()
        // 將圖片數據添加到fd中
        fd.append('avatar', e.target.files[0])
        // 圖片上傳介面
        axios.post('api/file', fd).then(res => {
            console.log(res);
            $('avatar').src = res.data.data.url
            //  給頭像框input進行賦值,方便拿取數據
            $('avatarInp').value = res.data.data.url
        })
    })
    // 圖片點擊事件
    $('avatar').addEventListener('click', () => {
        // 優化圖片上傳功能
        $('upload').click()
    })      
</script>

四.將數據上傳至伺服器保存

<script>
    // 上傳點擊事件
    $('uploadAll').addEventListener('click', async (e) => {
        // 取消預設刷新操作
        e.preventDefault()
        // 用serialize獲取表單中所有內容(前面給頭像框input賦值的應用)
        const userFormall = serialize($('userForm'), { hash: true })
        try {
            // 執行成功,上傳數據並彈出ok彈框
            await axios.put('api/settings', userFormall)
            alert('ok')
        } catch (error) {
            alert('error')
        }
    })
</script>

五.個人經驗

①省市區下拉框聯動時,操作省數據聯動市數據時,仍需對區數據進行聯動

②給圖片input框的value賦值,方便最後上傳伺服器時用serialize獲取數據

③附完整源碼

<!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>08.案例_個人信息修改</title>
    <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/css/bootstrap.min.css" />
    <style>
        .form-select {
            width: 103px;
            display: inline-block;
        }

        .col-form-label {
            text-align: right;
        }

        .figure-img {
            width: 100px;
            height: 100px;
            cursor: pointer;
        }

        #upload {
            display: none;
        }
    </style>
</head>

<body>
    <div class="container">
        <h1 class="p-5">個人設置</h1>
        <form class="col-6" id="userForm">
            <div class="row mb-3">
                <label class="col-form-label col-3">昵稱:</label>
                <div class="col-9">
                    <input class="form-control col-9" type="text" name="nickname" id="nickname" />
                </div>
            </div>
            <div class="row mb-3">
                <label class="col-form-label col-3">籍貫:</label>
                <div class="col-9">
                    <select class="form-select col-4" name="province" id="province">
                        <option value="">--省--</option>
                    </select>
                    <select class="form-select col-4" name="city" id="city">
                        <option value="">--市--</option>
                    </select>
                    <select class="form-select col-4" name="area" id="area">
                        <option value="">--區--</option>
                    </select>
                </div>
            </div>
            <div class="row mb-3">
                <label class="col-form-label col-3">頭像:</label>
                <div class="col-9">
                    <input class="form-control col-9" type="hidden" name="avatar" id="avatarInp" />
                    <figure class="figure">
                        <input type="file" id="upload" />
                        <img src="https://yanxuan-item.nosdn.127.net/12a882699bd531a1bd428bffe1989525.jpg"
                            class="figure-img img-fluid rounded" alt="..." id="avatar" />
                        <figcaption class="figure-caption" id="load">修改頭像</figcaption>
                    </figure>
                </div>
            </div>
            <div class="row mb-3">
                <label class="col-3"></label>
                <div class="col-9">
                    <button class="btn btn-primary"   id="uploadAll">保存</button>
                </div>
            </div>
        </form>
    </div>

    <script src="https://unpkg.com/[email protected]/dist/js/bootstrap.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
    <script src="./lib/form-serialize.js"></script>
    <script>
        // 首碼基地址
        axios.defaults.baseURL = 'http://ajax-api.itheima.net/'
        // 獲取標簽方法$
        function $(id) {
            return document.querySelector('#' + id)
        }
        // 數據回填方法
        async function getInfo() {
            const res = await axios.get('api/settings')
            const { nickname, province, city, area, avatar } = res.data.data
            // 昵稱
            $('nickname').value = nickname
            // 頭像地址
            $('avatar').src = avatar
            // 給頭像框input進行賦值,方便後期拿取數據
            $('avatarInp').value = avatar
            // 省數據
            const provinceAll = await axios.get('api/province')
            $('province').innerHTML += provinceAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('province').value = province
            // 市數據
            const cityAll = await axios.get('api/city?pname=' + province)
            $('city').innerHTML += cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('city').value = city
            // 區數據
            const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`)
            $('area').innerHTML += areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            $('area').value = area

        }
        // 調用回填方法
        getInfo()

        // 省數據下拉框
        $('province').addEventListener('change', async () => {
            // 獲取省下市數據
            const cityAll = await axios.get('api/city?pname=' + $('province').value)
            // 渲染市數據
            $('city').innerHTML = cityAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
            // 獲取市下區數據
            const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
            // 渲染區數據
            $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        })

        $('city').addEventListener('change', async () => {
            const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`)
            $('area').innerHTML = areaAll.data.data.map(item => `<option value="${item}">${item}</option>`).join('')
        })

        // 圖片上傳功能
        $('upload').addEventListener('change',(e)=>{
            // 非空判斷
            if(e.target.files.length===0){
                return
            }
            // 創建FormData接收
            const fd = new FormData()
            // 將圖片數據添加到fd中
            fd.append('avatar', e.target.files[0])
            // 圖片上傳介面
            axios.post('api/file',fd).then(res=>{
                console.log(res);
                $('avatar').src = res.data.data.url
                //  給頭像框input進行賦值,方便拿取數據
                $('avatarInp').value = res.data.data.url
            })
        })
        // 圖片點擊事件
        $('avatar').addEventListener('click',()=>{
            // 優化圖片上傳功能
            $('upload').click()
        })
      
        // 上傳點擊事件
        $('uploadAll').addEventListener('click', async (e)=>{
            // 取消預設刷新操作
            e.preventDefault()
            // 用serialize獲取表單中所有內容(前面給頭像框input賦值的應用)
            const userFormall = serialize($('userForm'),{hash:true})
            try {
                // 執行成功,上傳數據並彈出ok彈框
                await axios.put('api/settings',userFormall)
                alert('ok')
            } catch (error) {
                alert('error')
            }
        })
    </script>
</body>

</html>

本文來自博客園,作者:三井綾子,轉載請註明原文鏈接:https://www.cnblogs.com/Ayako/p/16900651.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 演算法複雜度 演算法複雜度分為時間複雜度和空間複雜度。時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。 演算法的複雜性體運行該演算法時的電腦所需資源的多少,電腦資源最重要的是時間和空間(即寄存器)資源,因此複雜度分為時間和空間複雜度。 二 時間複雜度 2.1 ...
  • 摘要 在Prism中彈出一個對話框,預設是一個Windows預設樣式的視窗,會與自己所開發的項目完全不搭配,例如下麵這樣子 如果為了迎合軟體主體風格,可以做出類似這樣效果 其實原理也很簡單,Prism也考慮到了這一點,所以特意設計一個供用戶自定義的介面 編寫組件樣式 1、新建一個Window視圖 註 ...
  • 大家都用過Linux中的應用程式安裝工具,如yum、apt、rpm等工具進行安裝自己想要的一些工具或則軟體之類的,當然Linux操作系統還是很強大的有很多類似的命令來安裝我們所需要的程式,但是windwos有沒有類似於windows這樣的應用安裝程式呢?想必大家看標題就能看的出來肯定是有的,那就是微 ...
  • //源文件 void ADCPhyConfig() { RCC->APB2ENR |=1 <<8; //使能 ADC1 時鐘 RCC->AHB1ENR |=1 <<0; //使能 PORTA 時鐘 //PA5 輸入模式、下拉、高速 GPIOA->MODER |= (3<<5*2); //輸入模式 G ...
  • 1.打開手機,開發者選項,開啟usb調試 , 無線調試,查看手機ip 2.cmd 測試是否能ping通手機 > ping 192.168.0.102正在 Ping 192.168.0.102 具有 32 位元組的數據:來自 192.168.0.102 的回覆: 位元組=32 時間=283ms TTL=6 ...
  • UTF-8編碼的漢字:少數是漢字每個占用3個位元組,多數占用4個位元組 # GET請求編碼 Chrome會先把URL中非ASCII字元按照某種編碼格式(谷歌瀏覽器是UTF-8)編碼成byte數組後,然後轉成16進位數組,然後在每個16進位數字前加上&分割 eg: 地址欄:http://localhost ...
  • 好家伙, 頂不住了,太多的bug, 本來是想把背景用canvas做成動態的,但是,出現了各種問題 為了不耽誤進度,我們先把一個簡單的登錄註冊界面做出來 來看看效果: (看上去還不錯) 本界面使用Vue2(新建項目的時候記得把less勾上,項目里有用到) 1.項目目錄: 2.MyLogin.vue組件 ...
  • 以谷歌內核的瀏覽器擴展,包括 edge chrome ,還有我們常用的國產瀏覽器都能使用 瀏覽器擴展是一種軟體,以增強Chrome內核瀏覽器的功能。瀏覽器擴展使用HTML、JavaScript、CSS和圖片等Web技術開發。 瀏覽器擴展與瀏覽器插件不同。瀏覽器擴展無需瞭解瀏覽器的源代碼,而瀏覽器插件 ...
一周排行
    -Advertisement-
    Play Games
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...