JavaScript之Ajax-axios表单提交

news2025/1/21 5:46:25

目录

一.表单概念

二.表单提交

三.FormData语法

四.头像上传模板

五.请求体类型

六.图书管理(增删改查) 

七.axios语法优化写法 

优化1: axios全局配置

优化2: 默认的method

优化3: axios的快捷方法


一.表单概念

form标签(表单)是用来收集用户输入的信息

一个完整的表单的组成

1.表单标签: form

2.表单域: input, checkbox, select ...

3.表单按钮<button type="submit"></button>

<form>
 <input type="text" name="email_or_mobile"/>
    <input type="password" name="password" />
    <input type="checkbox" name="remember_me" checked />
    <button type="submit">登录</button>
</form>

 

 

 二.表单提交

<!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>05.案例_表单提交</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
    <style>
        html,
        body {
            background-color: #f8f8f8;
        }

        .login-box {
            width: 400px;
            position: fixed;
            top: 20%;
            left: 50%;
            transform: translateX(-50%);
            border: 1px solid #efefef;
            padding: 20px;
            border-radius: 4px;
            box-shadow: 1px 1px 5px #cfcfcf;
            background-color: #fff;
            transition: box-shadow 0.3s ease;
        }

        .login-box:hover {
            transition: box-shadow 0.3s ease;
            box-shadow: 1px 1px 20px #cfcfcf;
        }
    </style>
</head>

<body>
    <div class="login-box">
        <form id="myForm">
            <div class="form-group">
                <label for="username">Account</label>
                <!-- 账号 -->
                <input type="text" class="form-control" name="username" id="username" autocomplete="off">
                <small id="emailHelp" class="form-text text-muted">The available account is
                    <strong>admin</strong></small>
            </div>
            <div class="form-group">
                <!-- 密码 -->
                <label for="password">Password</label>
                <input type="password" class="form-control" name="password" id="password">
                <small id="emailHelp" class="form-text text-muted">The available password is
                    <strong>123456</strong></small>
            </div>
            <button type="submit" class="btn btn-primary" id="btnLogin">Submit</button>
        </form>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
    <script src="./lib/form-serialize.js"></script>
    <script>
        
    </script>
</body>

</html>

实现点击登录按钮, 调用登录接口, 返回结果用alert提示

// 目标: 用整体获取插件, 完成登录的表单提交效果
// 请求地址: http://ajax-api.itheima.net/api/login
// 请求方式: POST
// 参数: { username: 用户名, password:密码 }

// 1. 提交按钮, 点击事件
document.querySelector('#btnLogin').addEventListener('click', e => {
    e.preventDefault()

    // 2. 整体获取登录表单参数名和值对象
    let formObj = serialize(document.querySelector('#myForm'), { hash: true })

    // 3. 使用axios发送请求,之后根据响应结果,做提示
    axios({
        url: 'http://ajax-api.itheima.net/api/login',
        method: 'POST', 
        data: formObj
    }).then(({ data: res }) => {
        alert(res.message)
    }).catch(err => {
        alert('登录失败');
    })
})

 三.FormData语法

概念:以键值对形式存放数据的容器, 常用于装载文件对象

FormData的正确使用方法:实例化一个对象,用它的append方法加入参数名和值

语法格式:

// 1. 创建一个FormData对象
let fd = new FormData()
// 2. 向对象中添加 数据
//    FormData.append(属性名, 属性值)
// 示例:
fd.append('name', '小马');

四.头像上传模板

使用formData来实现头像上传并回显 ,掌握按钮关联隐藏文件选择器能力

先给出静态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>案例_头像上传</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
    <style>
        .thumb-box {
            text-align: center;
            margin-top: 50px;
        }

        .thumb {
            width: 250px;
            height: 250px;
            object-fit: cover;
            border-radius: 50%;
            border: 5px solid black !important;
        }
    </style>
</head>

<body>
    <div class="thumb-box">
        <!-- 头像 -->
        <img class="img-thumbnail thumb" src="./lib/images/cover.jpg">
        <div class="mt-2">
            <input type="file" id="iptFile" accept="image/*">
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
    <script>
        
    </script>
</body>

</html>

