zoukankan      html  css  js  c++  java
  • -_-#【减少 DOM 访问】“离线”更新节点,再将它们添加到树中

    Minimize DOM Access

    javascript 之 DOM 优化

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <ul id="mylist1"></ul>
        <ul id="mylist2"></ul>
        <ul id="mylist3"></ul>
        <script>
            var data = [
                {
                    'name': 'a',
                    'url': 'http://www.a.com/'
                },
                {
                    'name': 'b',
                    'url': 'http://www.b.com/'
                }
            ]
            function appendDataToElement(appendToElement, data) {
                var a
                var li
                var i = 0
                var max = data.length
                for (; i < max; i++) {
                    a = document.createElement('a')
                    a.href = data[i].url
                    a.appendChild(document.createTextNode(data[i].name))
                    li = document.createElement('li')
                    li.appendChild(a)
                    appendToElement.appendChild(li)
                }
            }
    
            // 离线操作DOM树:对DOM树结构进行较大的改变时,需要先将元素脱离文档流,然后进行改变操作,最后再放回到文档流中
            // 减少重排的一个方法是通过改变 display 属性,临时从文档上移除 <ul> 元素然后再恢复它
            var ul1 = document.getElementById('mylist1')
            ul1.style.display = 'none'
            appendDataToElement(ul1, data)
            ul1.style.display = 'block'
    
            // 在文档之外创建并更新一个文档片断,然后将它附加在原始列表上
            var fragment = document.createDocumentFragment()
            appendDataToElement(fragment, data) // 循环添加,多次操作。拼接字符串一次性添加不是一样吗。
            document.getElementById('mylist2').appendChild(fragment)
    
            // 创建要更新节点的副本,然后在副本上操作,最后用新节点覆盖老节点
            var old = document.getElementById('mylist3')
            var clone = old.cloneNode(true)
            appendDataToElement(clone, data)
            old.parentNode.replaceChild(clone, old)
        </script>
    </body>
    </html>
  • 相关阅读:
    axios 封装
    Git 常用命令行
    React Native 开发环境搭建
    React Native 组件分类
    日期插件rolldate.js的使用
    单图片上传
    使用css完成物流进度的样式
    搜索过滤 以及排序
    v-for的使用方法
    v-if 和v-show 用法
  • 原文地址:https://www.cnblogs.com/jzm17173/p/3356787.html
Copyright © 2011-2022 走看看