您好,欢迎来到百万美食网。
搜索
您的当前位置:首页基于jquery的Repeater实现代码_jquery

基于jquery的Repeater实现代码_jquery

来源:百万美食网


如何实现一个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

    Copyright © 2019- bwgh.cn 版权所有

    违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务