看了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我這邊也試過了,是能夠的,就不放截圖了