今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题。

【学习目标】有如下的一组数据通过 Ajax 传递过来:

var dataList = [
{
state: , // 0:sharing 1:unJoin 2:sharingEnd
name: '客户1',
phone:
},
{
state: , // 0:sharing 1:unJoin 2:sharingEnd
name: '客户2',
phone:
},
{
state: , // 0:sharing 1:unJoin 2:sharingEnd
name: '客户3',
phone:
},
{
state: , // 0:sharing 1:unJoin 2:sharingEnd
name: '客户4',
phone:
},
{
state: , // 0:sharing 1:unJoin 2:sharingEnd
name: '客户5',
phone:
}
]

需要把这组数据动态的显示到 HTML 页面上,实现如下的效果:

【解决思路与方法】

DOM 结构和 CSS 样式都已经定义好,但是在获取 data 的值的时候遇到了困难。初学者不知道这个属于哪个范围的知识,于是便开始在网上到处寻找。Json 、数组,都简单的翻阅了一下,在跑偏之前终于找到了问题所在的关键点。现总结如下:

我们之前看到的例子都是使用点标识符创建对象和成员的,例如:

var temp=document.getElementById('example'); 

使用对象字面量的方法更加简单、方便、易懂,例如:

var myObj = {
name:'Tiramisu',
age:20,
phoneNum:15265658952,
myFunction:function(){}
}

以上代码等价于:

var myObj = {};
myObj.name = 'Tiramisu';
myObj.age = 20;
myObj.phoneNum = 15265658952;
myObj.myFunction = function(){};

对于给出的 data 可以看作一个数组,那么当我们访问客户一的属性值的时候可以使用如下的语句:

var oName = dataList[0].name;
var oState = dataList[0].state;
var oPhone = dataList[0].phone;
console.log(oName,oState,oPhone);

基本知识点整理完毕后开始解决目标问题。我要构建的 DOM 结构如下:

<div class="shareBox">
<!-- 分享状态 -->
<div class="shareState clearfix">
<div class="shareSateList" id="shareSateList">
<div class="item sharing"> <!-- 如需切换角标切换类名即可 sharing:分享中;unJoin:未加入;sharingEnd:已结束 -->
<div class="itemInfo">
<p class="name">李四</p>
<p class="phone">15024490626</p><br/>
<p class="state"><a class="endShare" href="javascript:;">结束分享</a></p>
<p class="state"><a class="reShare" href="javascript:;">重新分享</a></p>
</div>
<div class="mark"></div>
</div>
</div>
</div>
</div>

CSS 样式如下:

/*分享状态样式*/
.shareBox .shareState{
width: 900px;
position: relative;
overflow: hidden;
}
.shareBox .shareState .shareSateList{
width: 910px;
}
.shareBox .shareState .mark{ /*分享状态角标*/
width: 57px;
height: 52px;
position: absolute;
right: 0px;
top: 0px;s
}
.shareBox .shareState .sharing .mark{ /*已分享*/
background-image:url(../imgs/sharing.png);
background-repeat: no-repeat;
}
.shareBox .shareState .unJoin .mark{ /*未加入*/
background-image:url(../imgs/unJoin.png);
background-repeat: no-repeat;
}
.shareBox .shareState .sharingEnd .mark{ /*已结束*/
background-image:url(../imgs/sharingEnd.png);
background-repeat: no-repeat;
}
.shareBox .shareState .item{ /*名片样式*/
width: 291px;
height: 157px;
float: left;
border:1px solid #dfdfdf;
margin-right: 10px;
margin-bottom: 10px;
position: relative;
}
.shareBox .shareState .item:hover{
border:1px solid #F26426;
cursor: pointer;
background-image:url(../imgs/delete.png);
background-repeat: no-repeat;
}
.shareBox .shareState .itemInfo{
position: absolute;
top:33px;
left: 68px;
}
.shareBox .shareState p.name{ /*名片姓名*/
font-size: 24px;
}
.shareBox .shareState p.phone{ /*名片联系方式*/
font-size: 18px;
}
.shareBox .shareState p.state{ /*视频分享状态显示*/
color: #4857e3;
}
.shareBox .shareState p.state a{ /*视频分享状态显示*/
text-decoration: none;
}
.shareBox .shareState .sharing .itemInfo p.state a.reShare{
display: none;
}
.shareBox .shareState .unJoin .itemInfo p.state a.reShare{
display: none;
}
.shareBox .shareState .sharingEnd .itemInfo p.state a.endShare{
display: none;
}

