基于jquery上的轻量级《数据模板解析》插件
1.先上一个栗子。
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <script src="js/jquery.js"></script> 7 </head> 8 <body> 9 <div mes --class="zys" --a="测试一" class="a" mesC="****{{[function((data[0].a == 1)?'123123':'sdfsdf';)]}}***{{[function($('body').append('sdf5 646'))]}}*****{{data[0].a}}*****{{data[0].a}}{{[function(if(b == '张云山'){'sdfjkshdj';})]}}*****">54654657</div> 10 <div mes>54654657</div> 11 <div mes mesC="sdfsd">54654657</div> 12 <div mes mesfor="data"> 13 <div mesdata mesdataC="{{data[i].a}}sdf;lksd{{b}}">豆腐干豆腐</div> 14 对勾对勾 15 </div> 16 <div mesfor="data1"> 17 <div>123</div> 18 </div> 19 <script> 20 var data = [ 21 {a:1,b:2}, 22 {a:11,b:22} 23 ]; 24 var data1 = [ 25 {a:1,b:2}, 26 {a:1,b:2}, 27 {a:1,b:22}, 28 {a:1,b:2} 29 ]; 30 var a = "测试一"; 31 var b = "测试二"; 32 $.extend({ 33 mesfor:function(mesForName,fn){//模板循环 34 fn = fn || new Function(); 35 $("*["+mesForName+"]").each(function(i,mesfor){ 36 var children = $(mesfor).html(); 37 var mesforData = $(mesfor).attr(mesForName); 38 $(mesfor).html(""); 39 $.each(eval(mesforData),function(i,data){ 40 var newReplace = eval("/"+mesforData+"\\[i\\]"+"/g"); 41 var newChildren = children.replace(newReplace,mesforData+"["+i+"]"); 42 $(mesfor).append(newChildren); 43 }); 44 }); 45 fn(); 46 }, 47 AttrAnalysis:function(StringObj){//内容解析,并返回数据 48 var text = StringObj; 49 var textAll = StringObj.match(/\{\{+.+?\}\}/g);//查找所有{{...}} 50 for(var i in textAll){ 51 var replacefnString = textAll[i]; 52 var FN = textAll[i].match(/\[function+\(+.+?\)\]/g); 53 for (var j in FN){ 54 var replacefn = FN[j].replace(/(^\[function\()|(\)\]$)/g,""); 55 textAll[i] = eval(replacefn); 56 }; 57 if(textAll[i].constructor.name == "String"){ 58 if(textAll[i].indexOf("{{") != -1){ 59 text = text.replace(textAll[i],eval(textAll[i])); 60 }else{ 61 text = text.replace(replacefnString,textAll[i]); 62 }; 63 }else if(textAll[i].constructor.name == ""){ 64 text = text.replace(replacefnString,""); 65 }; 66 }; 67 return text; 68 }, 69 mesFun:function(mes){ 70 mes = mes || "mes"; 71 var mesForName = mes + "for"; 72 var mesC = mes + "c"; 73 $.mesfor(mesForName,function(){ 74 $("*["+mesForName+"]").each(function(i,e){ 75 var mewMes = mes+$(e).attr(mesForName); 76 $.mesFun(mewMes); 77 $.mesfor(mesForName+"-"+$(e).attr(mesForName),function(){ 78 $.mesFun(mewMes); 79 }); 80 }); 81 $("*["+mes+"]").each(function(i,e){ 82 if($(e).attr(mesForName) == undefined){//无循环,可直接解析 83 if($(e).parents("*["+mesForName+"]").length == 0){ 84 $.each(e.attributes,function(i,attr){ 85 if(attr.name == mesC && attr.value !=""){//mesc文本源属性 86 $(e).text($.AttrAnalysis(attr.value)); 87 }else{ 88 if(attr.name.indexOf("--") != -1){//其他源属性 89 var newAttr = attr.name.replace(/^--/,""); 90 $(e).attr(newAttr, $.AttrAnalysis(attr.value)); 91 }; 92 }; 93 }); 94 }; 95 }; 96 }); 97 }); 98 } 99 }); 100 $.mesFun(); 101 102 </script> 103 </body> 104 </html>
2.插件用法
2-1》先把插件调进页面。
2-2》执行 $.mesFun(); 初始化数据。mesFun(mes)里面的mes参数可选填,默认mes=“mes”。该参数会直接影响解析对象。
2-3》数据的绑定
例如:
<script>
var aa="我是新文本";
var classB = "newclassA";
var ulData = [
{class:"classA",name:"mesfor1",id:0,text:"我是第1行数据"},
{class:"classB",name:"mesfor2",id:1,text:"我是第2行数据"},
{class:"classC",name:"mesfor3",id:2,text:"我是第3行数据"},
{class:"classD",name:"mesfor4",id:3,text:"我是第4行数据"},
{class:"classE",name:"mesfor5",id:4,text:"我是第5行数据"}
];
</script>
<div mes mesC=“{{aa}}”>我是文本</div>
说明:mesC属性值得是文本数据,即解析结果为:<div mes mesC=“{{aa}}”>我是新文本</div>,数据绑定的时候比如写在双中括号里面,如:{{aa}},以下同上。
<div mes mesC=“{{aa}}” --class="{{classB}}" class="classA">我是文本</div>
说明:--class即--属性,其解析结果<div mes mesC=“{{aa}}”--class="{{classB}}" class="newclassA">我是新文本</div>
<ul mesFor="ulData">
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}">我是默认数据</li>
</ul>
说明:mesfor="绑定的数据"是数据循环,解析结果为:
<ul mesFor="ulData">
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}" class="classA" name="mesfor1" id="0">我是第1行数据</li>
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}" class="classB" name="mesfor2" id="1">我是第2行数据</li>
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}" class="classC" name="mesfor3" id="2">我是第3行数据</li>
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}" class="classD" name="mesfor4" id="3">我是第4行数据</li>
<li mes --class="{{ulData.class}}" --name="{{ulData.name}}" --id="{{ulData.id}}" mesc="{{ulData.text}}" class="classE" name="mesfor5" id="4">我是第5行数据</li>
</ul>
2-4》属性源支持js脚本。
例如:
<div mes mesc="{{[function((aa == ‘我是新文本’)?'我是新文本一':'我是新文本二';)]}}">我是文本</div>
解析结果为:<div mes mesc="{{[function((aa == ‘我是新文本’)?'我是新文本一':'我是新文本二';)]}}">我是文本一</div>