`

[JavaScript]多文件上传时动态添加及删除文件选择框

    博客分类:
  • j2se
 
阅读更多

多文件上传时,首先要解决的一个问题就是动态去添加或删除文件选择框,原来以为没多么困难的,但是没想到IE居然不支持table.appendChild()的js代码,导致整个前台JS的实现时间比原计划大大增加。不过还好可以借助网络查找需要的资源,最终成功实现兼容IE和FF的文件选择框的动态添加及删除功能。
       先来看一下在FF中展现出来的效果,IE中效果亦然;这里要上传的是xls格式的 excel文件,在文件选择之后对文件后缀名进行校验,并且最上面的文件选择框不能删除;

 

用到的两个小图标也保留一下: 
 


实现过程见代码:

Js代码 复制代码 收藏代码
  1. <head>  
  2. <title>excel数据导入</title>  
  3. </head>  
  4. <script type="text/javascript">  
  5.     var __FILE_INDEX = 0;//文件标识  
  6.     var __LOADING_TIP_DIV=null;  
  7.     var __ICON_PATH="<%=request.getContextPath()%>/images/icons";  
  8.     /** 
  9.     * 对选择的文件进行格式校验,只能选择xls格式的文件 
  10.     */  
  11.     function checkFile(fileObj){  
  12.         var objSpan = document.getElementById("span_"+fileObj.id);  
  13.         if(!checkExcel(fileObj.value)){  
  14.             objSpan.innerHTML="<img title='错误' src='"+__ICON_PATH+"/check_error.png' border='0'></img><font style='color:red;font-size:12px'>只能导入xls格式文件!</font>"  
  15.             fileObj.errFlag = true;  
  16.         } else {  
  17.             objSpan.innerHTML="<img title='正确' src='"+__ICON_PATH+"/check_right.png' border='0'></img>"  
  18.             fileObj.errFlag = false;  
  19.         }  
  20.         if(fileObj.value != "" && fileObj.noDelete!="true"){  
  21.             document.getElementById("del_"+fileObj.id).innerHTML="<span title='删除文件' onclick='deleteFile(\""+fileObj.id+"\")' style='font-size:12px;color: #4684b2;cursor:pointer;border-bottom:1px solid #4684b2'>删除</span>";  
  22.         }  
  23.    }  
  24.   
  25.     /** 
  26.      * 删除选择的文件 
  27.      */  
  28.     function deleteFile(fileId){  
  29.        var trNode = document.getElementById("tr_" + fileId);  
  30.        var trParent = trNode.parentNode;  
  31.        trParent.removeChild(trNode);  
  32.     }  
  33.   
  34.     /** 
  35.      * excel校验函数 
  36.      */  
  37.    function checkExcel(filePath){  
  38.        var subfix = filePath.substring(filePath.lastIndexOf(".")+1);  
  39.           if(subfix!="xls"){  
  40.             return false;  
  41.           }  
  42.           return true;  
  43.    }  
  44.     /** 
  45.      * 文件上传时的校验逻辑 
  46.      */  
  47.    function excelUpload(){  
  48.        var fileCount = 0;  
  49.        var files = document.getElementsByTagName("INPUT");  
  50.        for(var i=0; i < files.length; i++){  
  51.            if(files[i].type.toLowerCase!='file')continue;  
  52.           if(files[i].errFlag){  
  53.              alert("导入的文件只能是xls格式,请重新选择.");  
  54.              files[i].focus();  
  55.              return;  
  56.           }  
  57.           if(files[i].value!="")  
  58.             fileCount++;  
  59.       }  
  60.       if(fileCount < 1){  
  61.          alert("请先选择要上传的数据文件!");  
  62.          return;  
  63.       }  
  64.       document.getElementById("uploadExcelForm").submit();  
  65.   }  
  66.      /** 
  67.       * 添加文件 
  68.       */  
  69.      function addFile(){  
  70.            ++__FILE_INDEX;  
  71.            var fileId = "file"+__FILE_INDEX;  
  72.            var uploadTable = document.getElementById("tableUploadFile")  
  73.            var trElement = uploadTable.insertRow(-1);  
  74.            trElement.id="tr_"+fileId;  
  75.            var tdElement = trElement.insertCell(-1);  
  76.            tdElement.id="td_"+fileId;  
  77.            tdElement.innerHTML =  "<input type='file' id='"+fileId+"' size='30' style='padding-left:5px;width:300px;cursor:pointer;' onchange='checkFile(this)'>"  
  78.                +"<span id='span_" + fileId + "'></span>"  
  79.                +"<span id='del_" + fileId + "'></span>";  
  80.      }  
  81. </script>  
  82. <body>  
  83. <form id="uploadExcelForm" name="uploadExcelForm" method="post"  
  84.     target="_parent" enctype="multipart/form-data"  
  85.     action="<%=request.getContextPath()%>/excelUpload.action">  
  86. <table width="100%" id="tableUploadFile"  align="center" >  
  87.     <tr>  
  88.         <td>请选择要上传的Excel数据文件: <span title='添加文件' onclick='addFile()' style='font-size:12px;color: #6495ED;cursor:pointer;border-bottom:1px solid #6495ED'>添加文件</span></td>  
  89.     </tr>  
  90.     <tr id="tr_file0">  
  91.         <td><INPUT class="text" id="file0"  
  92.             style="padding-left:5px;width:300px; cursor: pointer" type="file" name="file0" size="30"  
  93.             onchange="checkFile(this);" noDelete="true"><span id="span_file0"></span></td>  
  94.     </tr>  
  95. </table>  
  96.  <div align="center" style="width: 100%"><input type="button" value=" 导入 "  
  97.             onclick="excelUpload();"></div>  
  98. </form>  
  99.   
  100. </body>  
  101. </html>  
<head>
<title>excel数据导入</title>
</head>
<script type="text/javascript">
    var __FILE_INDEX = 0;//文件标识
    var __LOADING_TIP_DIV=null;
    var __ICON_PATH="<%=request.getContextPath()%>/images/icons";
    /**
    * 对选择的文件进行格式校验,只能选择xls格式的文件
    */
	function checkFile(fileObj){
		var objSpan = document.getElementById("span_"+fileObj.id);
		if(!checkExcel(fileObj.value)){
			objSpan.innerHTML="<img title='错误' src='"+__ICON_PATH+"/check_error.png' border='0'></img><font style='color:red;font-size:12px'>只能导入xls格式文件!</font>"
			fileObj.errFlag = true;
	    } else {
	    	objSpan.innerHTML="<img title='正确' src='"+__ICON_PATH+"/check_right.png' border='0'></img>"
	    	fileObj.errFlag = false;
		}
		if(fileObj.value != "" && fileObj.noDelete!="true"){
			document.getElementById("del_"+fileObj.id).innerHTML="<span title='删除文件' onclick='deleteFile(\""+fileObj.id+"\")' style='font-size:12px;color: #4684b2;cursor:pointer;border-bottom:1px solid #4684b2'>删除</span>";
	    }
   }

	/**
	 * 删除选择的文件
	 */
	function deleteFile(fileId){
       var trNode = document.getElementById("tr_" + fileId);
       var trParent = trNode.parentNode;
       trParent.removeChild(trNode);
    }

    /**
     * excel校验函数
     */
   function checkExcel(filePath){
	   var subfix = filePath.substring(filePath.lastIndexOf(".")+1);
		  if(subfix!="xls"){
		    return false;
		  }
		  return true;
   }
	/**
	 * 文件上传时的校验逻辑
	 */
   function excelUpload(){
	   var fileCount = 0;
	   var files = document.getElementsByTagName("INPUT");
	   for(var i=0; i < files.length; i++){
		   if(files[i].type.toLowerCase!='file')continue;
          if(files[i].errFlag){
             alert("导入的文件只能是xls格式,请重新选择.");
             files[i].focus();
             return;
          }
          if(files[i].value!="")
          	fileCount++;
	  }
	  if(fileCount < 1){
         alert("请先选择要上传的数据文件!");
         return;
	  }
      document.getElementById("uploadExcelForm").submit();
  }
     /**
      * 添加文件
      */
     function addFile(){
    	   ++__FILE_INDEX;
           var fileId = "file"+__FILE_INDEX;
           var uploadTable = document.getElementById("tableUploadFile")
           var trElement = uploadTable.insertRow(-1);
           trElement.id="tr_"+fileId;
           var tdElement = trElement.insertCell(-1);
           tdElement.id="td_"+fileId;
           tdElement.innerHTML =  "<input type='file' id='"+fileId+"' size='30' style='padding-left:5px;width:300px;cursor:pointer;' onchange='checkFile(this)'>"
               +"<span id='span_" + fileId + "'></span>"
               +"<span id='del_" + fileId + "'></span>";
     }
</script>
<body>
<form id="uploadExcelForm" name="uploadExcelForm" method="post"
	target="_parent" enctype="multipart/form-data"
	action="<%=request.getContextPath()%>/excelUpload.action">
<table width="100%" id="tableUploadFile"  align="center" >
	<tr>
		<td>请选择要上传的Excel数据文件: <span title='添加文件' onclick='addFile()' style='font-size:12px;color: #6495ED;cursor:pointer;border-bottom:1px solid #6495ED'>添加文件</span></td>
	</tr>
	<tr id="tr_file0">
		<td><INPUT class="text" id="file0"
			style="padding-left:5px;width:300px; cursor: pointer" type="file" name="file0" size="30"
			onchange="checkFile(this);" noDelete="true"><span id="span_file0"></span></td>
	</tr>
</table>
 <div align="center" style="width: 100%"><input type="button" value=" 导入 "
			onclick="excelUpload();"></div>
</form>

</body>
</html>

 

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<script language="javascript">

  //全局变量,代表文件域的个数,并用该变量区分文件域的name属性

  var file_count = 0;

  //增加文件 域   

  function additem(id) {

    if (file_count > 9) {

      alert("最u22810 10个u25991 件u22495 ");

      return;

  }

  //定义行变量row;单元格变量cell;单元格内容变量str。

  var row,cell,str;

  //在指定id的table中插入一行

  row = eval("document.all["+'"'+id+'"'+"]").insertRow();

  if(row != null ) {

    //设置行的背景颜色

    row.bgColor="white";

    //在行中插入单元格

    cell = row.insertCell();

    //设置str的值,包括一个文件域和一个删除按钮

    str='<input onselectstart="return false" class="tf" onpaste="return false" type="file"  name="file[' + file_count + ']" style="width:500px" onkeydown="return false;"/>';

    str += " <input type="+'"'+"button"+'"'+" value="+'"'+"删除"+'"'+"   onclick='deleteitem(this,"+'"'+"tb"+'"'+");'>";

    //文件域个数增加

    file_count++;

    //设置单元格的innerHTML为str的内容

    cell.innerHTML=str;

  }

}
   //删除文件域 
   function deleteitem(obj,id) {
     var rowNum,curRow;
     curRow = obj.parentNode.parentNode;
     rowNum = eval("document.all."+id).rows.length - 1;
     eval("document.all["+'"'+id+'"'+"]").deleteRow(curRow.rowIndex);
     file_count--;
   }
</script>

html代码:

 <input type=button value="增加" onclick='additem("tb")'/><br/>
 <table cellspacing="0" id="tb" style="width:400px">
 </table>

</body>
</html>
 
分享到:
评论

相关推荐

    js实现上传文件添加和删除文件选择框

    总结,实现JavaScript文件上传、添加和删除文件选择框的关键在于理解DOM操作和处理浏览器兼容性问题。通过上述方法,我们可以创建一个在多数现代浏览器中都能正常工作的文件上传组件。然而,对于更复杂的场景,比如...

    struts2动态上传多文件的实现(内附JavaScript代码)

    例如,当用户点击“添加附件”按钮时,JavaScript可以通过创建新的`&lt;input type="file"&gt;`元素来添加新的文件选择字段。 2. **事件处理**:JavaScript可以监听用户的交互,如点击事件。当用户选择文件后,可以触发...

    可以添加多个文件上传

    描述中的“可以添加删除附件”进一步强调了系统不仅支持批量上传,还允许用户在需要时进行文件管理。 首先,让我们深入了解一下多文件上传的工作原理。在HTML5之前,传统的文件上传控件仅支持单个文件的选择和上传...

    11款基于Javascript的文件管理器

    - **上传能力**: 支持文件上传,便于快速添加新文件至服务器。 - **创建新内容**: 可以直接通过界面上创建新文件或目录。 #### 2. Control.Filebrowser **简介**: 采用Mootools框架开发的一款文件浏览器控件,提供...

    ext上传组件,可以多文件上传

    EXT上传组件是一款基于Flash技术的前端文件上传工具,它提供了多文件上传的功能,极大地提升了用户在上传文件时的体验和效率。EXT是一个流行的JavaScript库,主要用于构建富客户端应用程序,而EXT上传组件是EXT库的...

    jquery BootStrap多文件上传js

    这个组件旨在为用户提供一个简单而强大的方式来处理文件上传,包括选择多个文件、预览、删除以及单个或批量上传等功能。 ### jQuery与Bootstrap的结合 jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件...

    Axure教程:文件上传、自动产生列表.docx

    3. 添加交互动作:给每一个元件添加交互动作,如 fileButtonChose 文本框主要脚本代码写在了这个元件上,通过 Javascript 模拟了文件选择动作,并把文件名推送给过渡元件。 三、Javascript 代码实现 在 ...

    Javascript弹出框架

    - 文件上传预览:在用户选择文件后显示预览。 - 多步骤操作:分步引导用户完成复杂任务。 ### 结论 JavaScript弹出框架,特别是`lhgdialog`,为网页开发者提供了强大的交互设计工具,使他们能够构建更丰富、更具有...

    jquery-uploadify 多文件上传界面

    当文件上传出现问题时,如文件大小超过限制、文件类型不正确等,`jQuery Uploadify` 会触发相应的错误事件,允许开发者向用户显示错误信息或采取其他处理措施。 ### 10. 兼容性考虑 考虑到非 HTML5 浏览器的兼容性...

    SwfUpload 多文件上传

    SwfUpload 是一款开源的Flash上传组件,它允许用户在网页上实现多文件上传功能,尤其适用于需要大文件上传或批量上传的场景。这个技术在Web开发中被广泛应用,因为它可以提供比传统HTML表单上传更好的用户体验。...

    【JavaScript源代码】vue+el-upload实现多文件动态上传.docx

    总之,Vue.js 结合 Element UI 的 el-upload 组件可以构建一个灵活且功能齐全的文件上传功能,支持动态表格和多文件上传。通过 Vue 的数据绑定、事件处理和组件化特性,可以轻松实现用户界面与业务逻辑的交互。对于...

    js实现动态添加上传文件页面

    5. 将新创建的`&lt;input&gt;`文件选择框和删除按钮添加到`&lt;div&gt;`中,然后将这个`&lt;div&gt;`添加到页面上ID为`file`的`&lt;div&gt;`内。 6. 显示上传按钮,因为在添加了新的文件输入项后,用户可能需要提交文件。 在HTML中,`&lt;form&gt;...

    zyUpload文件上传预览示例

    这个示例代码集成了多种实用特性,如多文件选择、文件删除、以及预览功能,为用户提供了一种便捷的方式来处理批量文件上传的需求。下面我们将深入探讨其中涉及的技术和知识点。 1. **HTML**: HTML(超文本标记...

    ASP.NET多文件上传

    ASP.NET多文件上传是Web开发中的一个重要功能,它允许用户一次性选择并上传多个文件到服务器。在ASP.NET框架中,实现这一功能涉及到多种技术与组件的结合,包括HTML5、JavaScript、AJAX以及服务器端的处理。下面我们...

    mui调用手机摄像头及多文件上传.zip

    在这个名为“mui调用手机摄像头及多文件上传.zip”的压缩包中,包含的资源和代码示例应该详细解释了如何使用`mui`实现这些操作。现在,我们将深入探讨这些关键知识点。 1. **mui框架**:`mui` 是一款基于HTML5和CSS...

    fck文件上传模板

    7. **前端交互**:在用户界面,通常会有文件选择框和上传按钮,用户点击按钮触发文件选择对话框,选择文件后开始上传。前端代码需要处理这些事件,与后台进行通信,同时提供反馈信息,如上传进度、成功或失败提示等...

    不用刷新页面的文件上传和下载

    在IT行业中,文件上传和下载是网页应用中的常见功能,特别是在云存储、文件分享和协作平台等场景下。"不用刷新页面的文件上传和下载"技术使得用户可以在不中断当前浏览体验的情况下完成文件操作,提高了交互性和用户...

    gridview实现文件上传下载

    总结来说,`gridview实现文件上传下载`这个示例教会我们如何在ASP.NET Web Forms应用中使用`GridView`控件结合`FileUpload`控件实现文件上传,并通过创建下载链接实现文件的下载。这涉及到前端和后端的配合,包括UI...

Global site tag (gtag.js) - Google Analytics