自制的文件上传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 相关文章推荐
jquery 最简单的属性菜单
Oct 08 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
Aug 02 Javascript
JavaScript极简入门教程(三):数组
Oct 25 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
利用JS生成博文目录及CSS定制博客
Feb 10 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
jquery实现点击页面回到顶部
Nov 23 Javascript
微信小程序-消息提示框实例
Nov 24 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
js动态生成表格(节点操作)
Jan 12 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
Python shelve模块实现解析
2019/08/28 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
教师自荐信
2013/12/10 职场文书
小区停车场管理制度
2014/01/27 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
可口可乐广告词
2014/03/20 职场文书
贷款担保申请书
2014/05/20 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
合作协议书范本
2014/10/25 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
Python基本数据类型之字符串str
2021/07/21 Python