自制的文件上传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 相关文章推荐
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
Apr 20 Javascript
JS鼠标事件大全 推荐收藏
Nov 01 Javascript
JavaScript中按位“异或”运算符使用介绍
Mar 14 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
js事件处理程序跨浏览器解决方案
Mar 27 Javascript
JavaScript实现in-place思想的快速排序方法
Aug 07 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
Oct 25 Javascript
jQuery 常见小例汇总
Dec 14 Javascript
Vue 中mixin 的用法详解
Apr 23 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 Javascript
用js编写留言板
Mar 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中文本操作的类
2007/03/17 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
学习ExtJS Column布局
2009/10/08 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
如何使用repr调试python程序
2020/02/28 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
Python用Jira库来操作Jira
2020/12/28 Python
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
药学专业个人的自我评价
2013/12/31 职场文书
团组织关系介绍信
2014/01/12 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
大学生自我鉴定书
2014/03/24 职场文书
单位承诺书格式
2014/05/21 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
实习单位意见
2015/06/04 职场文书
出生证明范本
2015/06/15 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js