自制的文件上传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 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
jQuery 动画基础教程
Dec 25 Javascript
JS 字符串连接[性能比较]
May 10 Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
详谈commonjs模块与es6模块的区别
Oct 18 Javascript
利用ES6实现单例模式及其应用详解
Dec 09 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
深入理解vue中的slot与slot-scope
Apr 22 Javascript
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 Javascript
vue移动端的左右滑动事件详解
Jun 17 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取整数函数常用的四种方法小结
2012/07/05 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
Python批量查询域名是否被注册过
2017/06/21 Python
浅谈python迭代器
2017/11/08 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python三大神器之fabric使用教程
2019/06/10 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
详解pandas赋值失败问题解决
2020/11/29 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
物流管理应届生求职信
2013/11/07 职场文书
财务管理专业推荐信
2013/11/19 职场文书
董事长秘书职责
2014/01/31 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技