javascript --- 文件上传即时预览 闭包实现多图片即时预览

  • 使用javascript原生功能实现,点击上传文件,然后再网页上显示出来

1. 初级显示

1.1 准备一个input标签和一个img标签

<input type=file id="file">
<img id="preview" src="">

在这里插入图片描述

1.2 js代码如下

 // 将上传的图片显示到页面上function showUpload() {// 选择文件上传控件var file = document.querySelector('#file')var img = document.querySelector('#preview')// 当用户选择完文件以后file.onchange = function() {// 1.创建文件读取对象var reader = new FileReader()// 用户选择的文件列表// console.log(this.files[0])// 2. 读取文件reader.readAsDataURL(this.files[0])// 3. 监听 onload 事件reader.onload = function() {img.src = reader.result}}}showUpload();

在这里插入图片描述

1.3 原理说明:

  • img可以根据图片的二进制格式,将图片显示再网页上
  • FileReader对象 可以将图片转换成二进制格式.

2. 实现多图片上传并显示.

  • 说明一下…没有传递给服务器…即没有存在服务器的磁盘上…仅仅只是再客户端的内存中…关了就没了…

2.1 上传控件和容器的准备

  • 先准备html,和一个放图片的容器
<!-- 注意 此处多了multiple -->
<input type="file" id="file" multiple>
<div class="container">
</div>

2.2 js代码思路

  1. 首先获取input的dom.然后监听它的提交事件file.onchange
  2. 上传的图片组可以通过this.files访问到.
  3. 根据this.files的数量,创建同等数量的img标签document.createElement('img')
  4. 设置img标签的属性,并追加到container里面dom.appendChild
  • 实现代码如下:
function showMultiUpload() {var file = document.querySelector('#file')var dom = document.querySelector('#imgs')dom.innerHTML = ''file.onchange = function() {for (var i = 0; i < this.files.length; i++) {var img = document.createElement('img')img.width = '100'img.height = '100'var reader = new FileReader()reader.readAsDataURL(this.files[i])reader.onload = function() {img.src = reader.resultdom.appendChild(img)}}}
}
showMultiUpload()

在这里插入图片描述

2.2 错误说明

1.上面上传了7张图片,但是在浏览器上面只显示了一张,原因是
2.javascript中的for循环是同步执行的,而将图片转换成二进制代码的接口readAsDataURL是异步的
3.因此需要使用闭包来延长参数的作用域
4.使用一个立即执行函数如下:

function showMultiUpload() {var file = document.querySelector('#file')var dom = document.querySelector('#imgs')dom.innerHTML = ''file.onchange = function() {for (var i = 0; i < this.files.length; i++) {var that = this;(function(i) {var img = document.createElement('img')img.width = '100'img.height = '100'var reader = new FileReader()reader.readAsDataURL(that.files[i])reader.onload = function() {img.src = reader.resultdom.appendChild(img)}})(i)}}
}
showMultiUpload()

在这里插入图片描述

ps:选择多个文件的时候,需要按住alt或者shift

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

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

相关文章

第一次作业:深入Linux源码分析进程模型

一.进程的概念 第一&#xff0c;进程是一个实体。每一个进程都有它自己的地址空间&#xff0c;一般情况下&#xff0c;包括文本区域&#xff08;text region&#xff09;、数据区域&#xff08;data region&#xff09;和堆栈&#xff08;stack region&#xff09;。文本区域存…

关于模型验证那点事儿

今天应笑笑老师之问&#xff0c;做了一个模型验证的例子&#xff0c;发现之前对这个东西的理解太片面&#xff0c;重新整理了一下思路 字段验证优先级高于类验证 什么是类验证呢&#xff1f;就是两个字段组合的验证&#xff0c;比如你Admin不允许修改密码&#xff0c;你修改密码…

mongoose --- createUser

