Ajax(2)

图片上传

传图片文件不能像传文字一样用JSON格式,可以用form-data类型携带文件

1.获取图片文件对象

2.使用FormData(浏览器内置的构造函数)携带图片文件

3.提交表单数据到服务器,返回图片网址

这里可能用到的事件监听器:

change 事件通常用于在 HTML 表单元素的值改变时触发某些操作。最常见的应用场景是 <input>,<textarea>和 <select> 元素。当用户与这些元素交互,并且它们的值发生改变后,如果元素失去焦点(例如,用户点击了页面的其他部分或者按下了 Tab 键),就会触发 change 事件。

表单可以存储文件数据。为了实现这一目标,需要在HTML的form标签中添加enctype="multipart/form-data"属性。这种编码类型允许表单发送二进制数据,包括文件内容。当用户选择文件并提交表单时,文件数据会被包含在表单的POST请求中,并发送到服务器。服务器端的代码可以解析这个请求,提取出文件数据,并将其存储在服务器上。

<body><input class="upload" type="file">//选择的文件保存到了文件选择元素里<img src="" alt=""><script src="../form-serialize.js"></script><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script src="../bootstrap-5.3.0-alpha1-dist/js/bootstrap.min.js"></script><script>const upload = document.querySelector('.upload')upload.addEventListener('change', e => {const f_d = new FormData()f_d.append('img', e.target.files[0])axios({url: 'http://hmajax.itheima.net/api/uploadimg',method: 'post',data: f_d}).then(result => {
document.querySelector('img').src=result.data.data.url})})</script>
</body>

信息设置:

提示框

好像bootstrap的提示框都是构造函数初始化 用show()显示

