`

[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实现的很实用的功能,是在上传附件的时候,可以动态地添加和删除文件选择框,然后一次性上传。 从理论上看,实现起来比较容易,但实际工作的时候还是遇到两个难点,这些难点归结起来...

    程序天下:JavaScript实例自学手册

    19.15 动态加载JavaScript文件 19.16 防止JavaScript文件被其他站直接引用 19.17 检查机器是否安装Word 19.18 打印当前页 19.19 打印预览 19.20 隐藏不想打印的页面内容 19.21 使用ExecWB直接打印 19.22 动态绑定XML...

    《程序天下:JavaScript实例自学手册》光盘源码

    19.15 动态加载JavaScript文件 19.16 防止JavaScript文件被其他站直接引用 19.17 检查机器是否安装Word 19.18 打印当前页 19.19 打印预览 19.20 隐藏不想打印的页面内容 19.21 使用ExecWB直接打印 19.22 动态绑定XML...

    大名鼎鼎SWFUpload- Flash+JS 上传

    它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程中更新页面内容来营造各种动态效果。  在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发中,大部分的错误都...

    javascript代码常用大全

    2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 ...

    javascript 常用代码大全

    2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入imax文字。如果多输入了,自动减少到imax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 ...

    批量上传图片jsp,c#,php版本

    "fileTypeDesc": '图片',//允许上传的文件类型的描述,在弹出的文件选择框里会显示 "fileTypeExts": '*.jpg;*.bmp;*.gif;*.png',//允许上传的文件类型,限制弹出文件选择框里能选择的文件 "method": 'post',//和后台...

    疯狂HTML 5+CSS 3+JavaScript讲义(第2版)+源代码

    17.1 HTML 5增强的文件上传域 573 17.2 ArrayBuffer与TypedArray 578 17.3 Blob类 583 17.4 本章小结 587 第18章 Web Worker多线程API 588 18.1 使用Worker创建多线程 589 18.2 与Worker线程进行数据交换 591...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    当上传文件时,客户端同时显示文件上传的进度,从而及时了解文件传送情况。 /test.html 上传文件 /periodcal.jsp 上传文件后台处理页面 / prototype.js prototype框架类库文件 第21章(/ch21)...

    Editplus 3[1].0

    如果你使用 EditPlus 进行文本编辑,那么每次创建文本文件,编辑后保存时,尽管文件类型下拉列表中显示的是文本文件, EditPlus 还是询问你是否添加".txt"后缀,是不是很烦? 解决方法: ① 在程序目录建立一个空的...

    javascript常用代码大全.html

    2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 屏蔽...

    angular-file-upload:角度文件上传与1.4兼容

    选择或删除组件时,应用一个或多个过滤器。 通过所有过滤器的文件将添加到队列中。 将文件添加到队列后,将为其创建{FileItem}实例,并将上载程序选项复制到该对象中。 之后,队列中的项目(FileItems)就可以上载...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    ng2-file-uploader:angular2上传器组件和指令库,用于上传和预览上传文件

    选择文件或删除组件/指令时,应用一个或多个过滤器。 通过所有过滤器的文件将添加到队列中。 将文件添加到队列后,将为他创建{FileManager}实例,并且将上载器选项用于此对象。 之后,队列中的项目(queue $)就...

    DotNetTextBox所见即所得编辑器控件 v3.3.1

    &lt;br&gt; 2007/8/15 Version 3.3.0 Free &lt;br&gt;Updates: 1) 修正控件选择框样式会影响页面其它选择框样式的BUG。 2) 修正XP风格表情里其中一个图标与其它图标大小不一致的BUG。 3) 修正在非简体中文...

    javascript常用代码

    2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入imax文字。如果多输入了,自动减少到imax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 ...

    php网络开发完全手册

    15.3.8 用户动态添加记录 249 15.3.9 用户动态更新记录 251 15.3.10 用户动态删除记录 253 15.4 使用PHP获取MySQL数据库的信息 255 15.4.1 获取数据库的信息 255 15.4.2 获取表的信息 256 15.4.3 获取列的数目 256 ...

    asp.net专家疑难解答200问源码

    22.如何实现从服务器端向页面动态添加javascript脚本-示例1 22.如何实现从服务器端向页面动态添加javascript脚本-示例2 24.如何处理多页面重定向到同一页面后的返回问题 25.如何用Response.Redirect方法传递汉字 ...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

Global site tag (gtag.js) - Google Analytics