自制的文件上传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中的call实现继承
Jan 22 Javascript
执行iframe中的javascript方法
Oct 07 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
Apr 02 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
js禁止表单重复提交
Aug 29 Javascript
最实用的JS数组函数整理
Dec 05 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 Javascript
vue router 跳转时打开新页面的示例方法
Jul 28 Javascript
es6函数之箭头函数用法实例详解
Apr 25 Javascript
swiperjs实现导航与tab页的联动
Dec 13 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
PHP 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP数组实例详解
2016/06/26 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
Javascript中的常见排序算法
2007/03/27 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
vue实现文件上传功能
2018/08/13 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
Python连接数据库学习之DB-API详解
2017/02/07 Python
Flask数据库迁移简单介绍
2017/10/24 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
np.dot()函数的用法详解
2020/01/17 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
物流专业求职计划书
2014/01/10 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript