/** * @fileoverview flash上传按钮 * @author: 紫英(橘子), 剑平(明河) **/ KISSY.add('gallery/form/1.3/uploader/button/swfButton', function (S, Node, Base, SwfUploader) { var EMPTY = '', $ = Node.all, SWF_WRAPPER_ID_PREVFIX = 'swf-uploader-wrapper-'; /** * @name SwfButton * @class flash上传按钮,基于龙藏的AJBrige。只有使用flash上传方式时候才会实例化这个类 * @constructor * @extends Base */ function SwfButton(target, config) { var self = this; config = S.merge({target:$(target)}, config); //调用父类构造函数 SwfButton.superclass.constructor.call(self, config); } S.mix(SwfButton, /** @lends SwfButton*/{ /** * 支持的事件 */ event:{ //组件运行后事件 RENDER : 'render', //选择文件后事件 CHANGE:'change', //鼠标在swf中滑过事件 MOUSE_OVER:'mouseOver', //鼠标在swf中按下事件 MOUSE_DOWN:'mouseDown', //鼠标在swf中弹起事件 MOUSE_UP:'mouseUp', //鼠标在swf中移开事件 MOUSE_OUT:'mouseOut', //鼠标单击事件 CLICK:'click' } }); S.extend(SwfButton, Base, /** @lends SwfButton.prototype*/{ /** * 运行,会实例化AJBrige的Uploader,存储为swfUploader属性 */ render:function () { var self = this, $target = self.get('target'), swfUploader, multiple = self.get('multiple'), fileFilters = self.get('fileFilters') ; $target.css('position', 'relative'); self.set('swfWrapper',self._createSwfWrapper()); self._setFlashSizeConfig(); swfUploader = self._initSwfUploader(); //SWF 内容准备就绪 swfUploader.on('contentReady', function(ev){ //多选和文件过滤控制 swfUploader.browse(multiple, fileFilters); //监听鼠标事件 self._bindBtnEvent(); //监听选择文件后事件 swfUploader.on('fileSelect', self._changeHandler, self); self._setDisabled(self.get('disabled')); self.fire(SwfButton.event.RENDER); }, self); }, /** * 创建flash容器 */ _createSwfWrapper:function () { var self = this, target = self.get('target'), tpl = self.get('tpl'), //容器id id = self.get('swfWrapperId') != EMPTY && self.get('swfWrapperId') || SWF_WRAPPER_ID_PREVFIX + S.guid(), //容器html html = S.substitute(tpl, {id:id}); self.set('swfWrapperId', id); return $(html).appendTo(target); }, /** * 初始化ajbridge的uploader * @return {SwfUploader} */ _initSwfUploader:function () { var self = this, flash = self.get('flash'), id = self.get('swfWrapperId'), swfUploader; S.mix(flash,{id:'swfUploader'+S.guid()}); try { //实例化AJBridge.Uploader swfUploader = new SwfUploader(id, flash); self.set('swfUploader', swfUploader); } catch (err) { } return swfUploader; }, /** * 监听swf的各个鼠标事件 * @return {SwfButton} */ _bindBtnEvent:function () { var self = this, event = SwfButton.event, swfUploader = self.get('swfUploader'); if (!swfUploader) return false; S.each(event, function (ev) { swfUploader.on(ev, function (e) { self.fire(ev); }, self); }); return self; }, /** * 设置flash配置参数 */ _setFlashSizeConfig:function () { var self = this, flash = self.get('flash'), target = self.get('target'), size = self.get('size'); if(!S.isEmptyObject(size)){ S.mix(flash.attrs, size); }else{ S.mix(flash.attrs, { width:target.innerWidth(), height:target.innerHeight() }); } self.set('flash', flash); }, /** * flash中选择完文件后触发的事件 */ _changeHandler:function (ev) { var self = this, files = ev.fileList; self.fire(SwfButton.event.CHANGE, {files:files}); }, /** * 设置上传组件的禁用 * @param {Boolean} disabled 是否禁用 * @return {Boolean} */ _setDisabled : function(disabled){ var self = this, swfUploader = self.get('swfUploader'), cls = self.get('cls'),disabledCls = cls.disabled, $target = self.get('target'), $swfWrapper = self.get('swfWrapper'); if(!swfUploader || !S.isBoolean(disabled)) return false; if(!disabled){ $target.removeClass(disabledCls); //显示swf容器 $swfWrapper.css('top',0); //TODO:之所以不使用更简单的unlock()方法,因为这个方法应用无效,有可能是bug //swfUploader.unlock(); }else{ $target.addClass(disabledCls); //隐藏swf容器 $swfWrapper.css('top','-3000px'); //swfUploader.lock(); } return disabled; }, /** * 显示按钮 */ show:function(){ var self = this, $target = self.get('target'); $target.show(); }, /** * 隐藏按钮 */ hide:function(){ var self = this, $target = self.get('target'); $target.hide(); } }, {ATTRS:/** @lends SwfButton.prototype*/{ /** * 按钮目标元素 * @type KISSY.Node * @default "" */ target:{value:EMPTY}, /** * swf容器 * @type KISSY.Node * @default "" */ swfWrapper : {value : EMPTY}, /** * swf容器的id,如果不指定将使用随机id * @type Number * @default "" */ swfWrapperId:{value:EMPTY}, /** * flash容器模板 * @type String */ tpl:{ value:'
' }, /** * 是否开启多选支持 * @type Boolean * @default true */ multiple:{ value:true, setter:function (v) { var self = this, swfUploader = self.get('swfUploader'); if (swfUploader) { swfUploader.multifile(v); } return v; } }, /** * 文件过滤,格式类似[{desc:"JPG,JPEG,PNG,GIF,BMP",ext:"*.jpg;*.jpeg;*.png;*.gif;*.bmp"}] * @type Array * @default [] */ fileFilters:{ value:[], setter:function (v) { var self = this, swfUploader = self.get('swfUploader'); if(S.isObject(v)) v = [v]; if (swfUploader && S.isArray(v)) { S.later(function(){ swfUploader.filter(v); },800); } return v; } }, /** * 禁用按钮 * @type Boolean * @default false */ disabled : { value : false, setter : function(v){ var self = this, swfUploader = self.get('swfUploader'); if (swfUploader) { self._setDisabled(v); } return v; } }, /** * 样式 * @type Object * @default { disabled:'uploader-button-disabled' } */ cls : { value : { disabled:'uploader-button-disabled' } }, /** * 强制设置flash的尺寸,比如{width:100,height:100},默认为自适应按钮容器尺寸 * @type Object * @default {} */ size : {value:{} }, /** * flash配置,对于swf文件配路径配置非常关键,使用默认cdn上的路径就好 * @type Object * @default { src:'http://a.tbcdn.cn/s/kissy/gallery/form/1.3/uploader/plugins/ajbridge/uploader.swf', id:'swfUploader', params:{ bgcolor:"#fff", wmode:"transparent" }, attrs:{ }, hand:true, btn:true } } */ flash:{ value:{ src:'/Content/js/kissy/gallery/form/1.3/uploader/plugins/ajbridge/uploader.swf', //mod by liuhuisheng id:'swfUploader', params:{ bgcolor:"#fff", wmode:"transparent" }, //属性 attrs:{ }, //手型 hand:true, //启用按钮模式,激发鼠标事件 btn:true } }, /** * ajbridge的uploader的实例 * @type SwfUploader * @default "" */ swfUploader:{value:EMPTY} }}); return SwfButton; }, {requires:['node', 'base', '../plugins/ajbridge/uploader']});