本地将上传图片转为base64码后存到一个数组,无法连续添加相同文件。
问题
本地将上传图片转为base64码后存到一个数组,无法连续添加相同文件。
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
提问者实现了“选择图片转 Base64 后存入数组”的上传功能,但发现如果连续两次选择同一个文件,第二次不会触发处理逻辑,导致无法重复添加同一张图片。
涉及技术
JavaScript、<input type="file">、change 事件
期望结果
了解为什么连续选择同一文件不会触发 change 事件,并得到解决方法。
回答
原始回答
2018-05-07 onChange="addUploadInvoice()" 的时候把value清空了。之后就可以选择相同的文件不了。不然相同文件不会触发change
AI 优化 · 回答整理
解答思路
<input type="file"> 的 change 事件是根据“值是否发生变化”来判断是否触发的;如果两次选择的是同一个文件,浏览器认为 input 的值没有变化,因此不会再次触发 change。解决办法是在每次处理完文件后,主动把该 input 的 value 清空。
示例代码
<input type="file" onchange="addUploadInvoice()" />
function addUploadInvoice() {
var input = event.target;
// 处理文件、转 base64、存入数组...
// 处理完成后清空 value,确保下次选择同一文件也能触发 change
input.value = "";
}
详细说明
change 事件触发的前提是“元素的值发生了改变”。对文件选择框来说,它记录的值本质上是选中的文件路径/文件名;如果用户连续两次选择了同一个文件,input.value 在浏览器看来并没有变化,所以第二次不会触发 change 事件,导致对应的处理函数(如 addUploadInvoice)不会被再次调用。只要在每次处理完成后,手动把该 input 元素的 value 重置为空字符串,就相当于清空了当前记录的值,下次即便选择同一个文件,浏览器也会认为值发生了变化,从而正常触发 change。
小结
<input type="file"> 无法重复选择同一文件触发 change,是因为浏览器判断值未发生变化;在每次处理完成后手动清空 input.value,即可让相同文件也能被重复选择并触发后续逻辑。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault