看了vue的数据双向绑定原理后对于其中的
'指令的解析'
有很深的印象,以为能够运用到实际项目中,对目前的公司中的中英文页面进行改进(兼容IE8);
github (求★)
javascript
1.最开始的时候中英文分别是用两个html去写;html
a_cn.htmlvue
<div class="unitDiv_Cn"> <label class="labelClass_Cn">防闪频率:</label> <input class="inputClass_Cn" type="text"> </div>
a_en.htmljava
<div class="unitDiv_En"> <label class="labelClass_En">Flicker frequency:</label> <input class="inputClass_En" type="text"> </div>
优势:
因为对同一个词的中文和英文描述长度不同,能够分别在两个html中分别定义各自的class去控制样式缺点:
git
2.改进后利用jq同一动态渲染;(这边主要是经过将须要渲染文字的元素定义好id,再定义好id与文字的映射关系,最后经过jq的选择器进行统一渲染)github
a.html数组
<div class="unitDiv_En"> <label class="labelClass_En" id="labFlickerFrequency"></label> <input class="inputClass_En" type="text"> </div>
cn.js服务器
... language.label={ labFlickerFrequency:'防闪频率:', }
en.jsapp
... language.label={ labFlickerFrequency:'Flicker frequency:', }
优势:
dom
缺点:
在改进版本的基础上,不经过jq的选择器进行渲染,而是在每一个须要渲染文字的元素上添加自定义属性,也就是咱们的指令:inf-text='xxx'
,再经过相似vue的方式进行初始化
流程:
将每一个dom元素提取出来->
解析指令->
再去数据中查找文字->
进行文字渲染->
删除自定义属性->
最后再将dom元素一个个从新渲染到页面上;
(参考vue源码的指令解析便可,我这边为了知足项目需求,移植的时候简化了很多,并且兼容了IE8)
inf-class='xxx'
指令来控制咱们的样式inf-value='xxx'
来控制value属性的中英文(这里主要是用在input[type=button]
上)inf-title='xxx'
来控制title属性的中英文inf-alt='xxx'
来控制alt属性的中英文
源码就不去解析了(有兴趣能够看看github上的代码,有注释,并且代码也是比较简单),直接贴使用代码:
<div id="app"> <div class="unitDiv"> <label inf-class="labelClass" inf-title="languageData.lab.a" inf-text="languageData.lab.a"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> <div class="unitDiv"> <label inf-class="labelClass" inf-text="languageData.lab.b"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> <div class="unitDiv"> <label inf-class="labelClass" inf-text="languageData.lab.c"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> <div class="unitDiv"> <label inf-class="labelClass" inf-text="languageData.lab.d"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> <div class="unitDiv"> <label inf-class="labelClass" inf-text="languageData.lab.e"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> <div class="unitDiv"> <label inf-class="labelClass" inf-text="languageData.lab.f"></label> <input inf-class="inputClass" type="text" inf-value="inputClass"> </div> </div> <div id="app2"> <select> <option value="0" inf-text='languageData.sel.g'></option> <option value="1" inf-text='languageData.sel.h'></option> </select> </div> <select id="switch"> <option value=0 selected>英文</option> <option value=1>中文</option> </select> <script type="text/javascript" src="languageData.js"></script> <script type="text/javascript" src="languageRender.js"></script> <script> var lan=document.getElementById('switch').value; var languageObj=getLanguage('module1'); var languageRenderCtx=new languageRender({ el: ['app','app2'], lan:lan, data: { languageData: languageObj, labelClass:['label_en','label_cn'], inputClass:['input_en','input_cn'] }, beforeRender:function(){ this.option.data.languageData.lab.a=['BLC:','白平衡:'] } }) document.getElementById('switch').onchange=function(){ languageRenderCtx.setLan(Number(this.value)); } </script>
languageData.js:
function getLanguage(moduleName) { var data = {}; if ('module1' == moduleName) { data = { lab: { a: ['Flicker frequency:', '防闪频率:'], b: ['WDR:', '宽动态:'], c: ['FaceTargetBrightness:', '人脸目标亮度:'], d: ['FaceExposureInterval(s):', '人脸曝光间隔(s):'], e: ['IlluminationCondition:', '光照条件:'], f: ['HLC:', '背光补偿:'] }, sel: { g: ['Auto', '自动'], h: ['Manual', '手动'] } } } return data; }
ps:里面的languageData.lab.a,languageData.lab.b...这种a,b,c...命名方式只是为了方便演示,真正用的时候确定不能这样命名
el:['app','app2']
,若是只有一个包裹元素内的dom须要渲染能够直接填id名,即el:'app'
优势:
这里我还另外增长了一个beforeRender的hook函数,能够更好的实现页面文字的定制修改
例如:
new languageRender({ ... beforeRender:function(){ this.data.languageData.lab.a=['BLC','白平衡'][lan] } })
懒加载
加快首屏渲染速度,等首屏渲染好了后,再new languageRender函数继续渲染便可(固然这个dom是和已经渲染的dom没有包含与被包含的关系)将数据绑定
结合起来,只须要手动控制数据便可当即渲染页面,不用再从新进入。
languageRenderCtx.set('languageData.lab.a','liuzj')
同时也提供了统一切换中英文的接口
document.getElementById('switch').onchange=function(){ languageRenderCtx.setLan(Number(this.value)) }
lab: { a: ['Flicker frequency:','防闪频率:','防閃頻率','फ्लैश प्रूफ आवृत्ति'], },
老版本:
新版本:(一次性渲染)
新版本:(分开渲染)
弹出框
和格式化页面
ps:对于IE8我这边也试过了,是能够的,就不放截图了