163電子郵箱附件上傳界面效果實現

163上傳附件界面簡潔美觀,  技術上沒有數量限制.在IE和Firefox同樣效果.

實現技術:CSS+Javascript
技術要點:使用css設置透明度等於0. 達到隱藏Input的效果.  將透明度等於0的Input放在提示信息之上.
效果圖:
    Upload File Effect


后补:
2008/12/03 23:22, 几分钟前, 上传了再次实现的代码, 刷新了几次我的资源, 没有发现上传的内容, 大家有意的话可以搜索一下, 实现起来没有什么难点.
后补2:
2008/12/04 23:08, 依然没有发现上传的资源, 干脆将代码粘近来算了, 代码有点长

------------------------- testUpload.html -------------------------------
  1. <html> 
  2. <head>
  3. <title> test: ui of upload file</title>
  4. <style>
  5.     
  6. .uf *{font-size:10pt;}
  7. .uf a.btn {padding:0px 5px 0px 16px; vertical-align:top; text-decoration: none; background-image:url(mailicon1.gif);    background-repeat:no-repeat; white-space:nowrap;}
  8. .uf .fileItem{}
  9. .uf .fileItem .addFile {white-space:nowrap;}
  10. .uf .fileItem .addFile a.addFile{background-position:-2px -146px; padding-left:20px; width:80px; height:20px; overflow:hidden;}
  11. .uf .fileItem .addFile a.addFile:Hover{background-position:-1px -169px; color:red; width:80px; height:20px; overflow:hidden; text-decoration:underline}
  12. .uf .fileItem .addFile a.addFile span.addFileLabel{vertical-align:top; margin-left:3px; }
  13. .uf .fileItem .addFile INPUT{position:relative; left: -100px; width:100px;opacity:0.0;filter:alpha(opacity=0);}
  14. .uf .fileItem .removeFile{}
  15. .uf .fileItem .removeFile a.readAnchor{}
  16. .uf .fileItem .removeFile a.removeFile{background-position:-2px -102px; width:12px; }
  17. .uf .fileItem .removeFile a.removeFile:Hover{background-position:-1px -122px; color:red; width:12px; text-decoration:underline}
  18. .ufDebug .fileItem .addFile INPUT{opacity:0.1;filter:alpha(opacity=10);}
  19. </style>
  20. <script src="upload.js" type="text/javascript"></script>
  21. <script src="upload.js" type="text/javascript"></script>
  22. <script src="upload.js" type="text/javascript"></script>
  23. <script src="upload.js" type="text/javascript"></script>
  24. <script>
  25. function initTestPage(){
  26.     var fh = document.getElementById("uploadFileHolder");
  27.     var uf = new UploadFile(fh,"uf", "uploadFile_Remain");
  28.     uf.addFileItem("XXXXX2.txt", "http://www.sina.com.cn/XXXXX2.txt");
  29.     uf.addFileItem();
  30. //  console.debug(uf.getFileItem(0));
  31. }
  32. </script>
  33. </head>
  34. <body onload="initTestPage();">
  35. <div id="uploadFileHolder" class="ufDebug uf" maxcount="3"></div>
  36. </body>
  37. </html> 

