This repository has been archived on 2023-08-30. You can view files and clone it, but cannot push or open issues/pull-requests.
bytedo
/
wcui
Archived
1
0
Fork 0
wcui/js/lib/uploader/uploader.js

137 lines
3.5 KiB
JavaScript
Raw Normal View History

2017-03-30 01:40:59 +08:00
/**
* Uploader 无刷新上传文件(next版)
* 只支持chrome/firefox/IE10+/opera12+
* @authors yutent (yutent@doui.cc)
* @date 2016-09-05 19:33:23
*
*/
"use strict";
define(function(){
/* var isIE = !!window.VBArray
function IEVersion(){
if(document.documentMode)
return document.documentMode
return window.XMLHttpRequest ? 7 : 6
}*/
var Uploader = function(){
this.init()
}
Uploader.prototype = {
init: function(){
this.xhr = new XMLHttpRequest()
this.form = new FormData()
this.field = {}
this.header = {}
return this
},
setUrl: function(url){
if(!url || typeof url !== 'string')
return console.error('url不能为空且必须是字符串')
this.url = url
return this
},
setField: function(key, val){
if(typeof key === 'object'){
for(var i in key){
this.field[i] = key[i]
}
}else{
this.field[key] = val
}
return this
},
setHeader: function(key, val){
if(typeof key === 'object'){
for(var i in key){
this.header[i] = key[i]
}
}else{
this.header[key] = val
}
return this
},
start: function(){
var _this = this
if(!this.url)
return console.error('请先设置url')
this.xhr.open('POST', this.url, true)
for(var i in this.field){
this.form.append(i, this.field[i])
}
var startTime = Date.now()
this.xhr.upload.addEventListener('progress', function(evt){
if(evt.lengthComputable && _this.progress){
var now = Date.now()
var upSize = (evt.loaded * 1000) / 1024
var res = {loaded: evt.loaded, time: now - startTime}
res.speed = upSize / res.time
if(res.speed < 10){
res.speed = Math.floor(res.speed * 1024) + ' B/s'
}else{
res.speed = res.speed.toFixed(2) + ' KB/s'
}
res.progress = Math.round(evt.loaded * 100 / evt.total)
_this.progress(res)
}
}, false)
this.xhr.onreadystatechange = function(){
if(_this.xhr.readyState === 4 &&
_this.xhr.status === 200 &&
_this.xhr.responseText !== ''){
var res = _this.xhr.responseText
try{
res = JSON.parse(res)
}catch(err){}
_this.end && _this.end(res)
}else{
if(_this.xhr.status !== 200 && _this.xhr.responseText)
_this.error && _this.error(_this.xhr.responseText)
}
}
this.xhr.send(this.form)
},
onProgress: function(fn){
this.progress = fn
return this
},
onEnd: function(fn){
this.end = fn
return this
},
onError: function(fn){
this.error = fn
return this
}
}
if(!window.Uploader)
window.Uploader = Uploader
return Uploader
})