mirror of https://github.com/layui/layui
优化 upload 代码细节
parent
fbb83b52fd
commit
84d38544d5
|
@ -6,76 +6,83 @@
|
||||||
layui.define(['lay','layer'], function(exports){
|
layui.define(['lay','layer'], function(exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var $ = layui.$
|
var $ = layui.$;
|
||||||
,layer = layui.layer
|
var layer = layui.layer;
|
||||||
,device = layui.device()
|
var device = layui.device();
|
||||||
|
|
||||||
//外部接口
|
// 外部接口
|
||||||
,upload = {
|
var upload = {
|
||||||
config: {} //全局配置项
|
config: {}, // 全局配置项
|
||||||
|
// 设置全局项
|
||||||
//设置全局项
|
set: function(options){
|
||||||
,set: function(options){
|
|
||||||
var that = this;
|
var that = this;
|
||||||
that.config = $.extend({}, that.config, options);
|
that.config = $.extend({}, that.config, options);
|
||||||
return that;
|
return that;
|
||||||
}
|
},
|
||||||
|
// 事件
|
||||||
//事件
|
on: function(events, callback){
|
||||||
,on: function(events, callback){
|
|
||||||
return layui.onevent.call(this, MOD_NAME, events, callback);
|
return layui.onevent.call(this, MOD_NAME, events, callback);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//操作当前实例
|
// 操作当前实例
|
||||||
,thisUpload = function(){
|
var thisUpload = function(){
|
||||||
var that = this;
|
var that = this;
|
||||||
return {
|
return {
|
||||||
upload: function(files){
|
upload: function(files){
|
||||||
that.upload.call(that, files);
|
that.upload.call(that, files);
|
||||||
}
|
},
|
||||||
,reload: function(options){
|
reload: function(options){
|
||||||
that.reload.call(that, options);
|
that.reload.call(that, options);
|
||||||
}
|
},
|
||||||
,config: that.config
|
config: that.config
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//字符常量
|
// 字符常量
|
||||||
,MOD_NAME = 'upload', ELEM = 'layui-upload', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled'
|
var MOD_NAME = 'upload';
|
||||||
|
var ELEM = 'layui-upload';
|
||||||
|
var THIS = 'layui-this';
|
||||||
|
var SHOW = 'layui-show';
|
||||||
|
var HIDE = 'layui-hide';
|
||||||
|
var DISABLED = 'layui-disabled';
|
||||||
|
|
||||||
,ELEM_FILE = 'layui-upload-file', ELEM_FORM = 'layui-upload-form', ELEM_IFRAME = 'layui-upload-iframe', ELEM_CHOOSE = 'layui-upload-choose', ELEM_DRAG = 'layui-upload-drag'
|
var ELEM_FILE = 'layui-upload-file';
|
||||||
|
var ELEM_FORM = 'layui-upload-form';
|
||||||
|
var ELEM_IFRAME = 'layui-upload-iframe';
|
||||||
|
var ELEM_CHOOSE = 'layui-upload-choose';
|
||||||
|
var ELEM_DRAG = 'layui-upload-drag';
|
||||||
|
|
||||||
|
|
||||||
//构造器
|
// 构造器
|
||||||
,Class = function(options){
|
var Class = function(options){
|
||||||
var that = this;
|
var that = this;
|
||||||
that.config = $.extend({}, that.config, upload.config, options);
|
that.config = $.extend({}, that.config, upload.config, options);
|
||||||
that.render();
|
that.render();
|
||||||
};
|
};
|
||||||
|
|
||||||
//默认配置
|
// 默认配置
|
||||||
Class.prototype.config = {
|
Class.prototype.config = {
|
||||||
accept: 'images' //允许上传的文件类型:images/file/video/audio
|
accept: 'images', // 允许上传的文件类型:images/file/video/audio
|
||||||
,exts: '' //允许上传的文件后缀名
|
exts: '', // 允许上传的文件后缀名
|
||||||
,auto: true //是否选完文件后自动上传
|
auto: true, // 是否选完文件后自动上传
|
||||||
,bindAction: '' //手动上传触发的元素
|
bindAction: '', // 手动上传触发的元素
|
||||||
,url: '' //上传地址
|
url: '', // 上传地址
|
||||||
,force: '' //强制规定返回的数据格式,目前只支持是否强制 json
|
force: '', // 强制规定返回的数据格式,目前只支持是否强制 json
|
||||||
,field: 'file' //文件字段名
|
field: 'file', // 文件字段名
|
||||||
,acceptMime: '' //筛选出的文件类型,默认为所有文件
|
acceptMime: '', // 筛选出的文件类型,默认为所有文件
|
||||||
,method: 'post' //请求上传的 http 类型
|
method: 'post', // 请求上传的 http 类型
|
||||||
,data: {} //请求上传的额外参数
|
data: {}, // 请求上传的额外参数
|
||||||
,drag: true //是否允许拖拽上传
|
drag: true, // 是否允许拖拽上传
|
||||||
,size: 0 //文件限制大小,默认不限制
|
size: 0, // 文件限制大小,默认不限制
|
||||||
,number: 0 //允许同时上传的文件数,默认不限制
|
number: 0, // 允许同时上传的文件数,默认不限制
|
||||||
,multiple: false //是否允许多文件上传,不支持ie8-9
|
multiple: false // 是否允许多文件上传,不支持ie8-9
|
||||||
};
|
};
|
||||||
|
|
||||||
//初始渲染
|
// 初始渲染
|
||||||
Class.prototype.render = function(options){
|
Class.prototype.render = function(options){
|
||||||
var that = this
|
var that = this;
|
||||||
,options = that.config;
|
var options = that.config;
|
||||||
|
|
||||||
options.elem = $(options.elem);
|
options.elem = $(options.elem);
|
||||||
options.bindAction = $(options.bindAction);
|
options.bindAction = $(options.bindAction);
|
||||||
|
@ -86,14 +93,14 @@ layui.define(['lay','layer'], function(exports){
|
||||||
|
|
||||||
//追加文件域
|
//追加文件域
|
||||||
Class.prototype.file = function(){
|
Class.prototype.file = function(){
|
||||||
var that = this
|
var that = this;
|
||||||
,options = that.config
|
var options = that.config;
|
||||||
,elemFile = that.elemFile = $([
|
var elemFile = that.elemFile = $([
|
||||||
'<input class="'+ ELEM_FILE +'" type="file" accept="'+ options.acceptMime +'" name="'+ options.field +'"'
|
'<input class="'+ ELEM_FILE +'" type="file" accept="'+ options.acceptMime +'" name="'+ options.field +'"'
|
||||||
,(options.multiple ? ' multiple' : '')
|
,(options.multiple ? ' multiple' : '')
|
||||||
,'>'
|
,'>'
|
||||||
].join(''))
|
].join(''));
|
||||||
,next = options.elem.next();
|
var next = options.elem.next();
|
||||||
|
|
||||||
if(next.hasClass(ELEM_FILE) || next.hasClass(ELEM_FORM)){
|
if(next.hasClass(ELEM_FILE) || next.hasClass(ELEM_FORM)){
|
||||||
next.remove();
|
next.remove();
|
||||||
|
@ -105,8 +112,8 @@ layui.define(['lay','layer'], function(exports){
|
||||||
}
|
}
|
||||||
|
|
||||||
that.isFile() ? (
|
that.isFile() ? (
|
||||||
that.elemFile = options.elem
|
that.elemFile = options.elem,
|
||||||
,options.field = options.elem[0].name
|
options.field = options.elem[0].name
|
||||||
) : options.elem.after(elemFile);
|
) : options.elem.after(elemFile);
|
||||||
|
|
||||||
//初始化ie8/9的Form域
|
//初始化ie8/9的Form域
|
||||||
|
@ -117,10 +124,10 @@ layui.define(['lay','layer'], function(exports){
|
||||||
|
|
||||||
//ie8-9初始化
|
//ie8-9初始化
|
||||||
Class.prototype.initIE = function(){
|
Class.prototype.initIE = function(){
|
||||||
var that = this
|
var that = this;
|
||||||
,options = that.config
|
var options = that.config;
|
||||||
,iframe = $('<iframe id="'+ ELEM_IFRAME +'" class="'+ ELEM_IFRAME +'" name="'+ ELEM_IFRAME +'" frameborder="0"></iframe>')
|
var iframe = $('<iframe id="'+ ELEM_IFRAME +'" class="'+ ELEM_IFRAME +'" name="'+ ELEM_IFRAME +'" frameborder="0"></iframe>');
|
||||||
,elemForm = $(['<form target="'+ ELEM_IFRAME +'" class="'+ ELEM_FORM +'" method="post" key="set-mine" enctype="multipart/form-data" action="'+ options.url +'">'
|
var elemForm = $(['<form target="'+ ELEM_IFRAME +'" class="'+ ELEM_FORM +'" method="post" key="set-mine" enctype="multipart/form-data" action="'+ options.url +'">'
|
||||||
,'</form>'].join(''));
|
,'</form>'].join(''));
|
||||||
|
|
||||||
//插入iframe
|
//插入iframe
|
||||||
|
@ -480,15 +487,15 @@ layui.define(['lay','layer'], function(exports){
|
||||||
delete options.elem;
|
delete options.elem;
|
||||||
delete options.bindAction;
|
delete options.bindAction;
|
||||||
|
|
||||||
var that = this
|
var that = this;
|
||||||
,options = that.config = $.extend({}, that.config, upload.config, options)
|
var options = that.config = $.extend({}, that.config, upload.config, options);
|
||||||
,next = options.elem.next();
|
var next = options.elem.next();
|
||||||
|
|
||||||
//更新文件域相关属性
|
//更新文件域相关属性
|
||||||
next.attr({
|
next.attr({
|
||||||
name: options.name
|
name: options.name,
|
||||||
,accept: options.acceptMime
|
accept: options.acceptMime,
|
||||||
,multiple: options.multiple
|
multiple: options.multiple
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -508,9 +515,9 @@ layui.define(['lay','layer'], function(exports){
|
||||||
|
|
||||||
// 设置选择的文本
|
// 设置选择的文本
|
||||||
var setChooseText = function(files, filename){
|
var setChooseText = function(files, filename){
|
||||||
var elemFile = that.elemFile
|
var elemFile = that.elemFile;
|
||||||
,item = options.item ? options.item : options.elem
|
var item = options.item ? options.item : options.elem;
|
||||||
,value = files.length > 1
|
var value = files.length > 1
|
||||||
? files.length + '个文件'
|
? files.length + '个文件'
|
||||||
: ((files[0] || {}).name || (elemFile[0].value.match(/[^\/\\]+\..+/g)||[]) || '');
|
: ((files[0] || {}).name || (elemFile[0].value.match(/[^\/\\]+\..+/g)||[]) || '');
|
||||||
|
|
||||||
|
@ -534,7 +541,7 @@ layui.define(['lay','layer'], function(exports){
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//点击上传容器
|
// 点击上传容器
|
||||||
options.elem.off('upload.start').on('upload.start', function(){
|
options.elem.off('upload.start').on('upload.start', function(){
|
||||||
var othis = $(this);
|
var othis = $(this);
|
||||||
|
|
||||||
|
@ -543,7 +550,7 @@ layui.define(['lay','layer'], function(exports){
|
||||||
that.elemFile[0].click();
|
that.elemFile[0].click();
|
||||||
});
|
});
|
||||||
|
|
||||||
//拖拽上传
|
// 拖拽上传
|
||||||
if(!(device.ie && device.ie < 10)){
|
if(!(device.ie && device.ie < 10)){
|
||||||
options.elem.off('upload.over').on('upload.over', function(){
|
options.elem.off('upload.over').on('upload.over', function(){
|
||||||
var othis = $(this)
|
var othis = $(this)
|
||||||
|
@ -561,25 +568,25 @@ layui.define(['lay','layer'], function(exports){
|
||||||
extendAttrs.call(this);
|
extendAttrs.call(this);
|
||||||
setChooseFile(files);
|
setChooseFile(files);
|
||||||
|
|
||||||
options.auto ? that.upload() : setChooseText(files); //是否自动触发上传
|
options.auto ? that.upload() : setChooseText(files); // 是否自动触发上传
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//文件选择
|
// 文件选择
|
||||||
that.elemFile.off('upload.change').on('upload.change', function(){
|
that.elemFile.off('upload.change').on('upload.change', function(){
|
||||||
var files = this.files || [];
|
var files = this.files || [];
|
||||||
|
|
||||||
extendAttrs.call(this);
|
extendAttrs.call(this);
|
||||||
setChooseFile(files);
|
setChooseFile(files);
|
||||||
options.auto ? that.upload() : setChooseText(files); //是否自动触发上传
|
options.auto ? that.upload() : setChooseText(files); // 是否自动触发上传
|
||||||
});
|
});
|
||||||
|
|
||||||
//手动触发上传
|
// 手动触发上传
|
||||||
options.bindAction.off('upload.action').on('upload.action', function(){
|
options.bindAction.off('upload.action').on('upload.action', function(){
|
||||||
that.upload();
|
that.upload();
|
||||||
});
|
});
|
||||||
|
|
||||||
//防止事件重复绑定
|
// 防止事件重复绑定
|
||||||
if(options.elem.data('haveEvents')) return;
|
if(options.elem.data('haveEvents')) return;
|
||||||
|
|
||||||
that.elemFile.on('change', function(){
|
that.elemFile.on('change', function(){
|
||||||
|
@ -610,7 +617,7 @@ layui.define(['lay','layer'], function(exports){
|
||||||
options.elem.data('haveEvents', true);
|
options.elem.data('haveEvents', true);
|
||||||
};
|
};
|
||||||
|
|
||||||
//核心入口
|
// 核心入口
|
||||||
upload.render = function(options){
|
upload.render = function(options){
|
||||||
var inst = new Class(options);
|
var inst = new Class(options);
|
||||||
return thisUpload.call(inst);
|
return thisUpload.call(inst);
|
||||||
|
|
Loading…
Reference in New Issue