自制的文件上传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 easyui的tabs使用时的问题
Mar 23 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
Nov 15 Javascript
jquery获取复选框被选中的值
Mar 22 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
Apr 20 Javascript
javascript数字时钟示例分享
Apr 23 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
May 30 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 Javascript
浅谈JavaScript浅拷贝和深拷贝
Nov 07 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
一行python实现树形结构的方法
2019/08/09 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
工厂见习报告范文
2014/10/31 职场文书
具结保证书范本
2015/05/11 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书