js數據動態綁定

這是以前項目開發中用的JS-AJAX-JSON動態數據綁定

databind.js源碼

 

// JavaScript Document
//定義解析類
function DataBind(){};
//擴展類型
var extend_obj = {};
//給解析類增加變量與方法
DataBind.prototype={
    selectList   : new Array(),
    radioList    : new Array(),
    lineNum      : 0,
    oddLineClass : "",
    evenLineClass: "",
    templateTxt  : "",
    isForm       : false,
    setLineClass    :  function(oddClass,evenClass)
    {
       this.oddLineClass=oddClass;
       this.evenLineClass=evenClass;
    },
    setTemplateTxt  :  function(id)
    {
        var temp=document.getElementById(id);
        if(temp)
          this.templateTxt=temp.innerHTML;
        this.lineNum=0;
    },
    setForm         :  function()
    {
        this.isForm=true;
    },
    getResultHtml   :  function(data,templateHtml,type)
    {
        var cdomhtml=templateHtml;                         //取綁定模板內容
        var cdomhtmllen = cdomhtml.length;                 //模板長度
        var beginchar = "@{";                              //起始字符
        var endchar = "}";                                 //結束字符
        var endchar_t = "}";
        var start = -1;                                    //查找的開始位置
        while(start<cdomhtmllen)
        {
           var startflag = cdomhtml.indexOf(beginchar,start+endchar_t.length);       //查找起始標誌
               if(startflag<0) break;
           var endflag = cdomhtml.indexOf(endchar, startflag + beginchar.length);    //查找結束標誌 
               if(endflag<0) break;
           var fieldName = cdomhtml.substring(startflag+beginchar.length,endflag);                 //字段標誌,起始標誌佔兩位,所以起始位置爲startflag+2
           if(fieldName!="")
               {
                   var result = "";
                   if(type=="list")
                      result=this.replaceField(data,fieldName);
                   if(type=="form")
                      result=this.replaceForm(data,fieldName);
                   cdomhtml = cdomhtml.replace(beginchar+fieldName+endchar,result);         
               }
            start = startflag;                                                         //重置搜索起始位置
            cdomhtmllen = cdomhtml.length;                                           //重置模板長度(模板內容經替換內容已改變)
        }
        return cdomhtml;                                                             //返回模板替換結果
    },   
       
    replaceField   :   function(data,fieldname)
    {
        var separateFlag = "|";                                                     //定義分隔符(用於返回對象的擴展)
        var fieldSeparateFlag = ",";                                                //定義多重字段分隔符
        var result="";
        var separateArr = fieldname.split(separateFlag);                          //分隔對象成數組
        var extendFlag = separateArr.length>1?true:false;                           //擴展標誌(有擴展則爲true,沒有擴展則爲false)
        if(extendFlag)
        {
            var funName=separateArr[1];
            var para=separateArr[0];
            if(para=="rownum")
              if(this.lineNum % 2==0)
                return this.evenLineClass;
              else
                return this.oddLineClass;
            if(typeof extend_obj[funName]=="function")                              //判斷是否爲方法(function)
            {
              
               var fieldArr=para.split(fieldSeparateFlag);                        //分隔字段名稱
               var filedArrLen=    fieldArr.length;
               var paraArr = new Array(filedArrLen);    
                      var callback = extend_obj[funName] || function(){};
               for(var i=0;i<filedArrLen;i++)                                      //獲取多字段參數
                         {
                             paraArr[i] = data[fieldArr[i]];
                         }
                return extend_obj[funName].call(null,paraArr[0],paraArr[1]);                       
            }
        }else{
            if(fieldname!="rownum")
            {
              result=(data[fieldname]!=undefined&&data[fieldname]!=null&&data[fieldname]!="")?data[fieldname]:"&nbsp;";
            }
            else
              {
              result=this.lineNum;
              }
        }
       return result;   
    },
    bindDataList    :  function(data,objid,callback)
    {
        var datalistLen=data.length;
        var callback = callback || function(){};
        var listInnerHtml="";
        var templateObj=document.getElementById(objid);
        if(templateObj==null)
         {
             return;
         }
        var templateHtml="";
        this.lineNum=0;
        if(this.templateTxt=="")
        {
            templateHtml=templateObj.innerHTML;
            this.templateTxt=templateHtml;
        }
        else
            templateHtml=this.templateTxt;
        templateHtml=templateHtml.replace(/(%7B)/g,"{");
        templateHtml=templateHtml.replace(/(%7D)/g,"}");
        templateHtml=templateHtml.replace(/(%7C)/g,"|");
        templateHtml=templateHtml.replace(/(%27)/g,"'");
       for(var i=0;i<datalistLen;i++)
        {
            this.lineNum+=1;
               listInnerHtml+=this.getResultHtml(data[i],templateHtml,"list");
           
         }
        templateObj.innerHTML=listInnerHtml;
        callback();
    },
    replaceForm  :   function(data,fieldname)
    {
        var separateFlag = "|";                                                     //定義分隔符(用於返回對象的擴展)
        var result="";
        var separateArr = fieldname.split(separateFlag);                            //分隔對象成數組
        var arrLen=separateArr.length;
        var extendFlag = arrLen>1?true:false;                           //擴展標誌(有擴展則爲true,沒有擴展則爲false)
        if(extendFlag)
        {
            var para=separateArr[0];                           //獲取參數,即字段
            var funName=separateArr[1];       //用slice截取不包括最後一位,所以不用-1
            var inputtype="text";
            if(arrLen>=3)
               inputtype=separateArr[2];
            if(inputtype=="text")  
              {
                if(typeof extend_obj[funName]=="function")                          //判斷是否爲方法(function)
                {
                        var callback = extend_obj[funName] || function(){};
                return callback(data[para]);                                        //apply,第一個參數爲對象,這裏我們不需要綁定至特定對象,第二個參數必須爲數組
                }
              }
            if(inputtype=="select")
              {
                  var selectId="";
                  if(separateArr[3])
                    selectId=separateArr[3];
                  this.selectList.push([selectId,data[para]]);
                  result="";
             
              }
              if(inputtype=="radio")
              {
                  var radioName="";
                  if(separateArr[3])
                    radioName=separateArr[3];
                  this.radioList.push([radioName,data[para]]);
                  result=""; 
                 
              }
        }else{
            var temp=""+data[fieldname];
            if(temp!=undefined&&temp!=null&&temp!="")
              result=temp.replace("/"","&quot;");
            else
            if(!this.isForm)
              result="&nbsp;";
            else
              if(document.all)
                result="/"/"";
              else
                result="";
             
        }
       return result;   
    },
    bindForm   :  function (data,objid,callback)
    {
        var templateObj=document.getElementById(objid);
        var callback = callback || function(){};
        var listInnerHtml="";
        if(templateObj==null||templateObj.innerHTML=="")
         {
             return;
         }
         var templateHtml=templateObj.innerHTML;
         if(this.templateTxt!="")
            templateHtml=this.templateTxt;
        templateHtml=templateHtml.replace(/(%7B)/g,"{");
        templateHtml=templateHtml.replace(/(%7D)/g,"}");
        templateHtml=templateHtml.replace(/(%7C)/g,"|");
         listInnerHtml+=this.getResultHtml(data,templateHtml,"form");
         templateObj.innerHTML=listInnerHtml;
         var templen=(this.selectList).length;
         if(templen>0)
         {
             for(var j=0;j<templen;j++)
             {
                 this.resetSelectByValue(this.selectList[j][0],this.selectList[j][1]);
             }
         }
         templen=(this.radioList).length;
          if(templen>0)
         {
             for(var j=0;j<templen;j++)
             {
                 this.resetRadioByValue(this.radioList[j][0],this.radioList[j][1]);
             }
         }
        callback();
    },
    resetSelectByValue : function(selectId,optionValue)
    {
    var obj=document.getElementById(selectId);
    var option="";
    if(obj)   
    {
     var len=obj.options.length;
     for(var i=0;i<len;i++)
     {
        option=obj.options[i];
        if(option.value==optionValue)
            option.selected=true;
     }       
    }   
    },
    resetRadioByValue : function(radioName,radioValue)
    {
    var obj=document.getElementsByName(radioName);
    if(obj)
    {
        var objlen=obj.length;
        for(var i=0;i<objlen;i++)
        {
            if(obj[i].value==radioValue)
              obj[i].checked=true;       
        }
    }
    }
}

 

測試數據

student.json

 

[{
    name:'Lily',
    sex :'女',
    age :19
}, {
    name:'Jane',
    sex :'女',
    age :20
}, {
    name:'Jime',
    sex :'男',
    age :20
}, {
    name:'Henily',
    sex :'男',
    age :19
}, {
    name:'Amy',
    sex :'女',
    age :20
}]

 

Jime.json

{
    name:'Jime',
    sex :'女',
    age :'20'
}

 

測試代碼

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
  <head>
    <title>test.html</title>
   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <style>
    *{margin:0px;padding:0px;}
    ul li{display:inline-block; width:100px;}
    </style>
    <script type="text/javascript" src="databind.js"></script>
    <script>
    var listBind = new DataBind();
    var xmlHttp;
    //創建xmlhttprequest
    function createXMLHttpRequest()
    {
        //如果是ie
        if (window.ActiveXObject)
        {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
        //如果不是ie
        else if (window.XMLHttpRequest)
        {
            return new XMLHttpRequest;
        }
    }
    function initList()
    {
        if (xmlHttp.readyState == 4)
        {
            if (xmlHttp.status == 200)
            {
                var list = eval("(" + xmlHttp.responseText + ")");
                //第一個參數data,第二個爲數據塊div的id
                listBind.bindDataList(list, "list");
            }
        }
    }
       
    //xml請求函數
    function getList()
    {
        xmlHttp = createXMLHttpRequest();
        xmlHttp.onreadystatechange = initList;
        var url = "student.json";
       
        //初始化請求地址,方法等
        xmlHttp.open("POST",url,true);
       
        //發送請求
        xmlHttp.send(null);
    }
   
    var formBind = new DataBind();
    var formXmlHttp;
    function getForm(){
        formXmlHttp = createXMLHttpRequest();
        formXmlHttp.onreadystatechange = initForm;
        var url = "Jime.json";
        formXmlHttp.open("POST", url, true);
        formXmlHttp.send(null);
    }
   
    function initForm(){
        if (formXmlHttp.readyState == 4)
        {
            if (formXmlHttp.status == 200)
            {
                var form = eval("(" + formXmlHttp.responseText + ")");
                //第一個參數data,第二個爲數據塊div的id
                formBind.bindForm(form, "form");
            }
        }
    }
   
    function initApp(){
        getList();
        getForm();
    }
    window.onload = initApp;
    </script>
  </head>
 
  <body>
      列表綁定
    <br/>
      <div id="list_content">
        <ul>
            <li>姓名</li>
            <li>性別</li>
            <li>年齡</li>
        </ul>
        <div id="list">
            <ul>
                <li>@{name}</li>
                <li>@{sex}</li>
                <li>@{age}</li>
            </ul>
        </div>
    </div>
   
    <br/><br/>
    表單綁定
    <br/>
    <form id="form">
        姓名:<input type="text" value="@{name}" /><br/>
        性別:
        <select id="sex" @{sex||select|sex}}>
            <option value="男">男</option>
            <option value="女">女</option>
        </select><br/>
        年齡:<input type="text" value="@{age}" />   
    </form>

  </body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章