完美的多文件上传效果

经过几天的搜索+提问,总算整合了一个比较完美的多文件上传效果。
 
在网上找到一些帖子都说是调用file控件的onclick,但是我发现实际是不行的,基于安全考虑,提交的时候会浏览器会清空file中的内容。
 
在51js上找到这句话,不过没有给代码:
 
因为安全问题脚本直接触发click()后附件是不允许提交的。google用了点hack,把input=file放到一个iframe里,然后通过js跨frame调用click()。
 
下面这个是吧51js上找到的代码 加上 CSDN一位牛人给的代码整合的效果。
 
< style >
a.addfile 
{
background
-image:url(http://p.mail.163.com/js31style/lib/0703131650/163blue/f1.gif);
background-repeat:no-repeat;
background
-position:-823px -17px;
display:block;
float:left;
height:20px;
margin
-top:-1px;
position:relative;
text
-decoration:none;
top:0pt;
width:80px;
}


input.addfile 
{
/*left:-18px;*/
}


input.addfile 
{
cursor:pointer 
!important;
height:18px;
left:
-13px;
filter:alpha(opacity
=0); 
position:absolute;
top:5px;
width:1px;
z
-index: -1;
}

style >

< script type = " text/javascript " >

function  MultiSelector( list_target, max ) {

    
// Where to write the list
    this.list_target = list_target;
    
// How many elements?
    this.count = 0;
    
// How many elements?
    this.id = 0;
    
// Is there a maximum?
    if( max ){
        
this.max = max;
    }
 else {
        
this.max = -1;
    }
;
    
    
/**
     * Add a new file input element
     
*/

    
this.addElement = function( element ){

        
// Make sure it's a file input element
        if( element.tagName == 'INPUT' && element.type == 'file' ){

            
// Element name -- what number am I?
            element.name = 'file_' + this.id++;
                        
            
// Add reference to this object
            element.multi_selector = this;

            
// What to do when a file is selected
            element.onchange = function(){

                
// New file input
                var new_element = document.createElement( 'input' );
                new_element.type 
= 'file';
                new_element.size 
= 1;
                new_element.className 
= "addfile";

                
// Add new element
                this.parentNode.insertBefore( new_element, this );

                
// Apply 'update' to element
                this.multi_selector.addElement( new_element );

                
// Update list
                this.multi_selector.addListRow( this );

                
// Hide this: we can't use display:none because Safari doesn't like it
                this.style.position = 'absolute';
                
this.style.left = '-1000px';

            }
;
            
            
            
// If we've reached maximum number, disable input element
            ifthis.max != -1 && this.count >= this.max ){
                element.disabled 
= true;
            }
;

            
// File element counter
            this.count++;
            
// Most recent element
            this.current_element = element;
            
        }
 else {
            
// This can only be applied to file input elements!
            alert( 'Error: not a file input element' );
        }
;

    }
;
    

    
/**
     * Add a new row to the list of files
     
*/

    
this.addListRow = function( element ){

        
// Row div
        var new_row = document.createElement( 'div' );

        
        
// Delete button
        var new_row_button = document.createElement( 'input' );
        new_row_button.type 
= 'button';
        new_row_button.value 
= 'Delete';
        

        
// References
        new_row.element = element;

        
// Delete function
        new_row_button.onclick= function(){

            
// Remove element from form
            this.parentNode.element.parentNode.removeChild( this.parentNode.element );

            
// Remove this row from the list
            this.parentNode.parentNode.removeChild( this.parentNode );

            
// Decrement counter
            this.parentNode.element.multi_selector.count--;

            
// Re-enable input element (if it's disabled)
            this.parentNode.element.multi_selector.current_element.disabled = false;

            
// Appease Safari
            //    without it Safari wants to reload the browser window
            //    which nixes your already queued uploads
            return false;
        }
;

        
// Set row value
        new_row.innerHTML = element.value;


        
// Add button
        new_row.appendChild( new_row_button );

        
// Add it to the list
        this.list_target.appendChild( new_row );
        
    }
;

}
;    
script >
head >

< body >


< form enctype = " multipart/form-data "  action = " your_script_here.script "  method  =   " post " >
    

    
< a href = # ?  class = " addfile " >
        
< input id = " my_file_element "  class = " addfile "  type = " file "  name = " file_1 "  size = " 1 " >
    
a >
    
< input type = " submit "  value = 上传 >
form >

Files:

< div id = " files_list "  style = " padding:5px;border:1px;border-style:solid;border-color:#0000ff;height:100px;width:600px; " > div >
< script >
    

    
var  multi_selector  =   new  MultiSelector( document.getElementById(  ' files_list '  ),  100  );
    

    multi_selector.addElement( document.getElementById( 
' my_file_element '  ) );
script >
 
把真正的file控件作了透明处理,当你点链接的时候实际点的是file控件的上传按钮。 

你可能感兴趣的:(Javascript)