核心javascript代码:

let iptFile = document.querySelector('#iptFile')
let img = document.querySelector('.thumb')

// 检测文件选择器值变化
iptFile.addEventListener('change', (e) => {

    // 当选择了文件, 再执行里面代码
    if (e.target.files.length === 0) 
      return
    
    // 因为要携带文件, 所以使用FormData实例装载
    let fd = new FormData()
    // avatar这个名字是接口文档约定的
    fd.append('avatar', e.target.files[0])

    // axios发请求
    axios({
        url: 'http://ajax-api.itheima.net/api/file',
        method: 'post',
        data: fd
    }).then(({ data: res }) => {
        // 6. 成功后, 服务器返回图片地址铺设到img标签回显
        img.src = res.data.url
    })
})

完成效果图示例:

五.请求体类型

请求体分为3种常用类型和场景

请求头中的Content-Type字段,用来标记请求体内容的类型

axios自动根据data值的类型, 帮我们自动设置的

3种Content-Type

六.图书管理(增删改查) 

静态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>图书管理</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
    <style>
        :root {
            font-size: 15px;
        }

        body {
            padding-top: 15px;
        }
    </style>
</head>

<body>
    <!-- 栅格系统 -->
    <div class="container">
        <div class="d-flex justify-content-between align-items-center">
            <h1>图书管理</h1>
            <button class="btn btn-success btn-sm" data-bs-toggle="modal" data-bs-target="#addModal" id="myAddBtn">添加</button>
        </div>
        <table class="table table-bordered table-striped table-dark table-hover text-center">
            <thead>
                <!-- 表头行 -->
                <tr>
                    <th scope="col">Id</th>
                    <th scope="col">书名</th>
                    <th scope="col">作者</th>
                    <th scope="col">出版社</th>
                    <th scope="col">操作</th>
                </tr>
            </thead>
            <tbody>
                <!-- 表格中的每一行 -->
                <tr>
                    <th scope="row">xxx</th>
                    <td>xxx</td>
                    <td>xxx</td>
                    <td>xxx</td>
                    <td>
                        <button type="button" class="btn btn-link btn-sm btn-delete">删除</button>
                        <button type="button" class="btn btn-link btn-sm btn-update">编辑</button>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <!-- add Modal -->
    <div class="modal fade" id="addModal">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">添加图书</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <form id="addForm" class="p-3">
                        <!-- 书名 -->
                        <div class="mb-3">
                            <label class="form-label">书名</label>
                            <input type="text" name="bookname" class="form-control" placeholder="请输入图书名称"
                                name="bookname" />
                        </div>
                        <!-- 作者 -->
                        <div class="mb-3">
                            <label class="form-label">作者</label>
                            <input type="text" name="author" class="form-control" placeholder="请输入作者名字" name="author" />
                        </div>
                        <!-- 出版社 -->
                        <div class="mb-3">
                            <label class="form-label">出版社</label>
                            <input type="text" name="publisher" class="form-control" placeholder="请输入出版社名称"
                                name="publisher" />
                        </div>
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
                    <button type="button" class="btn btn-primary" id="addBtn">确认</button>
                </div>
            </div>
        </div>
    </div>
    <!-- edit Modal -->
    <div class="modal fade" id="editModal">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">编辑图书</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <form id="editForm" class="p-3">
                        <input type="hidden" name="id" />
                        <!-- 书名 -->
                        <div class="mb-3">
                            <label class="form-label">书名</label>
                            <input type="text" name="bookname" class="form-control" placeholder="请输入图书名称"
                                name="bookname" />
                        </div>
                        <!-- 作者 -->
                        <div class="mb-3">
                            <label class="form-label">作者</label>
                            <input type="text" name="author" class="form-control" placeholder="请输入作者名字" name="author" />
                        </div>
                        <!-- 出版社 -->
                        <div class="mb-3">
                            <label class="form-label">出版社</label>
                            <input type="text" name="publisher" class="form-control" placeholder="请输入出版社名称"
                                name="publisher" />
                        </div>
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
                    <button type="button" class="btn btn-primary" id="editBtn">确认</button>
                </div>
            </div>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js"></script>
    <script src="./lib/form-serialize.js"></script>
