/** * @fileoverview 存储文件路径信息的隐藏域 * @author: 剑平(明河),紫英 **/ KISSY.add('gallery/form/1.3/uploader/urlsInput',function(S, Node, Base) { var EMPTY = '',$ = Node.all,LOG_PREFIX = '[uploader-urlsInput]:'; /** * @name UrlsInput * @class 存储文件路径信息的隐藏域 * @constructor * @extends Base * @param {String} wrapper 容器钩子 * @param {Object} config 组件配置(下面的参数为配置项,配置会写入属性,详细的配置说明请看属性部分) * @param {String} config.name *,隐藏域名称,当此name的隐藏域不存在时组件会创建一个 * @param {String} config.split 多个路径间的分隔符 * @param {String} config.tpl 隐藏域模板 * */ function UrlsInput(wrapper, config) { var self = this; //调用父类构造函数 UrlsInput.superclass.constructor.call(self, config); self.set('wrapper', $(wrapper)); } S.mix(UrlsInput, /**@lends UrlsInput*/ { /** * 隐藏域模板, '' * */ TPL : '' }); //继承于Base,属性getter和setter委托于Base处理 S.extend(UrlsInput, Base, /** @lends UrlsInput.prototype*/{ /** * 运行组件,实例化类后必须调用render()才真正运行组件逻辑 * @return {UrlsInput} */ render : function() { var self = this,$wrapper = self.get('wrapper'), name = self.get('name'), elInput = document.getElementsByName(name)[0]; if (!S.isObject($wrapper)) { S.log(LOG_PREFIX + 'container参数不合法!'); return false; } //如果已经存在隐藏域,那么不自动创建 if(elInput){ S.log(LOG_PREFIX + 'urls input found'); self.set('input',$(elInput)); }else{ self._create(); } return self; }, /** * 向路径隐藏域添加路径 * @param {String} url 路径 * @return {UrlsInput} */ add : function(url){ if(!S.isString(url)){ S.log(LOG_PREFIX + 'add()的url参数不合法!'); return false; } var self = this,urls = self.get('urls'), //判断路径是否已经存在 isExist = self.isExist(url); //TODO:第一个路径会出现为空的情况,日后完善 if(urls[0] == EMPTY) urls = []; if(isExist){ S.log(LOG_PREFIX + 'add(),文件路径已经存在!'); return self; } urls.push(url); self.set('urls',urls); self._val(); return self; }, /** * 删除隐藏域内的指定路径 * @param {String} url 路径 * @return {Array} urls 删除后的路径 */ remove : function(url){ if(!url) return false; var self = this,urls = self.get('urls'), isExist = self.isExist(url) , reg = new RegExp(url); if(!isExist){ S.log(LOG_PREFIX + 'remove(),不存在该文件路径!'); return false; } urls = S.filter(urls,function(sUrl){ return !reg.test(sUrl); }); self.set('urls',urls); self._val(); return urls; }, /** * 解析当前input的值,取得文件路径 * @return {Array} */ parse: function(){ var self = this, input = self.get('input'); if(input){ var urls = $(input).val(), split = self.get('split'), files=[]; if (urls) files = urls.split(split); //mod by liuhuisheng 原为files = urls.split(split) self.set('urls',files); return files; }else{ S.log(LOG_PREFIX + 'cannot find urls input.'); return []; } }, /** * 设置隐藏域的值 * @return {String} */ _val : function(){ var self = this,urls = self.get('urls'), $input = self.get('input'), //多个路径间的分隔符 split = self.get('split'), sUrl = urls.join(split); $input.val(sUrl); return sUrl; }, /** * 是否已经存在指定路径 * @param {String} url 路径 * @return {Boolean} */ isExist : function(url){ var self = this,b = false,urls = self.get('urls'), reg = new RegExp(url); if(!urls.length) return false; S.each(urls,function(val){ if(reg.test(val)){ return b = true; } }); return b; }, /** * 创建隐藏域 */ _create : function() { var self = this, container = self.get('wrapper'), tpl = self.get('tpl'), name = self.get('name'), urls = self.get('urls'), input; if(!container || container.length <= 0){ S.log(LOG_PREFIX + 'UrlsInput container not specified!', 'warn'); return false; } if (!S.isString(tpl) || !S.isString('name')){ S.log(LOG_PREFIX + '_create(),tpl和name属性不合法!'); return false; } input = $(S.substitute(tpl, {name : name,value : urls})); container.append(input); self.set('input', input); S.log(LOG_PREFIX + 'input created.'); return input; } }, {ATTRS : /** @lends UrlsInput.prototype*/{ /** * 隐藏域名称 * @type String * @default "" */ name : {value : EMPTY}, /** * 文件路径 * @type Array * @default [] */ urls : { value : [] }, /** * input模板 * @type String * @default '' */ tpl : {value : UrlsInput.TPL}, /** * 多个路径间的分隔符 * @type String * @default "," */ split : {value : ',', setter : function(v){ var self = this; self._val(); return v; } }, /** * 文件路径隐藏input * @type KISSY.Node * @default "" */ input : {value : EMPTY}, /** * 隐藏域容器 *@type KISSY.Node * @default "" */ wrapper : {value : EMPTY} }}); return UrlsInput; }, {requires:['node','base']});