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

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

  1. var dataList = [
  2. {
  3. state: , // 0:sharing 1:unJoin 2:sharingEnd
  4. name: '客户1',
  5. phone:
  6. },
  7. {
  8. state: , // 0:sharing 1:unJoin 2:sharingEnd
  9. name: '客户2',
  10. phone:
  11. },
  12. {
  13. state: , // 0:sharing 1:unJoin 2:sharingEnd
  14. name: '客户3',
  15. phone:
  16. },
  17. {
  18. state: , // 0:sharing 1:unJoin 2:sharingEnd
  19. name: '客户4',
  20. phone:
  21. },
  22. {
  23. state: , // 0:sharing 1:unJoin 2:sharingEnd
  24. name: '客户5',
  25. phone:
  26. }
  27. ]

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

【解决思路与方法】

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

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

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

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

  1. var myObj = {
  2. name:'Tiramisu',
  3. age:20,
  4. phoneNum:15265658952,
  5. myFunction:function(){}
  6. }

以上代码等价于:

  1. var myObj = {};
  2. myObj.name = 'Tiramisu';
  3. myObj.age = 20;
  4. myObj.phoneNum = 15265658952;
  5. myObj.myFunction = function(){};

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

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

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

  1. <div class="shareBox">
  2. <!-- 分享状态 -->
  3. <div class="shareState clearfix">
  4. <div class="shareSateList" id="shareSateList">
  5. <div class="item sharing"> <!-- 如需切换角标切换类名即可 sharing:分享中;unJoin:未加入;sharingEnd:已结束 -->
  6. <div class="itemInfo">
  7. <p class="name">李四</p>
  8. <p class="phone">15024490626</p><br/>
  9. <p class="state"><a class="endShare" href="javascript:;">结束分享</a></p>
  10. <p class="state"><a class="reShare" href="javascript:;">重新分享</a></p>
  11. </div>
  12. <div class="mark"></div>
  13. </div>
  14. </div>
  15. </div>
  16. </div>