</body>

</html>

核心动态javascript代码:

    <script>
        // 查询
        function render() {
            axios({
                url: 'http://ajax.itheima.net/api/books/',
                // url: 'http://ajax-api.itheima.net/api/books',
                method: 'GET',
            }).then(res => {
                // console.log(res.data.data);

                const arr = res.data.data

                // 显示到页面
                let str = arr.map(function (item) {
                    return `
                <tr>
                    <th scope="row">${item.id}</th>
                    <td>${item.bookname}</td>
                    <td>${item.author}</td>
                    <td>${item.publisher}</td>
                    <td>
                        <button data-id="${item.id}" type="button" class="btn btn-link btn-sm btn-delete">删除</button>
                        <button data-id="${item.id}" type="button" class="btn btn-link btn-sm btn-update">编辑</button>
                    </td>
                </tr>
                `
                }).join('')

                document.querySelector('#tbody').innerHTML = str
            })
        }

        render()


        // 删除事件委托(删除图书)
        document.querySelector('#tbody').addEventListener('click', function (e) {
            // console.log(e.target.tagName);
            if (e.target.classList.contains('btn-delete')) {

                const id = e.target.dataset.id

                // alert(id)
                axios({
                    url: 'http://ajax.itheima.net/api/books/' + id,
                    method: 'DELETE'
                }).then(res => {
                    console.log(res);
                    // 重发一下,更新页面
                    render()
                })
            }
        })



        // 添加图书操作

        // 获取模态框表单信息
        const addModal = new bootstrap.Modal(document.querySelector('#addModal'))
        const addForm = document.querySelector('#addForm')
        // 获取模态框确认按钮
        const addBtn = document.querySelector('#addBtn')
        addBtn.addEventListener('click', function () {
            // 收集用户输入的json对象
            let data = serialize(addForm, { hash: true })
            axios({
                url: 'http://ajax.itheima.net/api/books/',
                method: 'POST',
                data: data
            }).then(({ data: res }) => {
                console.log(res.data.data);
                // // 6. 重新请求并铺设覆盖, 并让表单清空, 模态框消失
                addForm.reset() // 触发form的原生事件方法让它重置
                // 调用hide()方法隐藏
                addModal.hide() // 触发BS内置方法, 让BS的模块框消失
                render()
            })
        })

        // 修改图书

        const editModal = new bootstrap.Modal(document.querySelector('#editModal'))
        const editForm = document.querySelector('#editForm')
        // 通过tbody事件委托给带有btn-update类名的按钮注册点击事件
        document.querySelector('tbody').addEventListener('click', function (e) {
            // 当鼠标点击到包含有btn-update类名的时候,返回结果
            if (e.target.classList.contains('btn-update')) {
                const id = e.target.dataset.id
                editModal.show()
                axios({
                    url: 'http://ajax.itheima.net/api/books/' + id,
                    method: 'GET',
                }).then(res => {
                    // console.log(res.data.data);
                    const newRes = res.data.data
                    for (let key in newRes) {
                        // console.log(key);
                        // console.log(newRes[key]);
                        editForm.querySelector(`[name=${key}]`).value = newRes[key]
                    }
                })
            }
        })




        // 修改数据保存
        document.querySelector('#editBtn').addEventListener('click', function () {
            let edit = serialize(editForm, { hash: true })
            console.log(edit);
            axios({
                url: `http://ajax.itheima.net/api/books/${edit.id}`,
                method: 'PUT',
                data: edit
            }).then(res => {
                console.log(res);
                render()
                editModal.hide()
            })
        })
    </script>

七.axios语法优化写法 

设置axios基地址配置,优化axios的写法

优化1: axios全局配置

每次请求地址, 接口文档只有后半段, 原因是所有前面的基础地址相同 。所以axios提供了一个全局的属性defaults.baseURL, 在每次axios函数发请求时, 具体请求的地址为"baseURL值+url值" 。

语法: axios.defaults.baseURL = '前缀基础地址' (简称基地址)

直接对axios本身进行设置

// 目标: axios可以提前设置一个基地址
// 知识点: 函数也是对象
// 前缀地址(基地址)
axios.defaults.baseURL = 'http://ajax-api.itheima.net'

