自制的文件上传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代码优化 选择符篇
Nov 01 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
javascript实现类似百度分享功能的方法
Jul 27 Javascript
jQuery实现图像旋转动画效果
May 29 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 Javascript
理解 Node.js 事件驱动机制的原理
Aug 16 Javascript
vue配置多页面的实现方法
May 22 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 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
JAVA/JSP学习系列之四
2006/10/09 PHP
php中apc缓存使用示例
2013/12/25 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
PHP调用其他文件中的类
2018/04/02 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
javascript 函数使用说明
2010/04/07 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
一道python走迷宫算法题
2018/01/22 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
自动化专业毕业生自荐信
2013/11/01 职场文书
婚前保证书
2014/04/29 职场文书
门店业绩提升方案
2014/06/08 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android
css3 文字断裂效果
2022/04/22 HTML / CSS