123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- /*!
- @Title: layui.upload 单文件上传 - 全浏览器兼容版
- @Author: 贤心
- @License:MIT
- */
-
- layui.define(['layer-mobile', 'zepto'] , function(exports){
- "use strict";
-
- var $ = layui.zepto;
- var layer = layui['layer-mobile'];
- var device = layui.device();
-
- var elemDragEnter = 'layui-upload-enter';
- var elemIframe = 'layui-upload-iframe';
-
- var msgConf = {
- icon: 2
- ,shift: 6
- }, fileType = {
- file: '文件'
- ,video: '视频'
- ,audio: '音频'
- };
-
- layer.msg = function(content){
- return layer.open({
- content: content || ''
- ,skin: 'msg'
- ,time: 2 //2秒后自动关闭
- });
- };
-
- var Upload = function(options){
- this.options = options;
- };
-
- //初始化渲染
- Upload.prototype.init = function(){
- var that = this, options = that.options;
- var body = $('body'), elem = $(options.elem || '.layui-upload-file');
- var iframe = $('<iframe id="'+ elemIframe +'" class="'+ elemIframe +'" name="'+ elemIframe +'"></iframe>');
-
- //插入iframe
- $('#'+elemIframe)[0] || body.append(iframe);
-
- return elem.each(function(index, item){
- item = $(item);
- var form = '<form target="'+ elemIframe +'" method="'+ (options.method||'post') +'" key="set-mine" enctype="multipart/form-data" action="'+ (options.url||'') +'"></form>';
-
- var type = item.attr('lay-type') || options.type; //获取文件类型
- //包裹ui元素
- if(!options.unwrap){
- form = '<div class="layui-box layui-upload-button">' + form + '<span class="layui-upload-icon"><i class="layui-icon"></i>'+ (
- item.attr('lay-title') || options.title|| ('上传'+ (fileType[type]||'图片') )
- ) +'</span></div>';
- }
-
- form = $(form);
-
- //拖拽支持
- if(!options.unwrap){
- form.on('dragover', function(e){
- e.preventDefault();
- $(this).addClass(elemDragEnter);
- }).on('dragleave', function(){
- $(this).removeClass(elemDragEnter);
- }).on('drop', function(){
- $(this).removeClass(elemDragEnter);
- });
- }
-
- //如果已经实例化,则移除包裹元素
- if(item.parent('form').attr('target') === elemIframe){
- if(options.unwrap){
- item.unwrap();
- } else {
- item.parent().next().remove();
- item.unwrap().unwrap();
- }
- };
-
- //包裹元素
- item.wrap(form);
-
- //触发上传
- item.off('change').on('change', function(){
- that.action(this, type);
- });
- });
- };
-
- //提交上传
- Upload.prototype.action = function(input, type){
- var that = this, options = that.options, val = input.value;
- var item = $(input), ext = item.attr('lay-ext') || options.ext || ''; //获取支持上传的文件扩展名;
- if(!val){
- return;
- };
-
- //校验文件
- switch(type){
- case 'file': //一般文件
- if(ext && !RegExp('\\w\\.('+ ext +')$', 'i').test(escape(val))){
- layer.msg('不支持该文件格式', msgConf);
- return input.value = '';
- }
- break;
- case 'video': //视频文件
- if(!RegExp('\\w\\.('+ (ext||'avi|mp4|wma|rmvb|rm|flash|3gp|flv') +')$', 'i').test(escape(val))){
- layer.msg('不支持该视频格式', msgConf);
- return input.value = '';
- }
- break;
- case 'audio': //音频文件
- if(!RegExp('\\w\\.('+ (ext||'mp3|wav|mid') +')$', 'i').test(escape(val))){
- layer.msg('不支持该音频格式', msgConf);
- return input.value = '';
- }
- break;
- default: //图片文件
- if(!RegExp('\\w\\.('+ (ext||'jpg|png|gif|bmp|jpeg') +')$', 'i').test(escape(val))){
- layer.msg('不支持该图片格式', msgConf);
- return input.value = '';
- }
- break;
- }
-
- options.before && options.before(input);
- item.parent().submit();
- var iframe = $('#'+elemIframe), timer = setInterval(function() {
- var res;
- try {
- res = iframe.contents().find('body').text();
- } catch(e) {
- layer.msg('上传接口存在跨域', msgConf);
- clearInterval(timer);
- }
- if(res){
- clearInterval(timer);
- iframe.contents().find('body').html('');
- try {
- res = JSON.parse(res);
- } catch(e){
- res = {};
- return layer.msg('请对上传接口返回JSON字符', msgConf);
- }
- typeof options.success === 'function' && options.success(res, input);
- }
- }, 30);
-
- input.value = '';
- };
-
- //暴露接口
- exports('upload-mobile', function(options){
- var upload = new Upload(options = options || {});
- upload.init();
- });
- });
|