CSS 样式如下:

  1. /*分享状态样式*/
  2. .shareBox .shareState{
  3. width: 900px;
  4. position: relative;
  5. overflow: hidden;
  6. }
  7. .shareBox .shareState .shareSateList{
  8. width: 910px;
  9. }
  10. .shareBox .shareState .mark{ /*分享状态角标*/
  11. width: 57px;
  12. height: 52px;
  13. position: absolute;
  14. right: 0px;
  15. top: 0px;s
  16. }
  17. .shareBox .shareState .sharing .mark{ /*已分享*/
  18. background-image:url(../imgs/sharing.png);
  19. background-repeat: no-repeat;
  20. }
  21. .shareBox .shareState .unJoin .mark{ /*未加入*/
  22. background-image:url(../imgs/unJoin.png);
  23. background-repeat: no-repeat;
  24. }
  25. .shareBox .shareState .sharingEnd .mark{ /*已结束*/
  26. background-image:url(../imgs/sharingEnd.png);
  27. background-repeat: no-repeat;
  28. }
  29. .shareBox .shareState .item{ /*名片样式*/
  30. width: 291px;
  31. height: 157px;
  32. float: left;
  33. border:1px solid #dfdfdf;
  34. margin-right: 10px;
  35. margin-bottom: 10px;
  36. position: relative;
  37. }
  38. .shareBox .shareState .item:hover{
  39. border:1px solid #F26426;
  40. cursor: pointer;
  41. background-image:url(../imgs/delete.png);
  42. background-repeat: no-repeat;
  43. }
  44. .shareBox .shareState .itemInfo{
  45. position: absolute;
  46. top:33px;
  47. left: 68px;
  48. }
  49. .shareBox .shareState p.name{ /*名片姓名*/
  50. font-size: 24px;
  51. }
  52. .shareBox .shareState p.phone{ /*名片联系方式*/
  53. font-size: 18px;
  54. }
  55. .shareBox .shareState p.state{ /*视频分享状态显示*/
  56. color: #4857e3;
  57. }
  58. .shareBox .shareState p.state a{ /*视频分享状态显示*/
  59. text-decoration: none;
  60. }
  61. .shareBox .shareState .sharing .itemInfo p.state a.reShare{
  62. display: none;
  63. }
  64. .shareBox .shareState .unJoin .itemInfo p.state a.reShare{
  65. display: none;
  66. }
  67. .shareBox .shareState .sharingEnd .itemInfo p.state a.endShare{
  68. display: none;
  69. }

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

  1. window.onload = function(){
  2. for(var i = 0;i < data.length;i ++){
  3. var oShareStateList = document.getElementById('shareSateList');
  4.  
  5. //为 shareSateList 新增子节点,即新添加一个名片
  6. var oAddItem = document.createElement('div');
  7. if(data[i].state == 0){
  8. oAddItem.className = 'item sharing';
  9. }
  10. if(data[i].state == 1){
  11. oAddItem.className = 'item unJoin';
  12. }
  13. if(data[i].state == 2){
  14. oAddItem.className = 'item sharingEnd';
  15. }
  16. oShareStateList.appendChild(oAddItem);
  17.  
  18. //添加新增添的名片里的内容
  19. var oAddItemInfo = document.createElement('div');
  20. oAddItemInfo.className = 'itemInfo';
  21. oAddItem.appendChild(oAddItemInfo);
  22. //添加名字
  23. var oName = document.createElement('p');
  24. oName.className = 'name';
  25. oName.innerHTML = data[i].name;
  26. oAddItemInfo.appendChild(oName);
  27. //添加电话号码
  28. var oPhone = document.createElement('p');
  29. oPhone.className = 'phone';
  30. oPhone.innerHTML = data[i].phone;
  31. oAddItemInfo.appendChild(oPhone);
  32. //添加换行
  33. var oBr = document.createElement('br');
  34. oAddItemInfo.appendChild(oBr);
  35. //添加状态分享状态
  36. var oState = document.createElement('p');
  37. oState.className = 'state';
  38. oAddItemInfo.appendChild(oState);
  39. var oA = document.createElement('a');
  40. oA.className = 'endShare';
  41. oA.innerHTML = '结束分享';
  42. oA.href = 'javascript:;';
  43. oState.appendChild(oA);
  44. var oState = document.createElement('p');
  45. oState.className = 'state';
  46. oAddItemInfo.appendChild(oState);
  47. var oA = document.createElement('a');
  48. oA.className = 'reShare';
  49. oA.innerHTML = '重新分享';
  50. oA.href = 'javascript:;';
  51. oState.appendChild(oA);
  52.  
  53. //添分享状态角标
  54. var oMark = document.createElement('div');
  55. oMark.className = 'mark';
  56. oAddItem.appendChild(oMark);
  57. }
  58. }

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

  1. var oShareStateList = document.getElementById('shareSateList'),
  2. tmp = ['<div class="itemInfo">',
  3. '<p class="name">{name}</p>',
  4. '<p class="phone">{phone}</p><br/>',
  5. '<p class="state"><a class="endShare" href="javascript:;">结束分享</a></p>',
  6. '<p class="state"><a class="reShare" href="javascript:;">重新分享</a></p>',
  7. '</div>',
  8. '<div class="mark"></div>'].join(''),
  9. state = ['sharing', 'unJoin', 'sharingEnd'];
  10.  
  11. function fetchData(){
  12.  
  13. //异步获取数据
  14. //if( succes ){}
  15. renderAll( dataList );
  16.  
  17. }
  18.  
  19. function renderAll( datas ){
  20.  
  21. var data;
  22.  
  23. while( data = datas.shift() ){
  24. render( data );
  25. }
  26.  
  27. }
  28.  
  29. function render( data ){
  30.  
  31. var _dom = document.createElement( 'div' );
  32. _dom.setAttribute( 'class', 'item ' + state[ data.state ] );
  33. _dom.innerHTML = tmp.replace( /(\{.+?\})/g, function($1){ return data[ $1.slice( 1, $1.length-1 ) ] } );
  34. document.getElementById('shareSateList').appendChild( _dom );
  35.  
  36. }
  37.  
  38. setTimeout( fetchData, 100 );

【相关知识点】

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

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

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

  1. stringObject.slice(start,end)

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

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

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

  1. 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. C# DataTable的詳細使用方法

    在项目中经经常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTabl ...

  2. [HTTPS] MAN IN THE MIDDLE (MITM)

    If you go a public caffee shop, they have free wifi. How could you make sure your infomration cannot ...

  3. debugfs恢复文件

    echo "this is test" >xx debugfs: ls -d /root/test1 () . () .. () xx <> () test.c ...

  4. .NET技术-.NET各大网站-编程技术网址

    Source Code: http://www.codeproject.com/ The Code Projecthttp://www.tomore.com/ 中 国盟动力http://www.cod ...

  5. iOS开发经验总结(上)

    在iOS开发中经常需要使用的或不常用的知识点的总结,几年的收藏和积累(踩过的坑). 一. iPhone Size 手机型号 屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s ...

  6. Link-local address

    A link-local address is an Internet Protocol address that is intended only for communications within ...

  7. 1.Linux系统(CenntOS)固定IP的设定

    首先:我们配置一个临时的固定的固定ip,作用是让我们用其他的shell工具连接虚拟机 ifconfig eth0 192.168.10.168 在主机用ping命令查询连通后再进行下一步 ping 1 ...

  8. jBPM开发入门指南

    http://blog.csdn.net/eric474470/article/details/7665265 工作流虽然还在不成熟的发展阶段,甚至还没有一个公认的规范标准.但其应用却已经在快速展开, ...

  9. Quartz Cron表达式生成器

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , - * /  2  分  是  0 ...

  10. 小巧、高效、美观的弹出日历组件 ——lhgcalendar

    http://www.cnblogs.com/lhgstudio/archive/2009/02/13/1390381.html 没法上传附件,请到以上地址下载 下载地址:http://files.c ...