Javascript 通过json自动生成Dom小示例

json转html 三重奏

 

原料:json

 

var json={
    'div':{id:'flower',className:"a1",sub:[
        {
            'ul':{id:'flower1',className:["a2","a3"],sub:[
                {'li':{num:3,con:"内容内容内容",fn:{'click':function(){alert('我是LiLi')}}}}
            ]}
        },
        {
            'ul':{id:'flower4',className:["a2","a3"],sub:[
                {'li':{num:3,con:"第2轮了",fn:{'click':function(){alert('我是LiLi')}}}}
            ]}
        },
        {
            'span':{id:'q',con:"我是span"}
        }
    ]}
}

id=id

className=class

num=循环次数

fn=绑定函数

con=元素内容

sub =代表有子节


主菜:method

JsonToHtml={
    init:function(data,parent){//jsonDB,父元素
        
for(var attr in data){
            
if(data[attr]["id"]){var num=1}else{var num=data[attr]["num"]||1}//如果存在id,则循环默认为1,因为id不可重复
            
for(var j=0;j<num;j++){
                
var obj= document.createElement(attr);
                parent ? parent.appendChild(obj) : document.body.appendChild(obj);//递归时传入父元素,没有则默认从body输出
                
for(var attr2 in data[attr]){
                    
var _tempAttr=data[attr][attr2];
                    
switch(attr2){
                        
case "id":
                            obj.id=_tempAttr;
                            
break;
                        
case "className": //支持多个class传入~简了点~
                            
if(_tempAttr.length && _tempAttr.pop){
                                 
for(var k=0;k<_tempAttr.length;++k){
                                    obj.className= obj.className+" "+_tempAttr[k] ; 
                                 }
                            }else{ obj.className =_tempAttr;}
                            
break;
                        
case "sub": //如果有子节点则开始递归
                            
for(var i=0;i<_tempAttr.length;i++){
                                _tempAttr[i].sub ? this.init(_tempAttr[i]) : this.init(_tempAttr[i],obj)
                            }
                            
break;
                        
case "con"://设置内容,可以生成新的子元素
                            obj.innerHTML=_tempAttr;
                            
break;
                        
case "num":
                            
break;
                        
case "fn"://绑定方法
                            
for(var fns in _tempAttr){
                                
if (window.addEventListener) {
                                    obj.addEventListener(fns, _tempAttr[fns], false);
                                } else {
                                    
if (window.attachEvent) {
                                        obj.attachEvent("on" + fns, _tempAttr[fns]);
                                    }
                                }
                            }
                            
break;
                        
default : //设置属性
                            obj.setAttribute(attr2,_tempAttr);break;
                    }
                }
            }
        }
        
return this;
    }
}

JsonToHtml.init(json); //初始化


上菜

 

<div id="flower" class="a1">
    
<ul id="flower1" class="a2 a3">
        
<li>内容内容内容</li>
        
<li>内容内容内容</li>
        
<li>内容内容内容</li>
    
</ul>
  
<ul id="flower4" class="a2 a3">
        
<li>第2轮了</li>
        
<li>第2轮了</li>
        
<li>第2轮了</li>
    
</ul>
  
<span id="q">我是span</span>
<div>


主要还是通过递归和迭代来遍历json成员生成html元素 ,比较好的是num能制定循环次数可以少写很多代码.具体应用看场景了

这只是个小例子,期待后续!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值