| /*! | 
|   | 
|  @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(); | 
|   }); | 
| }); |