优化2: 默认的method

axios请求时, method选项, 内部默认用"GET"方式, 所以也可以省略不写

优化3: axios的快捷方法

还有一些请求方式的方法可以直接使用例如语法为:

// 下面两种写法是等价的
axios({
  url: 'xx',
  method: 'POST',
  data: {
    a: 1
  }
})

axios.post('xx', {a:1} )


// 下面两种方式是等价的
axios({
  url: 'xx',
  method: 'get',
  params: {
    a: 1
  }
})

axios.get('xx', {params: {a:1} } )

 

屏幕前的你的投票与我而言是宝贵的建议,我会吸收并之后优化文章,感谢你的反馈

 

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

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

相关文章

JavaWeb《一》概念、服务器部署及servlet

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 本文是javaweb的第一篇&#xff0c;首先介绍了javaweb&#xff0c;然后进行了一个简单的web服务器部署&#xff0c;把我的一个网页发布到了云端&#xff0c;且叫他小Sa&#xff0c;目前啥也没有&#xff0c;之后会使…

vue3插槽、具名插槽、作用域插槽-足够入门了!

vue3 插槽 前言 这篇文章介绍vue组件的插槽&#xff01;包括&#xff1a;插槽概念&#xff0c;具名插槽&#xff0c;作用域插槽等等&#xff0c;看完不会你打我。哈哈哈&#xff0c;开玩笑的&#xff0c;不多说&#xff0c;上刺刀&#xff01;&#xff01; 1. 概念 插槽&…

给饿了么Radio 单选框添加点击事件(vue2)

前言 最近有一个这样的需求&#xff0c;当点击不合格时打开一个弹窗进行不合格数据的录入。问题点在于当你想对不合格数据进行修改时&#xff0c;点击不合格是没有反应的&#xff1b;因为Radio 单选框只提供了一个change 事件 解决 这里说明一下&#xff0c;项目是vue2的项目…

Vue 全套教程(一),入门 Vue 必知必会

Vue(一) 文章目录Vue(一)一、Vue简介1. 介绍2. 特点二、HelloWorld三、v-bind指令四、v-model指令五、el与data的两种写法5.1 el的两种写法5.2 data的两种写法六、MVVM模型七、Object.defineProperty方法八、数据代理8.1 数据代理概念8.2 Vue中的数据代理九、事件处理9.1 基本使…

【前端】Vue+Element UI案例:通用后台管理系统-导航栏

文章目录目标代码0.数据1.其他准备2.结构3.动态显示数据4.主题&#xff1a;背景色&#xff0c;点击悬停效果5.去除padding6.去除下拉框7.标题8.路由跳转总代码组件CommonAside.vue文件结构参考参考视频&#xff1a; VUE项目&#xff0c;VUE项目实战&#xff0c;vue后台管理系统…

Vue父传子详细教程

本文父组件&#xff1a;shopping.vue 子组件&#xff1a;shoplist.vue 1.父组件引入子组件 1.1.引入组件 import shoplist from ../shoplist.vue 1.2.注册组件 components: { shoplist } 1.3.使用组件 <shoplist></shoplist> 2.父组件定…

vue-admin-beautiful:npm ERR! code ERESOLVE npm ERR! code E451

记录一个离谱的编译错误。 克隆vue-admin-beautiful项目&#xff0c;master分支可以正常拉取&#xff0c;vue3.0-antdv编译报下面的错误。 尝试一&#xff1a; $ cnpm install Install fail! Error: GET https://registry.npmmirror.com/vab-config response 451 status Error…

Java-web实现用户登录、注册功能

目录环境搭建数据库用户登录需求分析代码实现编写UserMapper类编写User类编写loginServlet类编写login.html编写login.css用户注册需求分析代码编写编写UserMapper类编写registerServlet类编写register.html编写register.css编写SqlSessionFactory工具类项目总体架构运行展示案…

css绘制一个Pinia小菠萝

效果如下&#xff1a; pinia小菠萝分为头部和身体&#xff0c;头部三片叶子&#xff0c;菠萝为身体 头部 先绘制头部的盒子&#xff0c;将三片叶子至于头部盒子中 先绘制中间的叶子&#xff0c;利用border-radius实现叶子的效果&#xff0c;可以借助工具来快速实现圆角的预想…

