模型和渲染分离实现HTML的各种选择框

 

/**

   *  实现一个简单的选择框渲演器,大致思路如下:

   *  1、定义一个数据模型类,模型数据来源不做限制

   *  2、定义一个渲染器,渲染器根据数据模型和可选参数进行页面的渲染

   *  3、支持初始化选项设定 

   */   

  //定义一个数据模型

  function SelectModel(name,value){

          //public field

          this.options = [];       

          this.name = name;

          this.value = value || "";

 

          //private method

          function Option(value,text)

          {

               var value = value;

               var text = text;

               this.getValue = function(){

                  return value; 

               }

               this.getText = function(){

                  return text; 

               }            

          }

 

          //prototype method also public

          SelectModel.prototype.addOption = function(value,text)

          {

                this.options.push(new Option(value,text)); 

          }

 

          //set constructor

          SelectModel.prototype.constructor = SelectModel;

    }

 

 

   //页面元素渲染类

   function SelectRender(model,propertys){

        //private field

        var model = model;

        var propertys = propertys || {};

        var render = {

            "select":function(){

                var header = '<select name="'+model.name+'" '+(propertys.multiple?'multiple':'')+'>';

                var footer = '</select>';

 

                var body = (propertys.defaultNull?'<option value="">--请选择--</option>':'');

                var datas = model.options;          

                for(var i=0;i<datas.length;i++){

                    body += '<option value="'+datas[i].getValue()+'">'+datas[i].getText()+'</option>';

                }

 

                return header + body + footer;

            },

            "checkbox":function(){

                var body = '';

                var datas = model.options;          

                for(var i=0;i<datas.length;i++){

                    body += '<input type="checkbox" name="'

                             +model.name+'" value="'

                             +datas[i].getValue()+'"/>'

                             +datas[i].getText();

                }

 

                return body;

            },

            "radio":function(){

                var body = '';

                var datas = model.options;          

                for(var i=0;i<datas.length;i++){

                    body += '<input type="radio" name="'

                             +model.name+'" value="'

                             +datas[i].getValue()+'"/>'

                             +datas[i].getText();

                }

 

                return body;

            }

        }  

 

        var Init = {//初始化

            "select":function(){

                document.all(model.name).value = model.value;

            },

            "radio":function(){

                var objectArray = document.all(model.name);

                for(var i=0; i < objectArray.length; i++){

                     if(objectArray[i].value == model.value){

                         objectArray[i].checked = true;

                         break                         

                     }

                }

            },

            "checkbox":function(){

                var objectArray = document.all(model.name);

                var values = model.value;

                for(var k=0;k<values.length;k++){

                  for(var i=0; i < objectArray.length; i++){

                       if(objectArray[i].value == values[k]){

                           objectArray[i].checked = true;                        

                       }

                  }

               }

            }

        }     

 

        //---------private method------------------------    

        function handleRender(id,name){

              var renderHtml = render[name]();

              var renderPlace = document.all(id);

              if(renderPlace){

                   try

                   {

                      renderPlace.innerHTML =  renderHtml; 

                      Init[name](); 

                   }catch(e)

                   {

                      //ignore;

                   }   

              } 

 

              return renderHtml;

        }

 

        //------public method---------------------

        this.selectElement = function(id){               

              return handleRender(id,'select');

        }

        this.radioElement =  function(id){

              return handleRender(id,'radio');

        }

        this.checkboxElement = function(id){

              return handleRender(id,'checkbox');

        }

   }

 

   //--------------使用例子-------------------------------------------

 

   //定义模型 

   var model = new SelectModel("country","01");

   //var model = new SelectModel("country",["01","02"]);//如果渲染成checkbox并且需要初始化多个选项

   model.addOption("01","中国");

   model.addOption("02","英国");

   model.addOption("03","美国");

 

   //进行渲染 

   var render = new SelectRender(model,{defaultNull:true});

   render.selectElement('父节点ID') 或者 document.all('父节点ID').innerHTML = render.selectElement();

   render.radioElement('父节点ID') 或者 document.all('父节点ID').innerHTML = render. radioElement();

   render.checkboxElement('父节点ID') 或者 document.all('父节点ID').innerHTML = render.checkboxElement();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值