基于jquery的Repeater实现代码

所属分类: 网络编程 / JavaScript 阅读数: 220
收藏 0 赞 0 分享
如何实现一个js版的repeater?
Asp.net WebForm的repeater控件挺好用,我想用js实现一个在Ajax应用中也该还不错!半年前做了一个jQuery.Repeater插件,并用在了一个项目中,如今拿来晒晒!
原理
项模板为HTML代码,插件接收json数据源,读取模板并创新每一项。
模板HTML
复制代码 代码如下:

<ul id='repeater1'>
<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' style='display:none;'></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 id="repeager1">
<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
}

源码下载
作者:houfeng
出处:http://houfeng.cnblogs.com
更多精彩内容其他人还在看

js实现图片上传预览原理分析

这篇文章主要为大家详细介绍了js实现图片上传预览的原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Angular限制input框输入金额(是小数的话只保留两位小数点)

最近做项目遇到这样的需求输入框要求输入金额,只能输入数字,可以是小数,必须保留小数点后两位。下面分为两部分代码给大家介绍实现代码,需要的的朋友参考下吧
收藏 0 赞 0 分享

详解vue-cli + webpack 多页面实例配置优化方法

本篇文章主要介绍了详解vue-cli + webpack 多页面实例配置优化方法,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)

本篇文章主要介绍了React-Native解决键盘遮挡问题(Keyboard遮挡问题),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

JavaScript反弹动画效果的实现代码

本文通过实例代码给大家介绍了js反弹动画效果的实现代码,需要的朋友参考下吧
收藏 0 赞 0 分享

解决vue2.x中数据渲染以及vuex缓存的问题

本篇文章主要介绍了vue2.x中请求之前数据显示以及vuex缓存的问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

jsonp跨域请求详解

这篇文章主要为大家详细介绍了jsonp跨域请求的相关资料,激活了所有接口支持浏览器跨域请求的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

解决vue里碰到 $refs 的问题的方法

本篇文章主要介绍了解决vue里碰到 $refs 的问题的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

js自定义弹框插件的封装

这篇文章主要为大家详细介绍了js自定义弹框插件的简单封装,自己封装一个弹框插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

深入理解vue $refs的基本用法

本篇文章主要介绍了深入理解vue $refs的基本用法 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多