js笔记四十三之json操作及DOM回流

json介绍

  • 后台 -> 提供一个数据请求的接口,前端通过接口地址可以请求到后台的数据
  • 前端 -> 前端得到数据后,需要进行数据解析, 把数据绑定在html页面上 -> "数据绑定"
sequenceDiagram
前端->>后台: 发送请求获取数据
后台->>前端: 把准备好的数据返回给前端
后台-->>前端: (后台给前端返回的数据一般都是json格式的)

上面是markdown的流程图语法,但是简书好像不支持,只有截图了(下图)

前后端交互
  • json不是一个单独的数据类型,它只是一种特殊的数据格式 -> 它是对象数据类型的
var obj = {name:"lilei", age: 18}; // 普通格式对象
var jsonObl = {"name":"lilei","age":17}; // json格式对象  
// 相对于普通的格式来说,只是把属性名用双引号包起来了(只能是双引号)
  • 在window浏览器对象中,提供了一个叫json的属性, 它这里面提供了两个方法:
    1. JSON.parse -> 把JSON格式的字符串转换为JSON格式的对象
    2. JSON.stringify -> 把JSON格式的对象转换为JSON格式的字符串
var jsonObj = {"name":"lilei","age":17};
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr) // '{"name":"lilei","age":17}'
console.log(JSON.parse(jsonStr))// {name: "lilei", age: 17}

在ie6~7浏览器中,我们的window下没有JSON对象,刚才的parse和stringify都不存在了

// 把JSON格式的对象转换为JSON格式的字符串
var str = '{"name":"lilei","age":17}';
JSON.parse(str);
eval("(" + str + ")"); // 使用eval,不要忘记手动的加一个小括号

json数据绑定

  • json.html
<style type="text/css">
    *{
        padding: 0;
        margin: 0;
    }
    li{
        list-style: none;
    }
    #ul1{
        width: 150px;
        margin: 30px auto;
        padding: 12px;
        border: 1px solid green;
    }
    #ul1 li{
        /*超出文本的自动裁切*/
        text-overflow: ellipsis; /*超出文本的以 ... 显示*/
        white-space: nowrap; /*强制不换行*/
        overflow: hidden; /*溢出隐藏*/
    }
    #ul1 li span{
        display: inline-block;
        width: 28px;
        height: 28px;
        background: red;
        border-radius: 50%;
        line-height: 28px; 
        text-align: center;
        color: #fff;
        margin: 12px 10px 0 0;
    }
</style>
<ul id="ul1">
    <li><span class="bg">01</span>aaaaaaaaaaaaa</li>
    <li><span class="bg">02</span>bbbbbbbbbbbbb</li>
    <li><span class="bg">03</span>ccccccccccccc</li>
</ul>
<script type="text/javascript" src="json.js"></script>
  • json.js
var jsonObj = [
    {
        "title":"qqqqqqqqqqqqqq",
        "desc":"q1q1q1q1q1q1q1q1q1q1q1"
    },
    {
        "title":"wwwwwwwwwwwwww",
        "desc":"w2w2w2w2w2w2w2w2w2w2w2"
    },
    {
        "title":"eeeeeeeeeeeeee",
        "desc":"e1e1e1e1e1e1e1e1e1e1e1"
    },
    {
        "title":"rrrrrrrrrrrrrr",
        "desc":"r1r1r1r1r1r1r1r1r1r1r1"
    },
    {
        "title":"tttttttttttttt",
        "desc":"t1t1t1t1t1t1t1t1t1t1t1"
    },
    {
        "title":"yyyyyyyyyyyyyy",
        "desc":"y1y1y1y1y1y1y1y1y1y1y1"
    },
    {
        "title":"uuuuuuuuuuuuuu",
        "desc":"u1u1u1u1u1u1u1u1u1u1u1"
    },
    {
        "title":"iiiiiiiiiiiiii",
        "desc":"i1i1i1i1i1i1i1i1i1i1i1"
    }
]
var oUl = document.getElementById("ul1");
var oLis = oUl.getElementsByTagName("li");

