用Javascript实现Repeater

如何实现一个js版的repeater?

Asp.net WebForm的repeater控件挺好用,我想用js实现一个在Ajax应用中也该还不错!半年前做了一个jQuery.Repeater插件,并用在了一个项目中,如今拿来晒晒!

原理

项模板为HTML代码,插件接收json数据源,读取模板并创新每一项。

模板HTML

<ul >

<li class='itemtempplate'>{列名}</li>

</ul>

json数据源格式

自个捣鼓的东西格式就自个做主啦:-D . 如下:

{tablename:"表名",rows:[{"列1":"值1"},{"列2":"值2"}.....{"列n":"值n"}]}

扩展原生String对象

为方便使用扩展一个String对象

//扩展String

String.prototype.trim = function() {

return this.replace(/(^\s*)|(\s*$)/g,"");

}

//

String.prototype.Replace=function (str1,str2){

var rs=this.replace(new RegExp(str1,"gm"),str2);

return rs;

}

将json字符串转为对象

//将json数据转为对象

function jsonStringToDataTable(jsondata){

try{

var table=eval("("+jsondata+")");

return table;

}

catch(ex){

return null ;

}

}

取网页元素自身HTML源码

由于有些浏览器(如firefox)不支持outerHTML,特写了一个toHTML的小插件。

//取自身HTML源码的插件.

jQuery.fn.extend({

toHTML:function(){

var obj=$(this[0]);

if(obj[0].outerHTML){

return obj[0].outerHTML;

}

else{

if($('.houfeng-hidearea')==null || $('.houfeng-hidearea')[0]==null ){

$('body').append("<div class='houfeng-hidearea' ></div>");

}

$('.houfeng-hidearea').css('display','none');

$('.houfeng-hidearea').html('');

obj.clone(true).prependTo('.houfeng-hidearea');

var rs= $('.houfeng-hidearea').html();

$('.houfeng-hidearea').html('');

return rs;

}

}

});

插件主要代码

jQuery.fn.extend({

Repeater:function(val,ItemCreatedCallBack){//设置或取得数据源

this.each(function(){

if(val==null || val==undefined){//如果参数为空返回相应数据

return $(this).data("_DataSrc");//从缓存返回数据

}

else{//如果不为空设置数据源。

//

try{

var valtype=(typeof val).toString();

if(valtype=='string')

val =jsonStringToDataTable(val).rows;

}catch(ex){

return ;

}

//

var domtype=$(this).find(".itemtemplate").attr('nodeName');//查找元素类型

//

if($(this).data("_ItemTemplate")==null ){

$(this).data("_ItemTemplate",$(this).find(".itemtemplate").toHTML());

$(this).find(".itemtemplate").remove();

}

var TrContentTemplate=$(this).data("_ItemTemplate");

//

var fileds=____FindFiled(TrContentTemplate);//找到所有列

if(fileds==null )return false ;

var filedscount=fileds.length;//计算列数

////

$(this).data("_DataSrc",val); //将数据放入缓存

var count=val.length;

for(var i=0;i<count ;i++){

////绑定列值

var NewTrContent=TrContentTemplate;

//

NewTrContent=NewTrContent.Replace("{{","{#");

NewTrContent=NewTrContent.Replace("}}","#}");

for( var j=0;j<filedscount;j++){

NewTrContent=NewTrContent.Replace("{"+fileds[j]+"}",val[i][fileds[j].trim()]);

}

NewTrContent=NewTrContent.Replace("{#","{");

NewTrContent=NewTrContent.Replace("#}","}");

//

var area=$(this).find('tbody');

if(area ==null )

area =$(this);

//

area.append(NewTrContent);

if(ItemCreatedCallBack!=null ){

ItemCreatedCallBack($(this).find(domtype+":last"));

}

}

//

$(this).RepeaterSetItemClass($(this).data("_class1"),$(this).data("_class2"),$(this).data("_hoverClass"));

}

});

},

RepeaterClear:function (){//清除数据

this.each(function(){

if($(this).data("_ItemTemplate")==null ){

$(this).data("_ItemTemplate",$(this).find(".itemtemplate").toHTML());

}

$(this).find(".itemtemplate").remove();

});

},

RepeaterSetItemClass:function (class1,class2,hoverClass){//行样式

this.each(function(){

if(class1==null || class2==null || hoverClass ==null )

return ;

//将设置存入缓存

$(this).data("_class1",class1);

$(this).data("_class2",class2);

$(this).data("_hoverClass",hoverClass);

//

if($(this).data("_DataSrc")!=null ){

var domtype=$(this).find(".itemtemplate").attr('nodeName');

//

$(this).find(domtype).addClass(class1);

$(this).find(domtype+":nth-child(even)").addClass(class2);

// $(this).find(domtype+":first").removeClass(class1);

//鼠标移动上去颜色变化

$(this).find(domtype).hover(function(){$(this).addClass(hoverClass);},function(){$(this).removeClass(hoverClass);});

}

});

}

});

//查找字段公共方法.

function ____FindFiled(str){//公共方法.

var myRegex = new RegExp("\{.+?\}", "gim");

//var arr = myRegex.exec(str);

var arr=str.match(myRegex);

if(arr ==null )return null ;

var count=arr.length;

for( var i=0;i<count;i++)

{

arr[i]=arr[i].Replace("{","").Replace("}","");

}

return arr ;

}

//----------------------------------------------------------------------

挺乱的,但代码也简单,也有注释,不多说了:-D

如何使用

$('repeater1').Repeager(data,[ItemCreatedCallBack]);

ItemCreatedCallBack 为可选参数,可以说是项创建事件吧!

如何嵌套?

通过ItemCreatedCallBack回调(或称事件)

Demo - HTML模板:

<div >

<div class='itemtemplate'>

<b>{列名}</b>

<ul class="subrepeager">

<!--每多一层嵌套 要 多一层大括号-->

<li class='itemtemplate'>{{列名}}</li>

</ul>

</div>

</div>

Demo - js代码:

$(function{

$('repeater1').Repeager(data,itemCreate);

});

function itemCreate(x){

// 在此绑定子repeater

// 参数X是父repeater的项引用类型为jQuery对象,

// 通过X取得子repeater要用的数据 并取数据源 在此绑定子repeater 绑定子repeater

}

源码下载

单击此处下载