自制的文件上传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 相关文章推荐
详细讲解JS节点知识
Jan 31 Javascript
Jquery iframe内部出滚动条
Feb 11 Javascript
js禁止回车提交表单的示例代码
Dec 23 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
jquery控制页面部分刷新的方法
Jun 24 Javascript
node.js cookie-parser 中间件介绍
Jun 06 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
bootstrapValidator 重新启用提交按钮的方法
Feb 20 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
JavaScript中while循环的基础使用教程
Aug 11 Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 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&amp;mysql(三)
2006/10/09 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
Javascript 读书笔记索引贴
2010/01/11 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python基础之文件读取的讲解
2019/02/16 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Python中常见的数制转换有哪些
2020/05/27 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
教育孩子心得体会
2014/01/01 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
父母对孩子说的话
2014/04/12 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
会计求职自荐信范文
2015/03/04 职场文书
详解Laravel制作API接口
2021/05/31 PHP
Java实现聊天机器人完善版
2021/07/04 Java/Android
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
Vue操作Storage本地化存储
2022/04/29 Vue.js