【发布时间】:2014-10-09 12:38:01
【问题描述】:
在使用多个文件类型输入时控制我的文件列表有点麻烦。需要明确的是,我使用的不是具有多个文件输入的文件输入,而是多个单个文件输入。场景是用户可以选择 1 到 5 个文件,如果需要,可以将它们全部清除,但仍然必须发送至少 1 个文件。因此,我将在表单上使用最多五个文件输入。对于初学者,我有两个放在 Fiddle 和 CodePen 中(由于某种原因,它们不像在我的本地那样工作)。用户选择一个文件,该文件和大小被添加到一个单独的列表中,该列表显示名称和大小,并有一个附加到调用 clearfileInput 函数的按钮。 clearFileInput 函数删除该文件输入(因为这似乎是真正删除文件的唯一方法,因此它不会被发送),我也需要它来清除列表。
这是 HTML:
<input type="file" name="filesToUpload" id="filesToUpload" onChange="makeFileList();" />
<input type="file" name="filesToUpload" id="filesToUpload2" onChange="makeFileList2();" />
<ul id="fileList"><li>No Files Selected</li></ul>
<ul id="fileList2"><li>No Files Selected</li></ul>
我使用的脚本很长,因为我必须复制所有内容,但这里是一个完整的脚本:
function makeFileList() {
var input = document.getElementById("filesToUpload");
var ul = document.getElementById("fileList");
while (ul.hasChildNodes()) {
ul.removeChild(ul.firstChild);
}
for (var i = 0; i < input.files.length; i++) {
var li = document.createElement("li");
var fileSize = input.files[i].size;
li.innerHTML = input.files[i].name +" "+ "<span id=\"lblSize\"></span><input onclick=\"clearFileInput()\" type=\"button\" value=\"Clear\" \/>";
ul.appendChild(li);
}
if(!ul.hasChildNodes()) {
var li = document.createElement("li");
li.innerHTML = 'No Files Selected';
ul.appendChild(li);
}
};
function makeFileList2() {
var input = document.getElementById("filesToUpload2");
var ul = document.getElementById("fileList2");
while (ul.hasChildNodes()) {
ul.removeChild(ul.firstChild);
}
for (var i = 0; i < input.files.length; i++) {
var li = document.createElement("li");
var fileSize = input.files[i].size;
li.innerHTML = input.files[i].name +" "+"<span id=\"lblSize2\"></span><input onclick=\"clearFileInput2()\" type=\"button\" value=\"Clear\" \/>";
ul.appendChild(li);
}
if(!ul.hasChildNodes()) {
var li = document.createElement("li");
li.innerHTML = 'No Files Selected';
ul.appendChild(li);
}
};
//Code Starts
$(document).ready(function() {
$("#filesToUpload").change(function ()
{
var iSize = 0;
if($.browser.msie)
{
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var sPath = $("#filesToUpload")[0].value;
var objFile = objFSO.getFile(sPath);
var iSize = objFile.size;
iSize = iSize/ 1024;
}
else
iSize = ($("#filesToUpload")[0].files[0].size / 1024);
if (iSize / 1024 > 1)
{
if (((iSize / 1024) / 1024) > 1)
{
iSize = (Math.round(((iSize / 1024) / 1024) * 100) / 100);
$("#lblSize").html( iSize + "Gb");
}
else
{
iSize = (Math.round((iSize / 1024) * 100) / 100)
$("#lblSize").html( iSize + "Mb");
}
}
else
{
iSize = (Math.round(iSize * 100) / 100)
$("#lblSize").html( iSize + "kb");
}
});
$("#filesToUpload2").change(function ()
{
var iSize2 = 0;
if($.browser.msie)
{
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var sPath = $("#filesToUpload2")[0].value;
var objFile = objFSO.getFile(sPath);
var iSize2 = objFile.size;
iSize = iSize/ 1024;
}
else
iSize2 = ($("#filesToUpload2")[0].files[0].size / 1024);
if (iSize2 / 1024 > 1)
{
if (((iSize2 / 1024) / 1024) > 1)
{
iSize2 = (Math.round(((iSize2 / 1024) / 1024) * 100) / 100);
$("#lblSize2").html( iSize2 + "Gb");
}
else
{
iSize2 = (Math.round((iSize2 / 1024) * 100) / 100)
$("#lblSize2").html( iSize2 + "Mb");
}
}
else
{
iSize2 = (Math.round(iSize2 * 100) / 100)
$("#lblSize2").html( iSize2 + "kb");
}
});
});
function clearFileInput(){
var oldInput = document.getElementById("filesToUpload");
var newInput = document.createElement("input");
newInput.type = "file";
newInput.id = oldInput.id;
newInput.name = oldInput.name;
newInput.className = oldInput.className;
newInput.style.cssText = oldInput.style.cssText;
newInput.setAttribute("onclick", "makeFileList()");
oldInput.parentNode.replaceChild(newInput, oldInput);
};
function clearFileInput2(){
var oldInput = document.getElementById("filesToUpload2");
var newInput = document.createElement("input");
newInput.type = "file";
newInput.id = oldInput.id;
newInput.name = oldInput.name;
newInput.className = oldInput.className;
newInput.style.cssText = oldInput.style.cssText;
newInput.setAttribute("onclick", "makeFileList2()");
oldInput.parentNode.replaceChild(newInput, oldInput);
}
【问题讨论】:
-
只是为了确保我清楚你的问题......你已经有'重新创建文件输入'工作,但你只需要它来清除任何 li 当你点击“清除文件”按钮?
-
是的,这是正确的。但是,我无法找到在重建输入时添加 onClick 行为的方法,因此我可能必须将其更改为 jQuery empty().append 解决方案。但是对于这个问题,我试图清除与被删除的文件输入相对应的文件列表。
-
实际上,在另一篇文章中发现了我做错了什么。所以是的,回答你最初的问题,只是清楚文件列表是我想要做的。尝试了一个 jQuery empty() 但它完全破坏了列表功能。
-
我可以看看你是如何尝试 .empty() 的吗?我正在写一个答案,我想确保我不会复制你已经看到失败的东西。
-
一分钟,我发现我搞砸了。它实际上是在清除它,但只有当它(文件输入被更改或单击)现在重做小提琴和笔。
标签: javascript jquery forms file file-io