js原生上传文件二次选择点击取消之后,文件被清空的问题

目的

上传文件时,当我们第一次选择文件点击确定之后,第二次选择文件点击取消之后,文件会自动被清掉,我们第一次选择的文件就不存在了,但我们想实现第二次选择文件时,点击取消,第一次选择的文件不会被清空。

这边想从onchange事件里面去改感觉是不可能的了。

尝试将整个对象clone出来。

当用户选择了文件之后,将该对象克隆出来,保存,如果用户再次点击选择文件并取消时,判断文件名是否为空,如果是空就将之前克隆的文件替换掉目前空的内容。 大致就是这么一个思路。

还要一个问题,因为上传事件用的是onchange。所以当我们第二次或者第三次选择文件之后点击取消,是不会触发onchange事件的。这个元素我想的是,元素相同那么肯定是不会触发onchange事件的,如果我们将克隆的对象替换掉当前对象这个操作之后,再将clone对象重新clone一次,那么用户下一个点击取消之后,我这边将这个二次clone的对象再次替换之后是不是就不是同一个onchange事件了呢。说的比较复杂 我这边画个图解释一下。

在这里插入图片描述

上完整代码,记得引入./jquery.js,可以之间使用。这里使用的是jq的clone,克隆的对象。不用jq的话,可以使用其他的,能克隆就行。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
	</head>
	<script type="text/javascript" src="./jquery.js"></script>
	<body>
		<div id="">
			<form>
			    <input type="file" id="file-input" name="fileContent">
			 </form>
		</div>
	</body>
	<script>
		var cloneFile = {file:{}}
		var fileInput = document.querySelector('#file-input');
		// fileInput.onchange = changeFun();
		$('#file-input').bind("change",changeFun)
		function changeFun(e){
			//兼容e事件
			e = e || window.event
			var fileElement = e.target
			var fileName = getFileName(fileElement.value)
			// 当文件名为0时,代表用户选择文件之后点击了取消
			if(fileName.length==0){
				//TODO:将克隆的文件替换当前空文件
				console.log(1);
				console.log(cloneFile.file);
				cloneFile.file.insertBefore(fileElement)
				$(fileElement).remove()
				//替换之后再将次克隆保存,不然第三次点击取消就会报错
				cloneFile.file = $(cloneFile.file).clone(true,true)
				return
			}else{
				 // 当文件名不为0时,将该对象克隆之后保存到cloneFile里面
				cloneFile.file = $(fileElement).clone(true,true)
			}
			var filereader = new FileReader();
			// 将文件对象克隆给cloneFile
			
			// cloneFile.file = $(fileElement).detach()
			var fileType = this.files[0].type;
			filereader.onload = function(){
				if(/^image\[jpeg|png|gif]/.test(fileType)){
					console.log(this.result);
				}
			}
			// console.log(this.files[0]);
			filereader.readAsDataURL(this.files[0]);
		}
		// 读取文件名
		function getFileName(path){
			var idx = path.lastIndexOf("\\")
			if(idx == -1){
				idx = path.lastIndexOf("/")
			}
			return path.substring(idx+1)
		}
		// console.dir(fileInput);
	</script>
</html>

好的,关于 js 原生实现文件上传,一般可以使用 HTML5 新增的 FormData 对象和 XMLHttpRequest 对象的相关方法来实现。具体步骤如下: 1. 在 HTML 中添加一个表单,包含一个 `<input type="file">` 元素: ``` <form id="myForm"> <input type="file" name="myFile"> <input type="submit" value="Upload File"> </form> ``` 2. 在 JS 中获取表单元素并监听表单的 `submit` 事件: ``` const myForm = document.getElementById('myForm') myForm.addEventListener('submit', (event) => { event.preventDefault() // 阻止表单默认提交行为 const formData = new FormData(myForm) // 创建一个 FormData 实例 const xhr = new XMLHttpRequest() // 创建一个 XMLHttpRequest 实例 // TODO: 设置 xhr 的事件监听器、请求地址、请求方式等 xhr.send(formData) // 发送请求 }) ``` 3. 在 XMLHttpRequest 实例中设置相应的事件监听器,如 `onload`,`onerror`,`onabort` 等,以处理成功和失败的情况并取得响应数据: ``` xhr.onload = function() { if (this.status === 200) { const data = JSON.parse(this.response) // TODO: 处理响应数据,如显示上传成功的信息等 } else { // TODO: 处理非 200 响应码的情况,如显示上传失败的信息等 } } xhr.onerror = function() { // TODO: 处理请求错误的情况,如显示上传失败的信息等 } xhr.onabort = function() { // TODO: 处理请求被取消的情况,如显示上传被取消的信息等 } ``` 以上是一般的简单处理方式,还可以根据具体需求添加一些限制条件,如文件大小、文件类型、上传进度等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值