/** * @fileoverview 文件上传按钮base * @author: 紫英(橘子), 剑平(明河) **/ KISSY.add('gallery/form/1.3/uploader/button/base',function(S, Node, Base) { var EMPTY = '', LOG_PREFIX = '[Uploader-Button] ', $ = Node.all; /** * @name Button * @class 文件上传按钮,ajax和iframe上传方式使用 * @constructor * @extends Base * @param {String} target *,目标元素 * @param {Object} config 配置对象 * @param {String} config.name *,隐藏的表单上传域的name值 * @param {Boolean} config.disabled 是否禁用按钮 * @param {Boolean} config.multiple 是否开启多选支持 */ function Button(target, config) { var self = this; config = S.merge({target:$(target)}, config); //超类初始化 Button.superclass.constructor.call(self, config); } S.mix(Button, { //支持的事件 event : { 'beforeShow': 'beforeShow', 'afterShow': 'afterShow', 'beforeHide': 'beforeHide', 'afterHide': 'afterHide', 'beforeRender' : 'beforeRender', 'afterRender' : 'afterRender', 'CHANGE' : 'change' }, /** * 获取文件名称(从表单域的值中提取) * @param {String} path 文件路径 * @return {String} */ getFileName : function(path) { return path.replace(/.*(\/|\\)/, ""); } }); S.extend(Button, Base, /** @lends Button.prototype*/{ /** * 运行 * @return {Button} Button的实例 */ render : function() { var self = this, target = self.get('target'), render = self.fire(Button.event.beforeRender); if (render === false) { S.log(LOG_PREFIX + 'button render was prevented.'); return false; } else { if (target == null) { S.log(LOG_PREFIX + 'Cannot find target!'); return false; } self._createInput(); self.fire(Button.event.afterRender); return self; } }, /** * 显示按钮 * @return {Button} Button的实例 */ show : function() { var self = this, target = self.get('target'); target.show(); self.fire(Button.event.afterShow); return Button; }, /** * 隐藏按钮 * @return {Button} Button的实例 */ hide : function() { var self = this, target = self.get('target'); target.hide(); self.fire(Button.event.afterHide); return Button; }, /** * 重置按钮 * @return {Button} Button的实例 */ reset : function() { var self = this, inputContainer = self.get('inputContainer'); //移除表单上传域容器 $(inputContainer).remove(); self.set('inputContainer', EMPTY); self.set('fileInput', EMPTY); //重新创建表单上传域 self._createInput(); return self; }, /** * 创建隐藏的表单上传域 * @return {HTMLElement} 文件上传域容器 */ _createInput : function() { var self = this, target = self.get('target'), name = self.get('name'), tpl = self.get('tpl'), html, inputContainer, fileInput; if (!S.isString(name) || !S.isString(tpl)) { S.log(LOG_PREFIX + 'No name or tpl specified.'); return false; } html = S.substitute(tpl, { 'name' : name }); // TODO: inputContainer = DOM.create(html); inputContainer = $(html); //向body添加表单文件上传域 $(inputContainer).appendTo(target); fileInput = $(inputContainer).children('input'); //TODO:IE6下只有通过脚本和内联样式才能控制按钮大小 if(S.UA.ie == 6) fileInput.css('fontSize','400px'); //TODO:firefox的fontSize不占宽度,必须额外设置left //if(S.UA.firefox) fileInput.css('left','-1200px'); //上传框的值改变后触发 $(fileInput).on('change', self._changeHandler, self); self.set('fileInput', fileInput); self.set('inputContainer', inputContainer); //禁用按钮 self._setDisabled(self.get('disabled')); //控制多选 self._setMultiple(self.get('multiple')); return inputContainer; }, /** * 文件上传域的值改变时触发 * @param {Object} ev 事件对象 */ _changeHandler : function(ev) { var self = this, fileInput = self.get('fileInput'), value = $(fileInput).val(), //IE取不到files oFiles = ev.target.files,files = []; if (value == EMPTY) { S.log(LOG_PREFIX + 'No file selected.'); return false; } if(oFiles){ S.each(oFiles,function(v){ if(S.isObject(v)){ files.push({'name' : v.name,'type' : v.type,'size' : v.size,data:v}); } }); }else{ files.push({'name' : Button.getFileName(value)}); } self.fire(Button.event.CHANGE, { files: files, input: fileInput.getDOMNode() }); self.reset(); }, /** * 设置上传组件的禁用 * @param {Boolean} disabled 是否禁用 * @return {Boolean} */ _setDisabled : function(disabled){ var self = this, cls = self.get('cls'),disabledCls = cls.disabled, $target = self.get('target'), input = self.get('fileInput'); if(!$target.length || !S.isBoolean(disabled)) return false; if(!disabled){ $target.removeClass(disabledCls); $(input).show(); }else{ $target.addClass(disabledCls); $(input).hide(); } return disabled; }, /** * 设置上传组件的禁用 * @param {Boolean} multiple 是否禁用 * @return {Boolean} */ _setMultiple : function(multiple){ var self = this,fileInput = self.get('fileInput'); if(!fileInput.length) return false; multiple && fileInput.attr('multiple','multiple') || fileInput.removeAttr('multiple'); return multiple; } }, { ATTRS : /** @lends Button.prototype */{ /** * 按钮目标元素 * @type KISSY.Node * @default null */ target: { value: null }, /** * 对应的表单上传域 * @type KISSY.Node * @default "" */ fileInput: { value: EMPTY }, /** * 文件上传域容器 * @type KISSY.Node * @default "" */ inputContainer: { value: EMPTY }, /** * 隐藏的表单上传域的模板 * @type String */ tpl : { value : '
' }, /** * 隐藏的表单上传域的name值 * @type String * @default "fileInput" */ name : { value : 'fileInput', setter : function(v) { if (this.get('fileInput')) { $(this.get('fileInput')).attr('name', v); } return v; } }, /** * 是否可用,false为可用 * @type Boolean * @default false */ disabled : { value : false, setter : function(v) { this._setDisabled(v); return v; } }, /** * 是否开启多选支持,多选目前有兼容性问题,建议禁用 * @type Boolean * @default true */ multiple : { value : true, setter : function(v){ this._setMultiple(v); return v; } }, /** * 样式 * @type Object * @default { disabled : 'uploader-button-disabled' } */ cls : { value : { disabled : 'uploader-button-disabled' } } } }); return Button; }, { requires:[ 'node', 'base' ] });