Heim  >  Artikel  >  Web-Frontend  >  基于jquery的Repeater实现代码_jquery

基于jquery的Repeater实现代码_jquery

WBOY
WBOYOriginal
2016-05-16 18:23:031189Durchsuche
如何实现一个js版的repeater?
Asp.net WebForm的repeater控件挺好用,我想用js实现一个在Ajax应用中也该还不错!半年前做了一个jQuery.Repeater插件,并用在了一个项目中,如今拿来晒晒!
原理
项模板为HTML代码,插件接收json数据源,读取模板并创新每一项。
模板HTML
复制代码 代码如下:


  • {列名}



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("");
}
$('.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////绑定列值
var NewTrContent=TrContentTemplate;
//
NewTrContent=NewTrContent.Replace("{{","{#");
NewTrContent=NewTrContent.Replace("}}","#}");
for( var j=0;jNewTrContent=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{
arr[i]=arr[i].Replace("{","").Replace("}","");
}
return arr ;
}
//----------------------------------------------------------------------

挺乱的,但代码也简单,也有注释,不多说了:-D
如何使用
复制代码 代码如下:

$('repeater1').Repeager(data,[ItemCreatedCallBack]);
ItemCreatedCallBack 为可选参数,可以说是项创建事件吧!

如何嵌套?
通过ItemCreatedCallBack回调(或称事件)
Demo - HTML模板:
复制代码 代码如下:



{列名}


  • {{列名}}





Demo - js代码:
复制代码 代码如下:

$(function{
$('repeater1').Repeager(data,itemCreate);
});
function itemCreate(x){
// 在此绑定子repeater
// 参数X是父repeater的项引用类型为jQuery对象,
// 通过X取得子repeater要用的数据 并取数据源 在此绑定子repeater 绑定子repeater
}

源码下载
作者:houfeng
出处:http://houfeng.cnblogs.com
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn