自制的文件上传JS控件可支持IE、chrome、firefox etc


Posted in Javascript onApril 18, 2014
(function() { 
if (window.FileUpload) { 
return; 
} 
window.FileUpload = function (id, url) { 
this.id = id; 
this.autoUpload = true; 
this.url = url; 
this.maxSize = null; 
this.extensions = null; 
this.dropId = null; 
}; window.FileUpload.prototype.init = function() { 
var obj = this; 
$('#' + this.id).change(function () { 
if (obj.autoUpload) { 
obj.upload(); 
} 
}); 
if (this.supportsFormData()) { 
if (this.dropId != null) { 
var drop = $('#' + this.dropId)[0]; 
drop.addEventListener("dragover", function(e) { 
e.stopPropagation(); 
e.preventDefault(); 
$('#' + obj.dropId).addClass("dragover"); 
}, false); 
drop.addEventListener("dragout", function(e) { 
$('#' + obj.dropId).removeClass("dragover"); 
}, false); 
drop.addEventListener("drop", function(e) { 
e.stopPropagation(); 
e.preventDefault(); 
$('#' + obj.dropId).removeClass("dragover"); 
obj._uploadUsingFormData(e.dataTransfer.files[0]); 
}, false); 
} 
} else { 
if (this.dropId != null) { 
$('#' + this.dropId).hide(); 
} 
} 
}; 
FileUpload.prototype.supportsFormData = function() { 
return window.FormData != undefined; 
}; 
FileUpload.prototype.upload = function() { 
if (this.supportsFormData()) { 
this._uploadUsingFormData($("#" + this.id)[0].files[0]); 
} else { 
this._uploadUsingFrame(); 
} 
}; 
FileUpload.prototype._uploadUsingFrame = function() { 
var obj = this; 
var $frame = $('#uploadFrame'); 
if ($frame.length == 0) { 
$frame = $('<iframe id="uploadFrame" width="0" height="0" name="uploadFrame" src=""></iframe>'); 
$frame.appendTo("body"); 
$frame.load(function() { 
var response = $frame.contents().text(); 
try { 
var json = $.parseJSON(response); 
$(obj).trigger("onLoad", json); 
} catch(ex) { 
$(obj).trigger("onError", response); 
} 
}); 
} 
var form = $("#" + this.id).closest("form")[0]; 
form.target = 'uploadFrame'; 
form.submit(); 
}; 
FileUpload.prototype._uploadUsingFormData = function (file) { 
var obj = this; 
var xhr = new XMLHttpRequest(); 
xhr.addEventListener("load", function (e) { 
var json = $.parseJSON(xhr.response); 
$(obj).trigger("onLoad", json); 
}, false); 
xhr.addEventListener("error", function (e) { 
$(obj).trigger("onError", e); 
}, false); 
xhr.upload.addEventListener("progress", function (e) { 
if (e.lengthComputable) { 
$(obj).trigger("onProgress", e.loaded, e.total); 
} 
}, false); 
xhr.open("POST", obj.url); 
if (obj.maxSize != null&&file.size>obj.maxSize) { 
$(obj).trigger("onMaxSizeError"); 
return; 
} 
if (obj.extensions != null) { 
var name = file.name; 
var ext = name.substring(name.lastIndexOf("."), name.length).toLowerCase(); 
if (obj.extensions.indexOf(ext) < 0) { 
$(obj).trigger("onExtensionError"); 
return; 
} 
} 
var formData = new FormData(); 
formData.append("files", file); 
xhr.send(formData); 
}; 
FileUpload.prototype.onLoad = function(handler) { 
$(this).bind("onLoad", function(sender, args) { 
handler && handler(args); 
}); 
}; 
FileUpload.prototype.onProgress = function (handler) { 
$(this).bind("onProgress", function(sender, loaded, total) { 
handler && handler(loaded, total); 
}); 
}; 
FileUpload.prototype.onError = function (handler) { 
$(this).bind("onError", function(sender, error) { 
handler && handler(error); 
}); 
}; 
FileUpload.prototype.onMaxSizeError = function(handler) { 
$(this).bind("onMaxSizeError", handler); 
}; 
FileUpload.prototype.onExtensionError = function (handler) { 
$(this).bind("onExtensionError", handler); 
}; 
})();
Javascript 相关文章推荐
用roll.js实现的图片自动滚动+鼠标触动的特效
Mar 18 Javascript
JavaScript Accessor实现说明
Dec 06 Javascript
TextArea不支持maxlength的解决办法(jquery)
Sep 13 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
js编写三级联动简单案例
Dec 21 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
Mar 17 Javascript
JavaScript对JSON数据进行排序和搜索
Jul 24 Javascript
VSCode配置react开发环境的步骤
Dec 27 Javascript
vue-cli 3 全局过滤器的实例代码详解
Jun 03 Javascript
禁用Tab键JS代码兼容Firefox和IE
Apr 18 #Javascript
JQuery each()嵌套使用小结
Apr 18 #Javascript
JavaScript编程的10个实用小技巧
Apr 18 #Javascript
jquery库或JS文件在eclipse下报错问题解决方法
Apr 17 #Javascript
js截取中英文字符串、标点符号无乱码示例解读
Apr 17 #Javascript
jQuery中对未来的元素绑定事件用bind、live or on
Apr 17 #Javascript
jQuery模拟点击A标记示例参考
Apr 17 #Javascript
You might like
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
js获取input标签的输入值实现代码
2013/08/05 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
如何编写jquery插件
2017/03/29 jQuery
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
Vue中CSS动画原理的实现
2019/02/13 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
Python扩展内置类型详解
2018/03/26 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
护理专业毕业生推荐信
2013/10/31 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
老师对学生的寄语
2014/04/09 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
自荐信格式范文
2015/03/04 职场文书
公司慰问信范文
2015/03/23 职场文书
立春观后感
2015/06/18 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python