SpringBoot 单元测试——JUnit5

目录 1、JUnit5概述 1.1、JUnit5 构成 1.2、JUnit5 配置 1.2.1、导入 Junit5 开发场景 1.2.2、Junit5 开发场景自动导入依赖项 2、JUnit5 使用 2.1、Jnuit5 测试代码开发 2.1.1、测试代码格式 2.1.2、测试样例 2.2、JUnit5常用注解 2.2.1、Test :表示方法是测试方法。…

【云原生 | 23】Docker运行Web服务实战之Tomcat

作者简介&#xff1a;&#x1f3c5;云计算领域优质创作者&#x1f3c5;新星计划第三季python赛道第一名&#x1f3c5; 阿里云ACE认证高级工程师&#x1f3c5; ✒️个人主页&#xff1a;小鹏linux &#x1f48a;个人社区&#xff1a;小鹏linux&#xff08;个人社区&#xff09;欢…

利用vue+高德地图API 实现用户的运动轨迹

利用vue高德地图API 实现用户的运动轨迹 高德地图网址&#xff1a;https://lbs.amap.com/api/jsapi-v2/guide/abc/prepare 任务一&#xff1a;实现地图显示 先完成准备工作&#xff0c;这一步是后面工作的基础。准备工作部分参考了&#xff1a; https://blog.csdn.net/qq_5…

vue3中vite的@路径别名与path中的resolve

使用路径引用 在vue3中&#xff0c;想用符号代替./…/这种相对路径引用使用&#xff0c; 前者相当于从根目录往后找&#xff0c;后者相当于从后往前找。 具体方法就是在vite.config.js中 import { resolve } from "path"export default defineConfig({plugins: [v…

Vue动态组件

等疫情结束了&#xff0c;要开始爬爬山、看看海&#xff0c;做些不会后悔的事情 一、概念 1. 示例 组件是可复用的 Vue 实例&#xff0c;且带有一个名字&#xff0c;这里实现一个最简单的组件&#xff1a; 父组件&#xff1a; <template><div><h1>Father…

【让CSDN的浪漫弥漫女神节】_Unity基础不动山不摇_回顾篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

promise 以及经典面试题

1.Promise 它是一个ES6提出一个新语法&#xff0c;用来优化异步代码的写法。promise&#xff1a;承诺 ● 生活中&#xff0c;它是用来表述 对将来要发生的事情的肯定。 例如 &#xff1a; 高中生说&#xff0c;老师&#xff0c;我会考上一所好大学的&#xff1b;销售员说&…

刷题日常计~JS④

作者 : SYFStrive 博客首页 : 点击跳转HomePage &#x1f4dc;&#xff1a; 初编程JavaScript之每天10&#x1f5e1;5题 &#x1f449; 从质变到量变&#x1f4aa; &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区…

Ajax 前后端数据交互

ajax 数据交互 今天又是奋斗的一天&#xff0c;行吧&#xff0c;来学习ajax ajax 数据交互什么是ajax&#xff1f;ajax的优势ajax的使用创建一个ajax对象配置这个对象发送请求接受返回过来的数据ajax状态码readystatechangeresponseTextajax请求方式封装一个属于自己的ajax什么…

2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例

1、首先已经成功安装过tomcat 如果没有成功安装&#xff0c;参考这篇tomcat安装教程(安装成功可忽略)&#xff1a;https://blog.csdn.net/weixin_43304253/article/details/117001797 2、在IDEA中配置tomcat的详细步骤 2.1、run ->Edit Confifurations 2.2 、点击加号 2.…

微信小程序自定义导航栏,实现不同用户角色登陆后显示不同的tabbar(避坑版)

在我们开发小程序的过程中&#xff0c;会遇到权限登录问题&#xff0c;不同的角色登录后显示的底部导航栏tabbar是不一样的。网上看到了很多的博客&#xff0c;多多少少会有些坑&#xff0c;会遇到问题。今天这篇博客就可以一次性解决。 了解概念 自定义tabbar 使用方法 app…