------------------------- upload.js -------------------------------
  1. /**
  2.  *
  3.  *  author: chris
  4.  *  date  : 2008.12
  5.  *  email : zzjzzj227 AT 163.com
  6.  *  
  7.  *  script for upload UI
  8.  */
  9. function UploadFile(/*HTMLDIVElement*/ fileHolder,
  10.                     /*String*/fileItemName, 
  11.                     /*String*/fileItemFlagName){
  12.   this.domNode = fileHolder;
  13.   this.fileItemName = fileItemName;
  14.   this.fileItemFlagName = fileItemFlagName;
  15.   this.partType = {fileItem:"fileItem"};
  16.   this.text = {
  17.     add:"Add"
  18.     remove:"Remove"
  19.     addHint:"Add File"
  20.     removeHint:"Remove File"
  21.     removeFileAlert:"Are you sure to remove file '[0]'"
  22.   };
  23.   
  24.   function $C(tag, pNode, id){
  25.     var d = (pNode && pNode.ownerDocument)?pNode.ownerDocument:document;
  26.     var c = d.createElement(tag);
  27.     if(pNode)pNode.appendChild(c);
  28.     if(id)c.id = id;
  29.     return c;
  30.   }
  31.   this.getCount = function(){
  32.   
  33.     var c = {count:0, uf:this};
  34.     UploadFile.parseDom(this.domNode, function(elmt, parm){
  35.         if(parm.uf._isFileItemElmt(elmt)){
  36.           c.count++;
  37.         }
  38.       }, c, 2);
  39.       
  40.     return c.count;
  41.   }
  42.   this.getMaxCount = function(){
  43.     var mc = this.domNode.getAttribute("maxcount");
  44.     return /^/d+$/.test(mc)?parseInt(mc):1;
  45.     
  46.   }
  47.   
  48.   this.doAddFileItem = function (){
  49.     
  50.     var fiDiv = $C("DIV");
  51.     var _fiHTML =  
  52.         '<div domNode="domRemoveFile" class="removeFile" style="display:none">'+
  53.         '     <input type=checkbox domNode="domRemain" name="'+this.fileItemFlagName+'" value="Y" style="display:none">'+
  54.         '     <a domNode="domDown" class="readAnchor" target="_blank"></a>'+
  55.         '     <a domNode="domRemoveBtn" class="btn removeFile" href="javascript:void(0);"title="'+this.text.removeHint+'" >'+this.text.remove+'</a>'+
  56.         '</div>'+
  57.         '<div domNode="domAddFile" class="addFile">'+
  58.         '  <a align="right" class="btn addFile" domNode="domAddBtn"  href="javascript:void(0);" title="'+this.text.addHint+'">'+
  59.         '     <span domNode="domAddBtnLabel" class="addFileLabel">'+this.text.add+'</span>'+
  60.         '     <input type=file class="uploadFile" domNode="domAddInput" name='+this.fileItemName+' οnkeydοwn="return false;" size="1">'+
  61.         '  </a>'+
  62.         '</div>';
  63.     var firstChild = this.domNode.firstChild;
  64.     
  65.     if(firstChild){
  66.       this.domNode.insertBefore(fiDiv, firstChild);
  67.     }else{
  68.       this.domNode.appendChild(fiDiv);
  69.     }
  70.     
  71.     fiDiv.className = "fileItem";
  72.     fiDiv.setAttribute("domNode""domFileItem");
  73.     fiDiv.setAttribute("partType"this.partType.fileItem);
  74.     fiDiv.innerHTML = _fiHTML;
  75.     fiDiv._fi = new UploadFileItem(this, 0);
  76.     
  77.     return fiDiv._fi;
  78.   }
  79.   this.addFileItem = function (/*string*/ downURL, 
  80.       /*stirng*/ downDesc, 
  81.       /*String*/ existFileMark){
  82.         
  83.     var firstItem = this.getFileItem(0);
  84.     
  85.     if(this.getCount()<this.getMaxCount() && (!firstItem || firstItem.isFilled())){
  86.         var fileItem = this.doAddFileItem(null);
  87.         fileItem.domRemain.checked = !!downURL && !!downDesc;
  88.         if(fileItem.domRemain.checked){
  89.           fileItem.domRemain.value = !!existFileMark?existFileMark:"Y";
  90.           fileItem.setLink(downURL, downDesc);
  91.           fileItem.switchToRemoveStatus();
  92.         }
  93.     }
  94.     
  95.   }
  96.   this.getFileItem = function (/*int*/ fileItemIdx){
  97.     
  98.     var fiPart = this._getFileItemElmt(fileItemIdx);
  99.     return fiPart?fiPart._fi:null;
  100.     
  101.   }
  102.   this._isFileItemElmt = function(/*HTMLElement*/ div){
  103.     
  104.     if(div && UploadFile._getPartType(div)==this.partType.fileItem){
  105.       return true;
  106.     }
  107.     
  108.     return false;
  109.     
  110.   }
  111.   this._getFileItemElmt = function (/*int*/fileItemIdx){
  112.     
  113.     var args = {uf:this, testCount:-1, idx:fileItemIdx, fileItemDiv:null};
  114.     
  115.     UploadFile.parseDom(this.domNode,
  116.       function(elmt, args){
  117.         if(args.uf._isFileItemElmt(elmt)){
  118.           args.testCount = args.testCount + 1;
  119.           if(args.testCount==args.idx){
  120.             args.fileItemDiv = elmt;
  121.             return false;
  122.           }
  123.         }
  124.       }, args, 2);
  125.       
  126.      return args.fileItemDiv;
  127.      
  128.   }
  129.   
  130.   this.init = function(){
  131.     var mc = this.getMaxCount();
  132.     UploadFile.debug("max count:"+mc);
  133.   }
  134.   
  135.   this.init();
  136. }
  137. UploadFile.debug = function(s){
  138.   if(typeof console != "undefined" && console.debug){
  139.     console.debug(s);
  140.   }
  141. }
  142. UploadFile.mixin = function(o, o2){
  143.   
  144.   for(var p in o2){
  145.     o[p] = o2[p];
  146.   }
  147.   return o;
  148.   
  149. }
  150. UploadFile.parseDom = function(/*HTMLElement*/ emt,
  151.         /*function(HTMLElement childElmt, parm){break if return false;}*/ callback,
  152.         parm,
  153.         /*int, 0 is not limited, 1 is emt itself*/parseLevel
  154.         ){
  155.           
  156.   if(!emt)return;
  157.   if(false == callback(emt, parm))return false;
  158.   if(1 == parseLevel || 0 > parseLevel) return;
  159.   
  160.   var _c = emt.firstChild;
  161.   while(_c){
  162.      if(false == UploadFile.parseDom(_c, callback, parm, parseLevel>1?parseLevel-1:0)){
  163.         return false;
  164.      }
  165.     _c = _c.nextSibling;
  166.   }
  167. }
  168. UploadFile.getFileName = function(fullPath){
  169.     var fileParts = /[]([^]+)$/.exec(fullPath);
  170.     return fileParts&&fileParts.length==2?fileParts[1]:fullPath;
  171. }
  172. UploadFile._getPartType=function(/*div*/ div){
  173.     if(!div || !div.getAttribute)
  174.       return null;
  175.     return div.getAttribute("partType");
  176. }
  177. UploadFile._getDomNode=function(/*div*/ div){
  178.     if(!div || !div.getAttribute)
  179.       return null;
  180.     return div.getAttribute("domNode");
  181. }
  182. function UploadFileItem(/*UploadFile*/ uf, /*int*/ idx){
  183.   var uploadFileItem = this;
  184.   this.domFileItem = null;
  185.   
  186.   this.domRemoveFile = null;
  187.   this.domDown = null;
  188.   this.domRemoveBtn = null;
  189.   this.domRemain = null;
  190.   this.domAddFile = null;
  191.   this.domAddBtn = null;
  192.   this.domAddBtnLabel = null;
  193.   this.domAddInput = null;
  194.   
  195.   this.uf = uf;
  196.   this.isFilled = function(){
  197.     if(this.domRemain.checked)return true;
  198.     if(!/^/s*$/.test(this.domAddInput.value))return true;
  199.     return false;
  200.   }
  201.   this.getInput = function(){
  202.     return this.domInput;
  203.   }
  204.   this.getRemain = function(){
  205.     return this.domRemain.checked;
  206.   }
  207.   this.getFileName = function(){
  208.     return this.domAddInput.value;
  209.   }
  210.   this.setLink = function(/*string*/aLabel, /*aLink*/ aHref){
  211.     this.domDown.innerHTML = aLabel;
  212.     this.domDown.href = aHref;
  213.     this.domDown.title = aHref;
  214.   }
  215.   this.switchToRemoveStatus = function(){
  216.     this.domAddFile.style.display="none";
  217.     this.domRemoveFile.style.display="";
  218.   }
  219.   
  220.   this.remove = function(){
  221.     this.domFileItem.parentNode.removeChild(this.domFileItem);
  222.     this.uf.addFileItem(null);
  223.   }
  224.   this.init = function(){
  225.     var argsTestDomNodes = {};
  226.    
  227.     UploadFile.parseDom(this.uf._getFileItemElmt(idx),
  228.       function(elmt, args){
  229.         var dn = UploadFile._getDomNode(elmt);
  230.         if(!dn)return;
  231.         args[dn]=elmt;
  232.       }, argsTestDomNodes, 0);
  233.     UploadFile.mixin(this, argsTestDomNodes);
  234.     
  235.     this.domAddInput.onchange = function(){
  236.       var uf = uploadFileItem.uf;
  237.       var item = uploadFileItem;
  238.       var count = uf.getCount();
  239.       item.setLink(
  240.           UploadFile.getFileName(item.domAddInput.value),
  241.           item.domAddInput.value
  242.         );
  243.       item.switchToRemoveStatus();
  244.       uf.domNode.appendChild(item.domFileItem);
  245.        uf.addFileItem(null);
  246.     } /* domAddInput.onchange */
  247.     
  248.     this.domRemoveBtn.onclick = function(){
  249.       var fileName = uploadFileItem.domDown.innerText || uploadFileItem.domDown.textContent;
  250.       if(confirm(uploadFileItem.uf.text.removeFileAlert.replace("[0]", fileName))!=true){
  251.         return;
  252.       }
  253.       uploadFileItem.remove();
  254.     } /* domRemoveBtn.onclick */
  255.   }
  256.   
  257.   this.init();
  258. }
------------------------- mailicon1.gif -------------------------------
mail icon for test
最终效果
最终效果
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值