upload.html頁面如下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>檔案上傳</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
border: 0;
}
html,body{
background: transparent;
overflow: hidden;
}
</style>
</head>
<body>
<form action="" enctype="multipart/form-data" method="post">
<input type="file" name="upload" id="upload" style="width:100%;height:200px;">
</form>
</body>
</html>
frameupload.js代碼如下
/**
* 將指定標籤[a或者button,input:button類比為檔案選擇按鈕, 選擇完成的檔案可以通過iframe上傳]
* @author shiyangyang
* @version 0.9.0
* @module frameUpload
* @since Chrome opera firefox & IE7+
*/
var FrameUpload = (function(require, exports, module){
var uri = iframeUri = 'upload.html', index = 0;
/**
* CSS賦值
* @param dom 操作的dom
* @param style 將要賦值的屬性列表
*/
var css = function(dom,style){
for(var k in style){
var v = style[k];
if( /width|height|left|right|top|bottom|size|radius/i.test(k) && /^\d+$/.test(v) ){
v += "px"; //含有這些字串的style屬性名稱支援一下純數字寫法
}
dom.style[k] = v;
if( k === "opacity" ){
dom.style.filter = "alpha(opacity=" + (v*100) + ")"; //相容一下IE的半透明效果
}
}
};
/**
* @param el 渲染按鈕
* @param change 修改file值觸發
* @param
*/
var Upload = function(opt){
var _index = index++;
var _this = this;
var dom = this.el = opt.el, uri = opt.src || iframeUri;
var style = { //根據指定按鈕 的盒模型 定位新建立的標籤
width : dom.offsetWidth,
height : dom.offsetHeight,
left : dom.offsetLeft,
top : dom.offsetTop,
border : 0,
position: 'absolute',
opacity : 0
};
var frame = this.frame = (function(){
var frame = document.createElement('iframe');
frame.id = frame.name = "ajaxFrame-" + _index;
frame.src = uri;
css(frame,style);
return frame;
})();
dom.parentNode.appendChild( frame ); //將iframe添加到指定按鈕父標籤下。
setInterval(function(){
var doc = frame.contentDocument;
try{ //若iframe關閉 關閉監聽
doc = doc || document.frames["ajaxFrame-"+_index].document;
}catch(e){
return false;
}
var input = doc.getElementById('upload');
if(input && !input.getAttribute('ajax-init') ){
var form = input.parentNode;
form.action = opt.action;
_this.submit = function(){
if( !input.value ){
throw new Error('需要選擇檔案');
}
var xhr;
if( opt.ajax && (xhr = window.XMLHttpRequest ? new XMLHttpRequest() : {}).upload ){ //支援ajax2.0直接的檔案上傳帶進度
xhr.upload.addEventListener('progress',opt.onprocess);
xhr.onreadystatechange = function(e){
if (xhr.readyState == 4){
var json;
try{
json = JSON.parse(xhr.responseText)
}catch(e){
// is not a JSON result
}
opt.afterUpload.call(frame,json,xhr);
}
};
var formdata = new FormData(form);
xhr.open("POST", opt.action, true);
xhr.send(formdata);
}else{ //普通的表單檔案上傳需要重新整理頁面
frame.onload = function(){
var doc_ = frame.contentDocument || document.frames["ajaxFrame-"+_index].document;
if( typeof opt.afterUpload === 'function' ){
try{
opt.afterUpload.call(frame, new Function("return "+doc_.body.innerHTML.replace(/[\r\n]+/,""))() );
}catch(e){
alert(e);
}
}
frame.onload = null;
frame.src = uri;
};
form.submit();
}
};
input.submit = _this.submit;
for(var e in opt){ //事件綁定,所有on開始的key都綁定到input上面
if( 0 === e.indexOf("on") && typeof opt[e] === 'function' ){
input[e] = opt[e];
}
}
input.setAttribute('ajax-init','true');
(typeof opt.ready === 'function') && opt.ready.call(input)
}
},200);
};
return Upload;
})();