自制的文件上传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 News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
javascript之typeof、instanceof操作符使用探讨
May 19 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
javascript日期计算实例分析
Jun 29 Javascript
jQuery实现form表单元素序列化为json对象的方法
Dec 09 Javascript
JS中this上下文对象使用方式
Oct 09 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
Mar 10 Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 Javascript
vue-router权限控制(简单方式)
Oct 29 Javascript
微信小程序tabBar设置实例解析
Nov 14 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下Memcached入门实例解析
2015/01/05 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
js获取所有checkbox的值的简单实例
2016/05/30 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
python基础教程之循环介绍
2014/08/29 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
对python 自定义协议的方法详解
2019/02/13 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
小学生作文评语
2014/04/18 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
销售经理工作检讨书
2015/02/19 职场文书
工作调动申请报告
2015/05/18 职场文书
政审证明材料
2015/06/19 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
2019军训心得体会
2019/06/27 职场文书