UNPKG

vesh-vj

Version:

VESH's JavaScript Framework

244 lines (242 loc) 10.7 kB
(function (V, W, $) { V.registScript(function (path, vm) { var _ = this, __ = {}; { V.inherit.apply(_, [W.Control, [path || '<div class="htmlc-control"><div class="htmlc-control-se"><select><option value="" selected>- 标签 -</option></select></div><div class="htmlc-control-urls"><ul datarole="attrs"></ul></div><p class="htmlc-control-buttons" style="clear: both;"><input class="htmlc-control-save" type="button" value="保存"/><input class="htmlc-control-delete" type="button" value="删除" /> <input class="htmlc-control-cancel" type="button" value="取消" /> </p></div>', V.getValue({ data:{ controls:{ text:{displayname:'输入框', style:{width:'宽度'},attrs:{title:'标题',value:'值'}}, select:{displayname:'下拉框',style:{width:'宽度'}} } } }, vm)]]); __.onLoad = _.onLoad; __.render = _.render; _.addDesc('htmlc 对象:动态生成元素,获取'); _.addDesc('非必填属性:'); _.addDesc('\twidth,height 定义控件的宽,高,一般在外面加样式,适合扩展,一般是绝对定位的。'); _.addDesc('\tcontrols 类型定义需要显示哪些类型,目前支持文本框和下拉框'); _.addDesc('\t示例:'); _.addDesc("controls:{text:{displayname:'输入框', style:{width:'宽度'},attrs:{title:'标题',value:'值'}},select:{displayname:'下拉框',style:{width:'宽度'}}}"); _.addDesc('\t说明:text表示文本框类型,displayname是对应的显示名称,stye表示样式,符合css标准,attrs表示元素属性,符合html标准。'); _.addDesc('\t说明:元素显示时,是用图片img表示,以_control属性为准,动态加的元素都有这个属性,获取时,以此属性会查找条件,找到对应的动态元素html.'); _.addDesc('\tinit 初始化元素种类和参数,一般用在要打开时,代替show属性'); _.addDesc('\t说明:editControl函数,是在对应显示的图片上点击鼠标右键,调用编辑动态元素页面的时候调用此函数,传入图片jquery对象'); _.addDesc('\t说明:getControls函数,取保存所有动态元素的对象,格式是{"1467962814044841": "<input type="text" class="edit_control" _control="text" value="fsd" style="width:100px;" type="text" />"}'); _.addDesc('\t"1467962814044841"表示一个动态元素,值为动态元素的outhtml包含自己'); _.addDesc('\t说明:setControls函数,设置动态元素集合(属性controlHtmls),一般为动态加载之前生成的元素保存,方便编辑动态元素'); _.addDesc('\t说明:save函数,保存当时添加或编辑的元素,并把type(元素类型,例下拉框(select)),id(随机值,唯一表示该元素的)属性返回,加到想加到的地方,生成的html为<img src="./images/default/{type}.png" data-id="{id}" _control="{type}" />, 并把元素信息保存到动态元素集合controlHtmls对象中'); _.addDesc('\tdemo:editor页面中的htmlc元素'); } _.onLoad = function (node) { V.forC(_.events, function (k, v) { switch (k.toLowerCase()) { case 'click': case 'hover': break; default: _.bindEvent(_.node, k, v); break; } }, function () { __.onLoad(node) }); __.editElement=null; __.controlHtmls={};//保存所有动态添加的元素 __.sel_control=node.find('.htmlc-control-se select'); __.urls=node.find('.htmlc-control-urls'); console.log(__); //__.buSave=node.find('.htmlc-control-save'); //__.buCancel=node.find('.htmlc-control-cancel'); //__.buDelete=node.find('.htmlc-control-delete'); __.sel_control.change(function(){ _.selControl($(this).val()); }); node.on('click','.htmlc-control-save',function(e){ _.save(); }); node.on('click','.htmlc-control-cancel',function(e){ __.editElement=null; node.hide(); }); node.on('click','.htmlc-control-delete',function(e){ if(__.editElement){ delete __.controlHtmls[__.editElement.attr('data-id')]; __.editElement.remove(); node.hide(); }else{ console.log('元素不存在'); } }); __.urls.on('click','li .addline',function(){ var _this=$(this); switch(_this.attr('datarole')){ case 'select': $(this).closest('ul').append('<li datarole="html">显示名:<input type="text" dataRole="display" />值:<input type="text" dataRole="key" /><input class="addline" type="button" value="添加一行" datarole="select" /><input type="button" datarole="select" class="deleteone" value="删除" /></li>'); break; } }); __.urls.on('click','li .deleteone',function(){ $(this).closest("li").remove(); }); }; _.selControl = function (name) { __.editElement=null; __.urls.empty(); var style="",attrs="",controls=__.controls; for(v in controls[name].style){ style+='<li datarole="style" name="'+v+'">'+controls[name].style[v]+':<input type="text" value="'+''+'" /></li>'; } for(v in controls[name].attrs){ attrs+='<li datarole="attrs" name="'+v+'">'+controls[name].attrs[v]+':<input type="text" value="'+''+'" /></li>'; } switch(name){ case 'select': __.urls.html('<ul datarole="html"><li datarole="html">显示名:<input type="text" datarole="display" />值:<input type="text" datarole="key" /><input class="addline" type="button" value="添加一行" datarole="select" /><input type="button" datarole="select" class="deleteone" value="删除" /></li></ul>'); break; } if(style.length>0){ __.urls.append('<ul datarole="style">'+style+'</ul>'); } if(attrs.length>0){ __.urls.append('<ul datarole="attrs">'+attrs+'</ul>'); } }; _.editControl=function(c){ __.editElement=c; var temp=$(__.controlHtmls[c.attr('data-id')]); if(__.sel_control.find('option').length==1){ var html=''; for (v in __.controls){ html+='<option value="'+v+'" >'+__.controls[v].displayname+'</option>'; } __.sel_control.append(html); } var type=c.attr('_control'); var style="",attrs="",html=""; for(v in __.controls[type].style){ if((v=='width'||v=='height')&&temp.css(v)=='0px'){ style+='<li datarole="style" name="'+v+'">'+__.controls[type].style[v]+':<input type="text" value="'+''+'" /></li>'; }else{ style+='<li datarole="style" name="'+v+'">'+__.controls[type].style[v]+':<input type="text" value="'+(temp.css(v)||'').replace('px','')+'" /></li>'; } } for(v in __.controls[type].attrs){ attrs+='<li datarole="attrs" name="'+v+'">'+__.controls[type].attrs[v]+':<input type="text" value="'+(temp.attr(v)||'')+'" /></li>'; } switch(type){ case 'text': break; case 'select': temp.find('option').each(function(index,v){ html+='<li datarole="html">显示名:<input type="text" datarole="display" value="'+$(this).text()+'" />值:<input type="text" datarole="key" value="'+$(this).val()+'" /><input class="addline" type="button" value="添加一行" datarole="select" /><input type="button" datarole="select" class="deleteone" value="删除" /></li>'; }); break; } __.urls.empty(); __.sel_control.find("option[value='"+type+"']").attr("selected", true); if(html.length>0){ __.urls.append('<ul datarole="html">'+html+'</ul>'); } if(style.length>0){ __.urls.append('<ul datarole="style">'+style+'</ul>'); } if(attrs.length>0){ __.urls.append('<ul datarole="attrs">'+attrs+'</ul>'); } _.node.show(); } _.save=function(){ var type=__.sel_control.val(); var style="",attrs="",html=''; __.urls.find("ul li[datarole=style]").each(function(index,val){ var _this=$(this); var text1=_this.find('input').val(),name=_this.attr('name'); if(text1.length>0){ if(name=='width'||name=='height'){ if(text1.length>0){ text1=text1+'px'; } } style+=name+":"+text1+';'; } }); if(style.length>0){ style=' style="'+style+'"'; } __.urls.find("ul li[datarole=attrs]").each(function(index,val){ var _this=$(this); attrs+=_this.attr('name')+'="'+_this.find('input').val()+'" '; }); switch(type){ case 'select': html+='<select class="edit_control" _control="select" '+attrs+style+'>'; __.urls.find("ul li[datarole=html]").each(function(index,val){ var _this=$(this); html+='<option value="'+_this.find('input[datarole=key]').val()+'">'+_this.find('input[datarole=display]').val()+'</option>'; }); html+='</select>'; break; case 'text': html+='<input type="text" class="edit_control" _control="text" '+attrs+style+' type="text" />'; break; } var id=''+parseInt(''+(new Date()).getTime()+(10000*Math.random())); if(__.editElement){ id=__.editElement.attr('data-id').length>0?__.editElement.attr('data-id'):id; } if(html.length>0){ __.controlHtmls[id]=html; _.node.hide(); if(!__.editElement){ _.call('save',{type:type,id:id}); //hb_icon_set_green.insert_text('<img src="./images/default/'+type+'.png" data-id="'+id+'" _control="'+type+'" />'); // $((window.frames["ha_html"].document||window.frames["ha_html"].contentWindow.document).body).off('mousedown contextmenu','img[_control]').on('contextmenu','img[_control]',function(){return false;}).on('mousedown','img[_control]',function(e){if(e.which==3){editControl($(this));} }); }else{ __.editElement=null; } } } _.init1=function(data){ if(__.sel_control.find('option').length==1){ var html=''; for (v in data.controls){ html+='<option value="'+v+'" >'+data.controls[v].displayname+'</option>'; } __.sel_control.append(html); } __.sel_control.find('option:eq(0)').attr("selected", true); __.urls.empty(); _.node.show(); } _.getControls=function(){ return __.controlHtmls; } _.setControls=function(value){ __.controlHtmls=value||{}; } _.render = function (data) { data = __.render(data); //var render = _.editor?false:true; V.forC(data, function (k, v) { switch (k.toLowerCase()) { case 'width': _.node.css('width',v); break; case 'height': _.node.css('height',v); break; case 'controls': __.controls=v; break; case 'init': _.init1(_.vm.get()); break; } },function(){ //if(render){ //_.editor=true; //_.node.htmlbox(_.transform(data)); //} }); } }); })(VJ, VJ.view, jQuery);