自制的文件上传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 相关文章推荐
juery框架写的弹窗效果适合新手
Nov 27 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
Javascript 是你的高阶函数(高级应用)
Jun 15 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
Dec 13 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
浅谈jQuery框架Ajax常用选项
Jul 08 jQuery
js中split()方法得到的数组长度问题
Jul 19 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
Aug 08 jQuery
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
vue中可编辑树状表格的实现代码
Oct 31 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分页类的代码
2011/05/18 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python如何解析配置文件并应用到项目中
2019/06/27 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
const和static readonly区别
2013/05/20 面试题
工作自我评价怎么写
2014/01/29 职场文书
大学三年计划书范文
2014/04/30 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
小学语文国培研修日志
2015/11/13 职场文书
2016大一新生军训感言
2015/12/08 职场文书
详解Python自动化之文件自动化处理
2021/06/21 Python
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
python利用while求100内的整数和方式
2021/11/07 Python
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL
spring 项目实现限流方法示例
2022/07/15 Java/Android