<style>body {background-color: #f0f2f5;padding: 20px;-moz-user-select: none;/*火狐*/-webkit-user-select: none;/*webkit浏览器*/-ms-user-select: none;/*IE10*/-khtml-user-select: none;/*早期浏览器*/user-select: none;font-size: 14px;}.container {background-color: #ffffff;padding: 20px;display: flex;padding-left: 0;margin: 0 auto;min-width: 700px;max-width: 1000px;border-radius: 2px;}.my-nav {width: 200px;border-right: 1px solid #f0f0f0;list-style: none;}.my-nav li {cursor: pointer;height: 40px;line-height: 40px;padding-left: 20px;font-size: 14px;}.my-nav li.active {background-color: #e9f7fe;color: #448ef7;border-right: 4px solid #448ef7;font-weight: 600;}.content {padding-top: 10px;/* padding-left: 40px; */flex: 1;display: flex;justify-content: space-evenly;}.content .title {font-size: 20px;margin-bottom: 30px;}/*.content .info-wrap {margin-right: 20px; }*/.content .avatar-box {display: flex;flex-direction: column;align-items: center;padding-top: 20px;/* flex: 1; */padding-top: 55px;width: 200px;}.content .avatar-box .avatar-title {font-size: 16px;text-align: left;align-self: flex-start;margin: 0;}.content .avatar-box .prew {width: 120px;height: 120px;border-radius: 50%;margin-bottom: 15px;}.content .avatar-box label {width: 100px;height: 30px;transition: all .3s;box-shadow: 0 2px 0 rgb(0 0 0 / 2%);cursor: pointer;font-size: 14px;border-radius: 2px;color: rgba(0, 0, 0, .85);border: 1px solid #d9d9d9;text-align: center;line-height: 30px;}.content .avatar-box label:hover {color: #40a9ff;border-color: #40a9ff;background: #fff;}.content .avatar-box #upload {display: none;}.content .user_form label:not(.male-label) {display: block;margin-bottom: 15px;margin-top: 15px;}.content .user_form .form-item {margin-bottom: 20px;}.content .user_form .form-item .male-label {margin-right: 20px;display: inline-flex;align-items: center;}.content .user_form input[type=radio] {margin-right: 10px;outline: none;background-size: contain;border: 1px solid rgba(0, 0, 0, .25);border-radius: 50%;box-sizing: border-box;width: 16px;height: 16px;appearance: none;}.content .user_form input[type=radio]:checked {border-radius: 50%;border-color: #0d6efd;background-color: #0d6efd;background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");}.content .user_form input:not([type=radio]) {height: 30px;appearance: none;}.form-item input:not([type=radio]),textarea {display: block;width: 330px;outline: none;font-size: 14px;border: 1px solid #d9d9d9;border-radius: 2px;transition: all .3s;padding-left: 5px;}.content .user_form textarea {padding-top: 10px;width: 350px;resize: none;}.content .user_form input:focus,textarea:focus {border-color: #40a9ff;border-right-width: 1px;z-index: 1;border-color: #40a9ff;box-shadow: 0 0 0 2px rgb(24 144 255 / 20%);border-right-width: 1px;outline: 0;}.content .user_form button.submit {background: #4D8FF7;width: 78px;height: 32px;color: white;text-align: center;line-height: 32px;font-size: 14px;color: #FFFFFF;letter-spacing: 0;font-weight: 500;border: none;cursor: pointer;}.toast {position: fixed;top: 20px;left: 50%;transform: translateX(-50%);}.toast .toast-body {padding: 0 !important;}.toast .alert-success {margin-bottom: 0 !important;}</style></head><body><!-- toast 提示框 --><div class="toast my_toast" data-bs-delay="1500"><div class="toast-body"><div class="alert alert-success info-box">操作成功</div></div></div><!-- 核心内容区域 --><div class="container"><ul class="my-nav"><li class="active">基本设置</li><li>安全设置</li><li>账号绑定</li><li>新消息通知</li></ul><div class="content"><div class="info-wrap"><h3 class="title">基本设置</h3><form class="user_form" action="javascript:;"><div class="form-item"><label for="email">邮箱</label><input id="email" name="email" class="email" type="text" placeholder="请输入邮箱" autocomplete="off"></div><div class="form-item"><label for="nickname">昵称</label><input id="nickname" name="nickname" class="nickname" type="text" placeholder="请输入昵称" autocomplete="off"></div><div class="form-item"><label>性别</label><label class="male-label"><input type="radio" name="gender" class="gender" value="0">男</label><label class="male-label"><input type="radio" name="gender" class="gender" value="1">女</label></div><div class="form-item"><label for="desc">个人简介</label><textarea id="desc" name="desc" class="desc" placeholder="请输入个人简介" cols="20" rows="10"autocomplete="off"></textarea></div><button class="submit">提交</button></form></div><div class="avatar-box"><h4 class="avatar-title">头像</h3><img class="prew" src="../img/头像.png" alt=""><label for="upload">更换头像</label><input id="upload" type="file" class="upload"></div></div></div><script src="../form-serialize.js"></script><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script src="../bootstrap-5.3.0-alpha1-dist/js/bootstrap.min.js"></script><script>const user_form = document.querySelector('.user_form')axios({ //渲染页面url: 'http://hmajax.itheima.net/api/settings',params: {creator: 'wwx'}}).then(result => {const obj = result.data.datafor (let key in obj) {if (key === 'avatar') {document.querySelector('.prew').src = obj[key]}else if (key === 'gender') {const gender = document.querySelectorAll('.gender')gender[obj[key]].checked = 'true'} else {document.querySelector(`.${key}`).value = obj[key]}}})const upload = document.querySelector('.upload')upload.addEventListener('change', e => {const fd = new FormData()fd.append('avatar', e.target.files[0])fd.append('creator', 'wwx')axios({url: 'http://hmajax.itheima.net/api/avatar',method: 'put',data: fd}).then(result => {document.querySelector('.prew').src = result.data.data.avatar})})document.querySelector('.submit').addEventListener('click', () => {//修改const obj = serialize(user_form, { hash: true, empty: true })obj.gender = +obj.genderobj.creator = 'wwx'axios({url: 'http://hmajax.itheima.net/api/settings',method: 'put',data: obj}).then(result => {const my_toast= document.querySelector('.my_toast')const toast=new bootstrap.Toast(my_toast)toast.show()})})</script>
</body>

XMLhttprequest(XHR)

该对象用于与服务器交互。

axios对XHR封装,其内部就是采用XHR与服务器交互

查询参数

http://xxx.com/xxx/xxx?参数名1=值1&参数名2=值

可以自动生成字符串

promise

用于表示一个异步操作的最终完成及其结果值

promise的三种状态:

待定(pending):初始状态,即没有被兑现,也没有被拒绝

已兑现(fulfilled):操作成功完成

以拒绝(rejected):操作失败

有了Promise对象,就可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,使得控制异步操作更加容易。Promise通过将异步操作的结果封装在一个对象中,使得我们可以更加清晰和简洁地处理异步操作。

异步任务有结果后,与处理函数相关联

// 假设 fetchData 是一个返回 Promise 的函数  
function fetchData(url) {  return new Promise((resolve, reject) => {  // 模拟异步操作  setTimeout(() => {  const data = `Data from ${url}`;  resolve(data);  }, 1000);  });  
}  // 使用 Promise 链式调用  
fetchData('https://example.com/api/data1')  .then(data1 => {  console.log(data1);  return fetchData('https://example.com/api/data2'); // 返回新的 Promise  })  .then(data2 => {  console.log(data2);  // 可以继续添加更多的异步操作...  })  .catch(error => {  console.error('An error occurred:', error);  });

不用过渡嵌套返回信息

运用promise和xhr封装axios

function myaxios(obj) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest()xhr.open(obj.method || 'get', obj.url)if (obj.params) {const paramsobj = new URLSearchParams(obj.params)const parame_string = paramsobj.toString()obj.url += `?${parame_string}`}xhr.addEventListener('loadend', () => {if (xhr.status >= 200 && xhr.status <= 300)resolve(JSON.parse(xhr.response))elsereject(new Error(xhr.response))})if (obj.data) {xhr.setRequestHeader('Content-Type', 'application/json')//设置请求头const data_srting = JSON.stringify(obj.data)xhr.send(data_srting)//发送请求体} else {xhr.send()}})}

同步代码与异步代码

同步代码

代码按顺序一行一行执行,上一行执行完才会执行下一行

异步代码

耗时,不必等待任务完成,异步代码完成后,会用回调函数回传

Promise-链式调用

依靠then()方法返回一个新生成的promise对象特性,继续串联下一个任务,直到结束

创建的promise方法调用then方法,then具有回调函数,return的结果可以传递给then产生的新promise对象

我们可以使用then函数返回的新promise对象特征,一直串联,解决函数嵌套

async与await-异步编程终极解决方案

基于promise,而无需调用

用async声明该函数为异步函数,在函数内,使用await获取promise对象成功状态结果值

事件循环

执行代码和收集异步任务的模型,在调用栈空闲时,反复调用任务队列里回调函数的机制

js执行同步代码,遇到异步代码交给宿主浏览器环境运行

宏任务与微任务

宏任务:由浏览器环境执行的异步代码

任务执行所在代码
js脚本执行事件浏览器
定时器浏览器
Ajax请求的完成事件浏览器
用户交互事件浏览器

微任务:由js引擎环境执行的异步代码

promise.then() 

promise本身是同步的,而then和catch回调函数是异步的

promise.all

合并多个promise对象,等待所有同时成功完成(或有一个失败),做后续逻辑

const p=Promise.all([Promise对象,Promise对象,Promise对象...])
p.then(result => {//result结果:[Promise成功结果,Promise成功结果,Promise成功结果...]
}).catch(error => {//第一个失败的Promise对象,抛出的异常
})

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

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

相关文章

低功耗漏电保护电路芯片D54123B介绍

概 述 A&#xff09;、D54123B是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电路、比较器电路、延时电路、计数器电路、跳闸控制电路及跳闸驱动电路。芯片外围应用有脱扣线圈、压敏电阻、稳压二级管、二级管、电阻、电容等元器件。 B&#xff09;、内部…

权限管理系统-0.4.1

5.4 权限管理前端开发 5.4.1 src/components 新建ParentView文件夹&#xff0c;并在文件夹中新建index.vue文件。 并在index.vue中加入以下内容&#xff1a; <template><router-view /> </template>5.4.2 layout/components/Sidebar/index.vue routes() …

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口 数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台。…

网络编程:网络编程基础

一、网络发展 1.TCP/IP两个协议阶段 TCP/IP协议已分成了两个不同的协议&#xff1a; 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行2互联的互联网协议IP 2.网络体系结构 OSI体系口诀&#xff1a;物链网输会示用 2.1网络体系结构概念 每一层都有自己独…

邮件营销案例分析:哪些因素决定营销效果?

邮件营销案例的关键要素&#xff1f;电子邮件营销案例有哪些&#xff1f; 邮件营销一直是一种重要的推广手段。然而&#xff0c;邮件营销的效果并非一蹴而就&#xff0c;它需要多方面的因素共同作用。AokSend将通过一系列邮件营销案例的分析&#xff0c;探讨哪些因素决定了邮件…

海淘网站#跨境电商#淘宝数据#建站网站#前端源码❀

代购业务近年兴起的一种购物模式&#xff0c;是帮国外客户购买中国商品。主要通过外贸代购模式&#xff0c;把淘宝、天猫等电商平台的全站商品通过API接入到你的网站上&#xff0c;瞬间就可以架设一个有数亿产品的大型网上商城&#xff0c;而且可以把这些中文的商品全部自动翻译…

商家转账到零钱转账场景怎么选择

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱&#xff0c;支持批量对外转账&#xff0c;操作便捷。如果你的应用场景是单付款&#xff0c;体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些&#xff1f; 商…

【强化学习2--基于策略梯度的方法】

文章目录 深度强化学习---基于策略梯度的方法为什么要用策略梯度方法&#xff1f;策略梯度方法的优势策略梯度定理REINFORCEActor-CriticA2C:Advantage Actor-CriticPPO总结 深度强化学习—基于策略梯度的方法 本篇主要介绍单智能体强化学习——基于策略梯度的方法。 为什么要…

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的&#xff0c;在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情&#xff0c;然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…

手写简易操作系统(六)--内存分页

前情提要 上一节我们讲到了获取物理内存&#xff0c;这节我们将开启内存分页 一、内存分页的作用 内存分页是一种操作系统和硬件协同工作的机制&#xff0c;用于将物理内存分割成固定大小的页面&#xff08;通常为4KB&#xff09;并将虚拟内存空间映射到这些页面上。内存分页…

【更新】上市公司“宽带中国”战略数据集(2000-2022年)

参照李万利&#xff08;2022&#xff09;、薛成&#xff08;2020&#xff09;等人的做法&#xff0c;根据企业所在城市入选“宽带中国”试点战略的批次构建DID。如果样本期间内企业所在城市被评选为“宽带中国” 试点城市&#xff0c;则该地区企业样本在入选当年及以后年份取1&…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

Focal and Global Knowledge Distillation forDetectors

摘要 文章指出&#xff0c;在目标检测中&#xff0c;教师和学生在不同领域的特征差异很大&#xff0c;尤其是在前景和背景中。如果我们 平等地蒸馏它们&#xff0c;特征图之间的不均匀差异将对蒸馏产生负面影响。因此&#xff0c;我们提出了局部和全局蒸馏。局部蒸馏分离前景和…

【Spring Boot系列】快速上手 Spring Boot

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

macOS - 获取硬件设备信息

文章目录 1、CPU获取方式 一&#xff1a; system_profiler获取方式二&#xff1a;sysctl&#xff0c; machdepmachdep 2、内存3、硬盘4、显卡5、声卡6、光驱7、系统序列号8、型号标识符9、UUID 等信息 10. 计算机名称 1、CPU 获取方式 一&#xff1a; system_profiler % syst…

深信服技术认证“SCCA-C”划重点:深信服应用交付AD

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…

中国工程精英智创数字工厂——2023纵览基础设施大会暨光辉大奖赛观察 (下)

中国工程精英智创数字工厂 ——2023纵览基础设施大会暨光辉大奖赛观察 &#xff08;下&#xff09; 吴付标 中国制造的尽头是智能化、智慧化&#xff0c;这一趋势正在加速前进。2022年&#xff0c;中国以50座达沃斯论坛盖章认证的“灯塔工厂”数量冠绝全球&#xff0c;而“数…

活动预告:如何培养高质量应用型医学人才?

在大数据时代与“新医科”建设的背景下&#xff0c;掌握先进的医学数据处理技术成为了医学研究与应用的重要技能。 为了更好地培养社会所需要的高质量应用型医学人才&#xff0c;许多高校已经在广泛地开展面向医学生的医学数据分析教学工作。 在“课-训-赛”育人才系列活动的…

详解Python中%r和%s的区别及用法

首先看下面的定义&#xff1a; %r用rper()方法处理对象 %s用str()方法处理对象 函数str() 用于将值转化为适于人阅读的形式&#xff0c;而repr() 转化为供解释器读取的形式&#xff08;如果没有等价的语法&#xff0c;则会发生SyntaxError 异常&#xff09; 某对象没有适于人…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…