接下来的任务便是动态的创建 DOM 并添加样式。在这里我先后讲两种方法,第一种方法是自己写的,比较低级,而且繁琐,代码易读性不高。介于是自己辛辛苦苦写出来的,就贴在这里了。代码如下:

window.onload = function(){
for(var i = 0;i < data.length;i ++){
var oShareStateList = document.getElementById('shareSateList'); //为 shareSateList 新增子节点,即新添加一个名片
var oAddItem = document.createElement('div');
if(data[i].state == 0){
oAddItem.className = 'item sharing';
}
if(data[i].state == 1){
oAddItem.className = 'item unJoin';
}
if(data[i].state == 2){
oAddItem.className = 'item sharingEnd';
}
oShareStateList.appendChild(oAddItem); //添加新增添的名片里的内容
var oAddItemInfo = document.createElement('div');
oAddItemInfo.className = 'itemInfo';
oAddItem.appendChild(oAddItemInfo);
//添加名字
var oName = document.createElement('p');
oName.className = 'name';
oName.innerHTML = data[i].name;
oAddItemInfo.appendChild(oName);
//添加电话号码
var oPhone = document.createElement('p');
oPhone.className = 'phone';
oPhone.innerHTML = data[i].phone;
oAddItemInfo.appendChild(oPhone);
//添加换行
var oBr = document.createElement('br');
oAddItemInfo.appendChild(oBr);
//添加状态分享状态
var oState = document.createElement('p');
oState.className = 'state';
oAddItemInfo.appendChild(oState);
var oA = document.createElement('a');
oA.className = 'endShare';
oA.innerHTML = '结束分享';
oA.href = 'javascript:;';
oState.appendChild(oA);
var oState = document.createElement('p');
oState.className = 'state';
oAddItemInfo.appendChild(oState);
var oA = document.createElement('a');
oA.className = 'reShare';
oA.innerHTML = '重新分享';
oA.href = 'javascript:;';
oState.appendChild(oA); //添分享状态角标
var oMark = document.createElement('div');
oMark.className = 'mark';
oAddItem.appendChild(oMark);
}
}

第二种方法是同事建议的代码,不仅简洁美观,而且代码易读性高,值得很好的学习借鉴。代码如下:

var oShareStateList =  document.getElementById('shareSateList'),
tmp = ['<div class="itemInfo">',
'<p class="name">{name}</p>',
'<p class="phone">{phone}</p><br/>',
'<p class="state"><a class="endShare" href="javascript:;">结束分享</a></p>',
'<p class="state"><a class="reShare" href="javascript:;">重新分享</a></p>',
'</div>',
'<div class="mark"></div>'].join(''),
state = ['sharing', 'unJoin', 'sharingEnd']; function fetchData(){ //异步获取数据
//if( succes ){}
renderAll( dataList ); } function renderAll( datas ){ var data; while( data = datas.shift() ){
render( data );
} } function render( data ){ var _dom = document.createElement( 'div' );
_dom.setAttribute( 'class', 'item ' + state[ data.state ] );
_dom.innerHTML = tmp.replace( /(\{.+?\})/g, function($1){ return data[ $1.slice( 1, $1.length-1 ) ] } );
document.getElementById('shareSateList').appendChild( _dom ); } setTimeout( fetchData, 100 );

【相关知识点】

这些代码涉及到如下的几个知识点:

1.JavaScript shift() 方法 :shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。

2.JavaScript slice() 方法 :slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。语法如下:

stringObject.slice(start,end)

start 参数 :要抽取的片断的起始下标。

end 参数 :紧接着要抽取的片段的结尾的下标。

3.很重要也很适用的一条语句:

