input file 美化及上传本地预览

 

效果:

 

/*input file 美化及上传本地预览,兼容IE6-8,FIrefox, Chrome(需在服务端,本地无效)*/
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>input file 美化</title>
    <script src="jquery-1.8.2.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("input[type = 'file']").change(function () {
                var explorer = window.navigator.userAgent;
                var url = document.getElementById("image");
                var file = document.getElementById("file");
                if (explorer.indexOf("MSIE") >= 0) {
                    file.select();
                    url.src = document.selection.createRange().text;
                }
                else if (explorer.indexOf("Firefox") >= 0 || explorer.indexOf("Chrome") >= 0) {
                    var oFReader = new FileReader();
                    var oFile = file.files[0];
                    oFReader.onload = function (e) {
                        url.src = e.target.result;
                    }
                    oFReader.readAsDataURL(oFile);
                }
            });
        })
    </script>
    <style>
        * { margin: 0; padding: 0; }

        a { text-decoration: none; }

        .btn_addPic {
            display: block;
            position: relative;
            width: 140px;
            height: 39px;
            overflow: hidden;
            border: 1px solid #EBEBEB;
            background: none repeat scroll 0 0 #F3F3F3;
            color: #999999;
            cursor: pointer;
            text-align: center;
        }
        .btn_addPic span { display: block; line-height: 39px; }

        .btn_addPic em {
            background: url(add.png) 0 0;
            display: inline-block;
            width: 18px;
            height: 18px;
            overflow: hidden;
            margin: 10px 5px 10px 0;
            line-height: 20em;
            vertical-align: middle;
        }
        .btn_addPic:hover em { background-position: -19px 0; }

        .filePrew {
            display: block;
            position: absolute;
            top: 0;
            left: 0;
            width: 140px;
            height: 39px;
            font-size: 100px; /* 增大不同浏览器的可点击区域 */
            opacity: 0; /* 实现的关键点 */
            filter: alpha(opacity=0); /* 兼容IE */
        }

        #min_img { width: 100px; }
        
        #min_img img { width: 100%; }
    </style>
    
</head>
<body>
<form>
    <a href="javascript:void(0);" class="btn_addPic">
        <span><em>+</em>添加图片</span>
        <input tabindex="3" title=" 支持jpg、jpeg、gif、png格式,文件小于 5M" size="3" name="file" id="file" class="filePrew" type="file">
    </a>
    <div id="min_img"><img id="image" /></div>
</form>
</body>
</html>

  add.png

 

**********************************************************************************************************************

input file美化原理:将input file透明值设为0(opacity: 0;),就不会显示,但是占据位置,可以相应操作,然后在它上面或下面放上美化的元素即可。

**********************************************************************************************************************

1. IE6可以使用value属性获取绝对路径
例:
 $("input[type = 'file']").change(function () {
            var url= $(this).val();
 });

IE7 8本地可以获取地址,服务器只能获取名字,可以使用以下方式获取,支持IE6-8。
file.select();
url.src = document.selection.createRange().text;

2. 火狐和谷歌可以使用html5的File API中得FileReader获取本地路径

    readAsArrayBuffer(file):将文件读取为ArrayBuffer。
    readAsBinaryString(file):将文件读取为二进制字符串
    readAsDataURL(file):将文件读取为Data URL
    readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'

 

   FileReader对象在读取文件后,还需要进行处理。为了不阻塞当前线程,API采用了事件模型,可以注册这些事件:

    onabort:中断时触发
    onerror:出错时触发
    onload:文件成功读取完毕时触发
    onloadend:文件读取完毕时触发,无论是否失败
    onloadstart:文件开始读取时触发
    onprogress:当文件读取时,周期性地触发

 

例:

 $("input[type = 'file']").change(function () {
            var oFReader = new FileReader();
            var oFile = document.getElementById("file").files[0];

            oFReader.onload = function(e) {
                 document.getElementById("image").src = e.target.result;  /*不可传递给变量*/
            }
            
            oFReader.readAsDataURL(oFile);
   });


3. 谷歌可以使用window.webkitURL.createObjectURL(file.files[0])获取本地路径
例:
 $("input[type = 'file']").change(function () {
            var docObj=document.getElementById("file");
            var imgurl= window.webkitURL.createObjectURL(docObj.files[0]);
 });

注: 2 3谷歌必须在服务器端才可有效果,2火狐本地可用。

 

posted @ 2014-12-03 10:53  K13  阅读(301)  评论(0编辑  收藏  举报