zoukankan      html  css  js  c++  java
  • 用Javascript实现Repeater

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

     

    源码下载

    单击此处下载

      

      

  • 相关阅读:
    最佳的思维导图生成工具——markmap 使用教程
    07. struts2中对Action的管理方式
    06. struts2中指定struts2处理的请求后缀
    05. struts2中为Action属性注入值
    03. struts2中Action配置的各项默认值
    04. struts2中Result配置的各种视图转发类型
    02. struts2中Action名称的搜索顺序
    NSAttributedString使用CSS+html创建换行符无效( 无效)处理方法
    UITextView 添加到UITableViewCell上使用AttributedString点击链接不调用代理方法的处理方法及自定义link样式需要注意的问题
    iOS TableView reaload delete的实际操作
  • 原文地址:https://www.cnblogs.com/houfeng/p/1778189.html
Copyright © 2011-2022 走看看