tmp.replace( /(\{.+?\})/g, function($1){ return data[ $1.slice( 1, $1.length-1 ) ] } );

【总结】

头脑里要有面向对象编程的概念和习惯,一个函数里面的执行语句如果超过一定数量就要分出来做函数处理。

【javascript 动态添加数据到 HTML 页面】的更多相关文章

  1. 用Javascript动态添加删除HTML元素实例 (转载)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 关于devexpress报表XtraReport,动态修改报表样式(.repx格式),动态添加数据并使用的理解

    一.基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而每个带区中都包含报表控 ...

  3. js表单动态添加数据并提交

    情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到for ...

  4. 第27讲 UI组件之 ScrollView与底部动态添加数据

    第27讲 UI组件之 ScrollView与底部动态添加数据 1. ScrollView(滚动视图) ScrollView(滚动视图)是实现滚动的一个控件,只需要将需要滚动的控件添加到ScrollVi ...

  5. Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

    一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等 ...

  6. Jquery+Ajax实现Select动态添加数据

    https://blog.csdn.net/zhengxiangwen/article/details/46480687 最近在工作中,遇到了一个关于select的问题.一般情况下,select下拉框 ...

  7. ASP.NET网页动态添加数据行

    一看到这标题<ASP.NET网页动态添加数据行>,想起来似乎有点难实现.因为网页的周期性原因,往往在PostBack之后,状态难于有所保留.但Insus.NET又想实现这样的效果,用户点击 ...

  8. javascript动态添加本地文件列表信息

    工作需要做了一个动态添加列表页面的小demo.用到了杂七杂八的javascript小知识. 而且并没有涉及到工作中的具体情境.有些通用,所以暂且罗列到这里.以后需要的时候可以直接拿来用. 看源码总是让 ...

  9. JavaScript 动态添加div 绑定点击事件

    1.动态添加div function cDiv(num){ var oDiv=document.createElement("div"); oDiv.className='divs ...

随机推荐

  1. 服务框架HSF分析之一容器启动

    大家平时都在用这个服务框架.简单阅读了下代码,了解其原理可以方便解决一些常见hsf的问题.限于篇幅,整个分析将分几个系列发布.第一篇将简单介绍Hsf的启动和各组件之间关系. 一.  Hsf总体架构 这 ...

  2. Play!framework 项目部署到Tomcat

    Play Framework有自带的服务器,也可部署到其他服务器上.这里讲解下如何将Play的项目部署到Tomcat. 1.准备war包 首先进入play目录: 比如我的: cd C:\play-1. ...

  3. cocos2d-x学习笔记

    转自:http://blog.csdn.net/we000636/article/details/8263503 接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 JNI:允许 ...

  4. Integer Inquiry_hdu_1047(大数).java

    Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. java程序查不出数据来

    同样的错误,不可再犯第三次!!! 数据库中是char,里面带空格,但在pl/sql中这样写可以查出来.如下: select ipostid from product t where ipostid= ...

  6. linux 内核 编绎配制选项详解

    http://blog.sina.com.cn/s/blog_8308bc810102ux0j.html

  7. netty Getting Started--reference

    reference from:http://docs.jboss.org/netty/3.1/guide/html/start.html 1.1. Before Getting Started 1.2 ...

  8. leetcode每日解题思路 221 Maximal Square

    问题描述: 题目链接:221 Maximal Square 问题找解决的是给出一个M*N的矩阵, 只有'1', '0',两种元素: 需要你从中找出 由'1'组成的最大正方形.恩, 就是这样. 我们看到 ...

  9. 集合练习——Map部分

    练习: 输入诗的名称查询出诗的内容,当输入exit时,退出程序,“春晓”,“静夜思”,“鹅”. package CollectionPart; public class Poetry { privat ...

  10. 微信小程序开闸,关于入口、推广、场景的一些观察与思考

    今夜(1月9号)零点,微信小程序正式上线.在体验了很多款小程序后,我对小程序的使用场景有了更多的认识.以下是一些想法,欢迎交流. 一.小程序的"入口"在哪儿? 1.只有访问过的小程 ...