// 鼠标移入移出,背景变色
for (var i = 0; i < oLis.length; i++) {
    oLis[i].onmouseover = function (){
        this.style.backgroundColor = 'pink';
    }
    oLis[i].onmouseout = function (){
        this.style.backgroundColor = '';
    }
}
  1. 利用动态创建元素节点和把它追加到页面中的方式来实现数据绑定
    优势: 把需要动态绑定的内容一个个追加到页面中,对原来的元素没有任何影响
    弊端: 浏览器每创建一个li, 就添加到页面中,引发一次DOM回流,最后引发会留的次数过多, 影响我们的性能
for (var i = 0; i < jsonObj.length; i++) {
    var cur = jsonObj[i];
    var oLi = document.createElement("li");
    var num = i+4
    if(num<10){
        num = "0" + num
    }
    oLi.innerHTML = "<span>" + num + "</span>" + cur.title;
    oUl.appendChild(oLi)
}
  1. 字符串拼接的方式: 首先循环需要绑定的数据, 然后把需要动态绑定的标签以字符串的方式拼接到一起,拼接完成后, 最后统一添加到页面中 ("字符串拼接绑定数据是工作中最常用的一种绑定数据的方式" -> 模板引擎数据绑定 )
    优势: 事先把内容拼接好, 最后添加到页面中, 只引发一次回流
    弊端: 把新拼接的字符串添加到 #ul1 中,原有的三个li的鼠标滑过效果都消失了(原来标签绑定的时间都消失了)
var str = "";
for (var i = 0; i < jsonObj.length; i++) {
    var cur = jsonObj[i];
    var num = i+4
    if(num<10){
        num = "0" + num
    }
    str += "<li>";
    str += "<span>" + num + "</span>";
    str += cur.title;
    str += "</li>"
}
// console.log(str);
oUl.innerHTML += str; // -> oUl.innerHTML = oUl.innerHTML + str;
// (把之前的三个 li 以字符串的方式获取到)+str ; 
// (拼接完成的整体还是字符串, 最后再把字符串统一的添加到页面中, 浏览器还需要把字符串渲染成对应的标签)
  1. 文档碎片
var frg = document.createDocumentFragment();
// 创建一个文档碎片, 相当于临时创建一个容器

for (var i = 0; i < jsonObj.length; i++) {
    var cur = jsonObj[i];
    var oLi = document.createElement("li");
    var num = i+4
    if(num<10){
        num = "0" + num
    }
    oLi.innerHTML = "<span>" + num + "</span>" + cur.title;
    frg.appendChild(oLi)
}
oUl.appendChild(frg)
frg = null;

js中DOM深入知识:

-> 回流(重排 reflow): 当页面中的结构发生改变(增加/删除元素, 位置发生改变...), 浏览器都需要重新的计算一遍最新的DOM结构, 重新的进行渲染
-> 重绘:某一个元素的部分样式发生改变了, 浏览器只需要重新的渲染当前元素即可

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 周五的课程葱下面的故事开始,一只热爱聚会的鲨鱼,匆匆赶赴火星参加聚会,可是...... 有趣的故事背后,渗...
    Lucas88阅读 159评论 0 0
  • 关于第一次以林素秋署名的八篇都市系列,我有如下话想说: 其言一,写的好与坏并不重要,从中若有所获亦非我予,请君姑妄...
    24e2f6668318阅读 200评论 0 0
  • 去年曾经买过一本杰德·麦肯纳写的《灵性的实相》,数次翻过几页,都无法再看下去,只好置之书柜,至今未读。 今天从省图...
    袁一今阅读 3,967评论 0 1
  • I love you,just like the first moment I met you... 【From ...
    媞青阅读 129评论 0 1