天天看点

兼容IE8的多文件上传实现

兼容IE8的注意点:

  1. 原生多文件属性multiple只在IE10/11上有效,IE8不兼容无法使用
  2. formdata对象同样只支持在IE10/11,IE8无法使用
  3. 很多API在IE8上无法使用,同样是兼容的难点
  4. IE8的安全机制,使一些操作无法实现

本文使用原生JS对文件进行简单处理实现多文件上传,未使用其他插件。

实现思路:

由于multiple属性无法使用,采取通过增加input框的方式实现多文件的选择和存储,故单次只能选择一个文件,可选择多次。

选择完一个文件之后,调用方法隐藏input,并将文件名以列表形式显示出来,并提供删除选项。

效果图:

兼容IE8的多文件上传实现

实现代码:

<!DOCTYPE html>
<html>

<head>
    <title>多文件上传</title>
    <meta charset="utf-8">
    <style>
        .file-select{
			position: relative;
		}
		/*设置透明*/
		.file-select input[type=file]{
			position: absolute;
			width: 50px;
		    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
		    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
		    opacity: 0;
		    -webkit-opacity: 0;
		    -moz-opacity: 0;
		    z-index: 100;
		}
		.brower{
			display: inline-block;
			width: 50px;
			position: absolute;
			left: 0px;
			color: skyblue;
		}
		.file-select input:hover + span.brower{
			text-decoration: underline;
		}
	</style>
</head>

<body>
    <form action="hello.do" method="post" enctype="multipart/form-data">
        <div id="eee">
            <span>选择文件:</span>
            <input type="submit"  value="提交" />
            <br />
            <div class="file-select" id="file_div1">
                <input type="file" name="UploadFile" onchange="fileChange()" />
                <span class="brower">浏览</span>
                <input type="button" onclick="deleteDiv()" style="display: none;" value="删除" />
            </div>
        </div>
    </form>
    <script>
    var FILECOUNT = 1;

    function fileChange() {

        var preDiv = document.getElementById("file_div" + FILECOUNT);
        var nextDiv = preDiv.cloneNode(true);
        FILECOUNT = FILECOUNT + 1;

        // 添加新的div
        nextDiv.setAttribute("id", "file_div" + FILECOUNT)
        document.getElementById("eee").appendChild(nextDiv);

        // 对已选完文件的div进行处理
        var preFile = preDiv.children[0],
            preSpan = preDiv.children[1],
            preButton = preDiv.children[2];
        preFile.style["display"] = "none";
        preSpan.className = "";
        preSpan.innerHTML = preFile.value;
        preButton.style["display"] = "inline-block";


    }

    // 删除方法
    function deleteDiv(event) {
        var ev = event || window.event;
        var target = ev.target || ev.srcElement;
        document.getElementById("eee").removeChild(target.parentNode);
    }
    </script>
</body>

</html>
           

持续更新:github地址