说明 源代码记录、遗忘回顾mongoDB默认不需要使用账号密码即可访问数据库.下面是给mongoDB添加超级管理员和普通用户的方法 以系统管理员的方式运行powershell连接数据库 mongo查看数据库: show dbs切换到admin数据库: use admin创建超级管理员账户: db.createUser({user: roo…

Win10安装MySQL5.7.22 解压缩版(手动配置)方法

1.下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后&#xff1a; 2.可以把解压的内容随便放到一个目录&#xff0c;我的是如下目录&#xff08;放到C盘的话&#xff0c;可能在修改ini文件时涉及权限问题&#xff0c;之后我…

Elemant-UI日期范围的表单验证

Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可。但是官网的示例只有普通日期类型的验证&#xff0c;没有时间范围的验证。 一开始&#xff0c;我认为时间时间范围的是一…

node --- [express项目] 开发环境下使用morgan控制台输出访问信息

说明 源代码记录、遗忘回顾 process.env node中提供了一个process.env接口用于访问计算机中的系统环境变量. 可以利用以上属性来区分当前的环境是开发环境还是生产环境,代码如下: if (process.env.NODE_ENV development) {console.log(当前环境是开发环境) } else {consol…

Dynamics CRM 访问团队的使用

访问团队和负责人团队的区别是&#xff1a;负责人团队可以拥有记录&#xff0c;访问团队不能拥有记录也不能加入解决方案中。 访问团队用法1&#xff1a;可以将不同组织的人员加入到访问组实现数据的更新、删除、共享 访问团队用法2&#xff1a;访问团队模板的使用 步骤一&…

业务逻辑

快捷支付接口规范 问题背景 持卡人身份验证持卡人在发卡银行提供的身份验证服务器进行验证&#xff0c;将结果告知商户资金清算资金清算在身份验证通过后进行即时清算&#xff0c;也可能是通过专用资金清算网络进行传统方法弊端 持卡人需要访问很多网站才能完成一次完整支付 &a…

node --- [express] cookie/session 机制与 中间件的使用(路由守卫)

说明 源代码记忆、遗忘回顾使用 cookie/session 机制,让 客户端/服务器 的访问变得有状态 cookie 与 session 由于 HTTP 协议的无状态性,当一次连接断开后. 服务器并不会记录用户是否登录. 因此需要引入 cookie/session 机制 cookie cookie: 浏览器在电脑硬盘中开辟的一块空…

kprobe原理解析

参考 http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性&#xff0c;是一个轻量级的内核调试工具&#xff0c;同时它又是其他一些更高级的内核调试工具&#xff08;比如perf和systemtap&#xff09;的“基础设施”&#xff0c;4.0版本的内核中&a…

02 数据类型

转载于:https://www.cnblogs.com/theoup/p/9875293.html

css --- [学习笔记]背景图片小结 css三大特性

源代码 参考 1. 行高(line-height) 目标 理解 - 能说出行高和高度三种关系 - 能简单理解为什么行高等于单行文字会垂直居应用 使用行高实现单行文字垂直居中能会测量行高 2. CSS 背景(background) 目标 理解 - 背景的作用css 背景图片和插入图片的区别 应用 通过 css 背景…

(数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现

一、简介 要介绍朴素贝叶斯&#xff08;naive bayes&#xff09;分类器&#xff0c;就不得不先介绍贝叶斯决策论的相关理论&#xff1a; 贝叶斯决策论&#xff08;bayesian decision theory&#xff09;是概率框架下实施决策的基本方法。对分类任务来说&#xff0c;在所有相关概…

【技术累积】【点】【java】【29】MapUtils

内容 是Apache组织下的commons-collections包中的工具类<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version></dependency> Map操作相关的&#xff0c…

css --- [读书笔记] 盒模型(边框、内外边距)

说明 源代码学习 盒子模型(css重点) css学习三大重点: css盒子模型、 浮动、 定位 目标: 能说出盒子模型由哪四部分组成: 内容、边框、内外边距能说出内边距的作用,设置不同数值分别代表的意思: 控制内部块级元素和宽框的距离能说出块级盒子居中对齐需要的2个条件能说出外边…

Java 泛型,你了解类型擦除吗?

泛型&#xff0c;一个孤独的守门者。大家可能会有疑问&#xff0c;我为什么叫做泛型是一个守门者。这其实是我个人的看法而已&#xff0c;我的意思是说泛型没有其看起来那么深不可测&#xff0c;它并不神秘与神奇。泛型是 Java 中一个很小巧的概念&#xff0c;但同时也是一个很…

css --- [读书笔记] 浮动(float) 与 清除浮动

说明 源代码学习 1. 浮动 1.1 CSS布局的三种机制 网页布局的核心 — 利用 CSS 来摆放盒子 CSS提供了3种机制来设置盒子的摆放位置: 标准流、浮动和定位. 标准流: 块级元素(div、hr、p、h1~h6、ul、ol、dl、form、table)会独占一行,从上向下顺序排列行内元素(span、a、i、em)…

Shiro身份认证---转

目录1.Shro的概念2.Shiro的简单身份认证实现3.Shiro与spring对身份认证的实现前言&#xff1a; Shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在 JavaSE 环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话…

模板 Trie树

模板 Trie树 code&#xff1a; #include <iostream> #include <cstdio>using namespace std;const int wx20017;inline int read(){int sum0,f1; char chgetchar();while(ch<0||ch>9){if(ch-)f-1; chgetchar();}while(ch>0&&ch<9){sum(sum<…

css --- [练手小项目]样式小结(字体、颜色的语义 清除浮动的使用)

说明 源代码 1.1 CSS属性书写顺序(重点) 建议遵循以下顺序: 1.布局定位属性: display / position / float / clear / visibility / overflow (建议display第一个写, 毕竟关系到模式) 2.自身属性: width / height / margin / padding / border / background 3.文本属性: co…