DocumentFragment 节点不属于文档树,继承的 parentNode 属性总是 null。

不过它有一种特殊的行为,该行为使得它非常有用,即当请求把一个 DocumentFragment 节点插入文档树时,插入的不是 DocumentFragment 自身,而是它的所有子孙节点。这使得 DocumentFragment 成了有用的占位符,暂时存放那些一次插入文档的节点。它还有利于实现文档的剪切、复制和粘贴操作

同时我们了解到当需要对页面DOM进行操作的时候必然会导致多次 重绘、回流(什么是重绘,回流?)。这样会加大页面的负担。影响页面性能。因此我们可以创建这样一个临时占位符。

测试 demo:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div id="box">
<button onclick="addList()">Button</button>
<button onclick="addList2()">Button</button>
</div>
<div>
<ul id="myList">
<li>item</li>
</ul>
<hr>
</div>
<script type="text/javascript"> function addList(){ var doc = document,
list = doc.getElementById('myList'),
item,
i;
console.time('addList');
for(i=0; i<1000; i++){
item = doc.createElement('li');
list.appendChild(item);
item.appendChild(doc.createTextNode('item '+ i));
console.log(list.clientHeight);
}
console.timeEnd('addList');
} function addList2(){ var doc = document,
list = doc.getElementById('myList'),
fragment = doc.createDocumentFragment(),
item,
i;
console.time('addList2');
for(i=0; i<1000; i++){
item = doc.createElement('li');
item.appendChild(doc.createTextNode('item '+ i));
fragment.appendChild(item);
console.log(list.clientHeight);
}
list.appendChild(fragment);
console.timeEnd('addList2');
} </script> </body>
</html>

借用 在知乎上 网友 付星昱 的评论 解释一下:

直接往元素里 append的操作会引发 reflow,在循环中多次触发 reflow是非常不讨好的事情,
我们聪明的现代浏览器会将短时间内的多次 reflow收集起来组成队列,在一定时间后 flush队列,将多个 reflow的变为一次 reflow。

直接获取 offsetHeight会导致浏览器马上 flush队列,计算出当前值。
除了计算 offsetHeight,clientHeight/clientWidth,offsetWidth,scrollTop/Left/Height/width也会使浏览器立即 flush队列。

可以理解为什么  我之前多次测试 而看到的 两种方式 在时间上没什么差异的原因了;

测试应用documentFragment 和 直接操作dom 的区别的更多相关文章

  1. DocumentFragment --更快捷操作DOM的途径

    使用DocumentFragment将一批子元素添加到任何类似node的父节点上,对这批子元素的操作不需要一个真正的根节点.可以不依赖可见的DOM来构造一个DOM结构,而效率高是它真正的优势,试验表明 ...

  2. 原生JS和jQuery操作DOM的区别小结

    一.Js原生对象和jQuery实例对象的相互转化: (1).原生JS对象转JQ对象: $(DOM对象); (2). JQ对象转原生JS对象: $(DOM对象).get(index); //注意区分eq ...

  3. Javascript操作DOM常用API总结

    基本概念 在讲解操作DOM的api之前,首先我们来复习一下一些基本概念,这些概念是掌握api的关键,必须理解它们. Node类型 DOM1级定义了一个Node接口,该接口由DOM中所有节点类型实现.这 ...

  4. JavaScript 节点操作Dom属性和方法(转)

    JavaScript 节点操作Dom属性和方法   一些常用的dom属性和方法,列出来作为手册用. 属性:   1.Attributes 存储节点的属性列表(只读)   2.childNodes 存储 ...

  5. JavaScript 操作 DOM 常用 API 总结

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  6. 使用原生 JavaScript 操作 DOM

    原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...

  7. jQuery框架-2.jQuery操作DOM节点与jQuery.ajax方法

    一.jQuery操作DOM 内部插入操作: append(content|fn):向每个匹配的元素内部追加内容. prepend(content):向每个匹配的元素内部前置内容. 外部插入操作: af ...

  8. [总结]JS操作DOM常用API详解

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  9. Angular使用总结 --- 如何正确的操作DOM

    无奈接手了一个旧项目,上一个老哥在Angular项目中大量使用了JQuery来操作DOM,真的是太不讲究了.那么如何优雅的使用Angular的方式来操作DOM呢? 获取元素 1.ElementRef  ...

随机推荐

  1. 剑指 offer set 17 判断一棵树是否是平衡树

    总结 1. 书上给出一个简洁代码, 说是会重复遍历. 2. 框架相同, 可以写出下面的代码 class Solution { public: bool ans; int getHeight(TreeN ...

  2. iOS开发之--改变系统导航的颜色,字体,还有返回样式的自定义

    在写项目的工程中,我们可能会遇到各种各样的项目,写的方法也是各有不同,不喜欢自定义的小伙伴也很多, 下面我就记录下系统导航和barbuttonitem的修改系统空间的方法: 1,添加rightbarb ...

  3. 获取本地的json并展示

    我们知道在java中,有两种方式可以传输数据 1.json javaScript Object Notation 是以健值段的方式展示并显示数据的 2.xml 是以节点的方式展示并显示数据的 xml是 ...

  4. Linux 下8种优秀的屏幕录制机

    导读 屏幕录制机已经成为常见的和良好的实践来记录一个重要桌面会话,例如,你想玩一个难度较大的游戏,并且向记录是如何完成的,或者你打算创建一个视频教程,入门文章或指南,或任何其他活动和记录你的桌面会话, ...

  5. python3个人习惯的gitignore

    简介 就是普通的.gitignore # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C ext ...

  6. 在R语言中封装类读写sql操作工具类

    1.mysql_helper.R # 使用RMySQL操作数据库 # 载入DBI和RMySQL包 library(DBI) library(RMySQL) mysql_con <- functi ...

  7. Threaten Model

    探测(扫描器,情报搜集)--入侵(vul,exp)--潜伏(RATS,setmft,AFSET)--横向入侵(admin cert,RATS)---信息泄漏(vpn,rats,通讯通道)--删除踪迹( ...

  8. Storm-源码分析- Component ,Executor ,Task之间关系

    Component包含Executor(threads)的个数 在StormBase中的num-executors, 这对应于你写topology代码时, 为每个component指定的并发数(通过s ...

  9. 爬虫之Xpath详解

    XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...

  10. ruamel.yaml 将字典写入yaml文件

    #安装 pip install ruamel.yaml import os from ruamel import yaml # 将字典写入到yaml my_dic = { 'name': '张三', ...