163上傳附件界面簡潔美觀, 技術上沒有數量限制.在IE和Firefox同樣效果.
實現技術:CSS+Javascript
技術要點:使用css設置透明度等於0. 達到隱藏Input的效果. 將透明度等於0的Input放在提示信息之上.
效果圖:
后补:
2008/12/03 23:22, 几分钟前, 上传了再次实现的代码, 刷新了几次我的资源, 没有发现上传的内容, 大家有意的话可以搜索一下, 实现起来没有什么难点.
后补2:
2008/12/04 23:08, 依然没有发现上传的资源, 干脆将代码粘近来算了, 代码有点长
------------------------- testUpload.html -------------------------------
------------------------- upload.js -------------------------------
------------------------- mailicon1.gif -------------------------------
最终效果
實現技術:CSS+Javascript
技術要點:使用css設置透明度等於0. 達到隱藏Input的效果. 將透明度等於0的Input放在提示信息之上.
效果圖:
后补:
2008/12/03 23:22, 几分钟前, 上传了再次实现的代码, 刷新了几次我的资源, 没有发现上传的内容, 大家有意的话可以搜索一下, 实现起来没有什么难点.
后补2:
2008/12/04 23:08, 依然没有发现上传的资源, 干脆将代码粘近来算了, 代码有点长
------------------------- testUpload.html -------------------------------
- <html>
- <head>
- <title> test: ui of upload file</title>
- <style>
- .uf *{font-size:10pt;}
- .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;}
- .uf .fileItem{}
- .uf .fileItem .addFile {white-space:nowrap;}
- .uf .fileItem .addFile a.addFile{background-position:-2px -146px; padding-left:20px; width:80px; height:20px; overflow:hidden;}
- .uf .fileItem .addFile a.addFile:Hover{background-position:-1px -169px; color:red; width:80px; height:20px; overflow:hidden; text-decoration:underline}
- .uf .fileItem .addFile a.addFile span.addFileLabel{vertical-align:top; margin-left:3px; }
- .uf .fileItem .addFile INPUT{position:relative; left: -100px; width:100px;opacity:0.0;filter:alpha(opacity=0);}
- .uf .fileItem .removeFile{}
- .uf .fileItem .removeFile a.readAnchor{}
- .uf .fileItem .removeFile a.removeFile{background-position:-2px -102px; width:12px; }
- .uf .fileItem .removeFile a.removeFile:Hover{background-position:-1px -122px; color:red; width:12px; text-decoration:underline}
- .ufDebug .fileItem .addFile INPUT{opacity:0.1;filter:alpha(opacity=10);}
- </style>
- <script src="upload.js" type="text/javascript"></script>
- <script src="upload.js" type="text/javascript"></script>
- <script src="upload.js" type="text/javascript"></script>
- <script src="upload.js" type="text/javascript"></script>
- <script>
- function initTestPage(){
- var fh = document.getElementById("uploadFileHolder");
- var uf = new UploadFile(fh,"uf", "uploadFile_Remain");
- uf.addFileItem("XXXXX2.txt", "http://www.sina.com.cn/XXXXX2.txt");
- uf.addFileItem();
- // console.debug(uf.getFileItem(0));
- }
- </script>
- </head>
- <body onload="initTestPage();">
- <div id="uploadFileHolder" class="ufDebug uf" maxcount="3"></div>
- </body>
- </html>
------------------------- upload.js -------------------------------
- /**
- *
- * author: chris
- * date : 2008.12
- * email : zzjzzj227 AT 163.com
- *
- * script for upload UI
- */
- function UploadFile(/*HTMLDIVElement*/ fileHolder,
- /*String*/fileItemName,
- /*String*/fileItemFlagName){
- this.domNode = fileHolder;
- this.fileItemName = fileItemName;
- this.fileItemFlagName = fileItemFlagName;
- this.partType = {fileItem:"fileItem"};
- this.text = {
- add:"Add",
- remove:"Remove",
- addHint:"Add File",
- removeHint:"Remove File",
- removeFileAlert:"Are you sure to remove file '[0]'"
- };
- function $C(tag, pNode, id){
- var d = (pNode && pNode.ownerDocument)?pNode.ownerDocument:document;
- var c = d.createElement(tag);
- if(pNode)pNode.appendChild(c);
- if(id)c.id = id;
- return c;
- }
- this.getCount = function(){
- var c = {count:0, uf:this};
- UploadFile.parseDom(this.domNode, function(elmt, parm){
- if(parm.uf._isFileItemElmt(elmt)){
- c.count++;
- }
- }, c, 2);
- return c.count;
- }
- this.getMaxCount = function(){
- var mc = this.domNode.getAttribute("maxcount");
- return /^/d+$/.test(mc)?parseInt(mc):1;
- }
- this.doAddFileItem = function (){
- var fiDiv = $C("DIV");
- var _fiHTML =
- '<div domNode="domRemoveFile" class="removeFile" style="display:none">'+
- ' <input type=checkbox domNode="domRemain" name="'+this.fileItemFlagName+'" value="Y" style="display:none">'+
- ' <a domNode="domDown" class="readAnchor" target="_blank"></a>'+
- ' <a domNode="domRemoveBtn" class="btn removeFile" href="javascript:void(0);"title="'+this.text.removeHint+'" >'+this.text.remove+'</a>'+
- '</div>'+
- '<div domNode="domAddFile" class="addFile">'+
- ' <a align="right" class="btn addFile" domNode="domAddBtn" href="javascript:void(0);" title="'+this.text.addHint+'">'+
- ' <span domNode="domAddBtnLabel" class="addFileLabel">'+this.text.add+'</span>'+
- ' <input type=file class="uploadFile" domNode="domAddInput" name='+this.fileItemName+' οnkeydοwn="return false;" size="1">'+
- ' </a>'+
- '</div>';
- var firstChild = this.domNode.firstChild;
- if(firstChild){
- this.domNode.insertBefore(fiDiv, firstChild);
- }else{
- this.domNode.appendChild(fiDiv);
- }
- fiDiv.className = "fileItem";
- fiDiv.setAttribute("domNode", "domFileItem");
- fiDiv.setAttribute("partType", this.partType.fileItem);
- fiDiv.innerHTML = _fiHTML;
- fiDiv._fi = new UploadFileItem(this, 0);
- return fiDiv._fi;
- }
- this.addFileItem = function (/*string*/ downURL,
- /*stirng*/ downDesc,
- /*String*/ existFileMark){
- var firstItem = this.getFileItem(0);
- if(this.getCount()<this.getMaxCount() && (!firstItem || firstItem.isFilled())){
- var fileItem = this.doAddFileItem(null);
- fileItem.domRemain.checked = !!downURL && !!downDesc;
- if(fileItem.domRemain.checked){
- fileItem.domRemain.value = !!existFileMark?existFileMark:"Y";
- fileItem.setLink(downURL, downDesc);
- fileItem.switchToRemoveStatus();
- }
- }
- }
- this.getFileItem = function (/*int*/ fileItemIdx){
- var fiPart = this._getFileItemElmt(fileItemIdx);
- return fiPart?fiPart._fi:null;
- }
- this._isFileItemElmt = function(/*HTMLElement*/ div){
- if(div && UploadFile._getPartType(div)==this.partType.fileItem){
- return true;
- }
- return false;
- }
- this._getFileItemElmt = function (/*int*/fileItemIdx){
- var args = {uf:this, testCount:-1, idx:fileItemIdx, fileItemDiv:null};
- UploadFile.parseDom(this.domNode,
- function(elmt, args){
- if(args.uf._isFileItemElmt(elmt)){
- args.testCount = args.testCount + 1;
- if(args.testCount==args.idx){
- args.fileItemDiv = elmt;
- return false;
- }
- }
- }, args, 2);
- return args.fileItemDiv;
- }
- this.init = function(){
- var mc = this.getMaxCount();
- UploadFile.debug("max count:"+mc);
- }
- this.init();
- }
- UploadFile.debug = function(s){
- if(typeof console != "undefined" && console.debug){
- console.debug(s);
- }
- }
- UploadFile.mixin = function(o, o2){
- for(var p in o2){
- o[p] = o2[p];
- }
- return o;
- }
- UploadFile.parseDom = function(/*HTMLElement*/ emt,
- /*function(HTMLElement childElmt, parm){break if return false;}*/ callback,
- parm,
- /*int, 0 is not limited, 1 is emt itself*/parseLevel
- ){
- if(!emt)return;
- if(false == callback(emt, parm))return false;
- if(1 == parseLevel || 0 > parseLevel) return;
- var _c = emt.firstChild;
- while(_c){
- if(false == UploadFile.parseDom(_c, callback, parm, parseLevel>1?parseLevel-1:0)){
- return false;
- }
- _c = _c.nextSibling;
- }
- }
- UploadFile.getFileName = function(fullPath){
- var fileParts = /[]([^]+)$/.exec(fullPath);
- return fileParts&&fileParts.length==2?fileParts[1]:fullPath;
- }
- UploadFile._getPartType=function(/*div*/ div){
- if(!div || !div.getAttribute)
- return null;
- return div.getAttribute("partType");
- }
- UploadFile._getDomNode=function(/*div*/ div){
- if(!div || !div.getAttribute)
- return null;
- return div.getAttribute("domNode");
- }
- function UploadFileItem(/*UploadFile*/ uf, /*int*/ idx){
- var uploadFileItem = this;
- this.domFileItem = null;
- this.domRemoveFile = null;
- this.domDown = null;
- this.domRemoveBtn = null;
- this.domRemain = null;
- this.domAddFile = null;
- this.domAddBtn = null;
- this.domAddBtnLabel = null;
- this.domAddInput = null;
- this.uf = uf;
- this.isFilled = function(){
- if(this.domRemain.checked)return true;
- if(!/^/s*$/.test(this.domAddInput.value))return true;
- return false;
- }
- this.getInput = function(){
- return this.domInput;
- }
- this.getRemain = function(){
- return this.domRemain.checked;
- }
- this.getFileName = function(){
- return this.domAddInput.value;
- }
- this.setLink = function(/*string*/aLabel, /*aLink*/ aHref){
- this.domDown.innerHTML = aLabel;
- this.domDown.href = aHref;
- this.domDown.title = aHref;
- }
- this.switchToRemoveStatus = function(){
- this.domAddFile.style.display="none";
- this.domRemoveFile.style.display="";
- }
- this.remove = function(){
- this.domFileItem.parentNode.removeChild(this.domFileItem);
- this.uf.addFileItem(null);
- }
- this.init = function(){
- var argsTestDomNodes = {};
- UploadFile.parseDom(this.uf._getFileItemElmt(idx),
- function(elmt, args){
- var dn = UploadFile._getDomNode(elmt);
- if(!dn)return;
- args[dn]=elmt;
- }, argsTestDomNodes, 0);
- UploadFile.mixin(this, argsTestDomNodes);
- this.domAddInput.onchange = function(){
- var uf = uploadFileItem.uf;
- var item = uploadFileItem;
- var count = uf.getCount();
- item.setLink(
- UploadFile.getFileName(item.domAddInput.value),
- item.domAddInput.value
- );
- item.switchToRemoveStatus();
- uf.domNode.appendChild(item.domFileItem);
- uf.addFileItem(null);
- } /* domAddInput.onchange */
- this.domRemoveBtn.onclick = function(){
- var fileName = uploadFileItem.domDown.innerText || uploadFileItem.domDown.textContent;
- if(confirm(uploadFileItem.uf.text.removeFileAlert.replace("[0]", fileName))!=true){
- return;
- }
- uploadFileItem.remove();
- } /* domRemoveBtn.onclick */
- }
- this.init();
- }
最终效果