第十四课:js操作节点的插入,复制,移除
节点插入
appendChild方法,insertBefore方法是常用的两个节点插入方法,具体实现,请看js高级程序设计,或者自行百度。
这里提一下面试时经常会问到的问题,插入多个节点时,你是怎么插入的。如果你回答一个一个插入,那么每插入一次就会引起一次回流,插入100次,(面试官一般会说100,或者1000个节点的插入),就引起100次的回流,这势必让面试官觉得你连基本的东西都不懂,秒杀掉。
其实这时你应该用到的是文档碎片,先把新建的元素插入文档碎片中,然后再一次性的把文档碎片中的元素插入到页面中。不管添加多少个,只会引起一次回流。
节点的复制
cloneNode,复制节点,文档碎片对象也可以通过此方法复制。
但是IE6-IE8会自作多情的把节点上的attachEvent绑定的事件也一起复制。早些年,为了在IE6-IE8中不复制attachEvent事件,jQuery动用outerHTML复制节点。
另外,标准浏览器的cloneNode,只会复制元素写在标签内的属性与通过setAttribute设置的属性,而IE6-IE8还支持通过node.aaa = "xxx",设置的属性复制。
IE6-IE8不能复制script节点的text属性。
IE6-IE8不能复制input和textarea标签的默认值。
IE6-IE8不能复制option节点的选中状态。
IE6-IE8不能复制checkbox和radio节点的选中状态。
IE6-IE7不能复制checkbox和radio节点的defaultChecked属性(就是没有这个属性了)。
所有浏览器会给没有value的checkbox一个默认的value值"on",而chrome没有。
节点的移除
removeChild,创建Range对象选中目标节点然后deleteContents,textContent。
removeChild在ie6-7下有内存泄露问题.不仅跟垃圾回收有关还跟IE的DOM超空间有关。IE8尽管有DOM超空间,但是不会引起removeChild的内存泄露。
在IE6-IE8中存在一个DOM超空间的概念,当元素被移除DOM树,又有js关联时,元素不会消失,它被保存在一个叫做超空间的地方。可以用是否存在parentNode来判断元素是否在超空间。
举个例子:
var div = dcoument.createElement("div");
document.body.removeChild(documen.body.appendChild(div)); //appendChild返回新添加的节点
div.parentNode //IE6-8下会显示object,因为js中的div变量关联着这个div元素,所以它会存在DOM超空间中,所以它的parentNode存在。但是其他浏览器就显示null。
if(div.parentNode ) div.parentNode.nodeType //11 -> 文档碎片
因此IE6-IE8下,如果内存中出现很多这样的碎片,将会很容易造成内存泄露。IE8进行了优化,所以解决了removeChild内存泄露问题。
对于IE6-IE7删除节点的方法,可以使用innerHTML="";
举个例子:
var div = dcoument.createElement("div");
documen.body.appendChild(div);
documen.body.innerHTML = "";
div.parentNode //null,所有浏览器都是。
innerHTML 方式清除节点,不会弄到DOM超空间去。
但innerHTML删除节点,在IE6-8下也有个问题,
举一个例子:
<div id="test">test</div>
var div = dcoument.getElementById("test");
div.parentNode.removeChild(div);
console.log(div.id div.innerHTML) //test test 所有浏览器都是。
如果使用innerHTML ,
div.parentNode.innerHTML ="";
console.log(div.id div.innerHTML) //test test 标准浏览器。test "" IE6-IE8。
纯粹的js操作不会带来什么消耗,95%的消耗是DOM操作引起的。因此,我们在设置样式前,将元素移除DOM树,设置完后(因为设置的样式可能有多条,如果每条都会引起重绘甚至回流,那么性能会很差),再插回来(这样只会引起一次重绘或者回流)。因为对移除DOM树的元素进行操作,不会影响DOM树。
jQuery中,如果要实现以上功能,最好使用detach方法移除节点,因为此方法仅仅移除节点不会清除数据,而remove会清楚数据。(这里的数据是指jQuery本身的数据缓存系统中的数据)
下面介绍几种清空元素内部的API:node可以是元素节点或文档碎片对象
(1)while(node.firstChild) node.removeChild(node.firstChild)
(2)创建一个Range对象,设置边界(开始节点和结束节点),清空内容(边界里面的节点并且包括边界)。不支持ie8以及以下版本,
var deleteRange = document.createRange();
deleteRange.setStartBefore(node.firstChild);
deleteRange.setEndAfter(node.lastChild);
deleteRange.deleteContents();
(3)node.textContent = ""; textContent 是W3C版本的innerText(IE中的节点属性),不支持ie8以及以下版本 。
加油!
第十四课:js操作节点的插入,复制,移除的更多相关文章
- 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)
打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...
- Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持
Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺 ...
- NeHe OpenGL教程 第二十四课:扩展
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第十四课:图形字体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第四十四课:3D光晕
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作
孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...
- webgl(three.js)实现室内三维定位,3D定位,3D楼宇bim、实时定位三维可视化解决方案——第十四课(定位升级版)
序: 还是要抽出时间看书的,迷上了豆豆的作品,最近在看<天幕红尘>,书中主人公的人生价值观以及修为都是让我惊为叹止.很想成为那样的人,但是再看看自己每天干的事,与时间的支配情况,真是十分的 ...
- 第六十四天 JS基础操作
一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...
随机推荐
- linux进程间通信-XSI IPC
一 什么是XSI IPC 有三种 IPC我们称作XSI IPC,即消息队列.信号量以及共享存储器(共享内存),它们之间有很多相似之处. 二 标识符和键 每个内核中的 IPC结构(消息队 ...
- Linux ethtool命令
一.简介 ethtool 是用于查询及设置网卡参数的命令. 二.常用选项 ethtool ethx //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0.eth1等等 ethtool ...
- css中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
例如: .my_table tr:nth-child(even){ background:#E6EDF5; } .my_table tr:nth-child(odd){ background:#F0F ...
- HDU 2189 悼念512汶川大地震遇难同胞――来生一起走 --生成函数
这题跟上两题也差不多. 把150以内的素数找出来,把素数的值看做硬币的面值,每个硬币的个数即ceil(150/prime[i]),因为再多也没用,最多组成n=150就行了,所以又回到了找硬币问题.用生 ...
- php遇上iis之上传突破
环境: php+window+iis 局限: 文件上传黑名单机制,略显鸡肋 <?php //U-Mail demo ... if(isset($_POST['submit'])){ $filen ...
- 关于MySql全文索引
从 Mysql 4.0 开始就支持全文索引功能,但是 Mysql 默认的最小索引长度是 4.如果是英文默认值是比较合理的,但是中文绝大部分词都是2个字符,这就导致小于4个字的词都不能被索引,全文索引功 ...
- S2小测--索引--视图
1. 关于Sql server 视图 视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询.视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目 标.理论上它可以像普通的物理表一 ...
- 线程变量(ThreadLocal)的使用和测试
ThreadLocal可以定义线程范围的变量,也可以称之为线程局部变量.与一般的变量的区别在于,生命周期是在线程范围内的. 也就是说某个类的某个对象(为清晰描述,以下称A对象)里面有个ThreadLo ...
- LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)
题目链接 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...
- linux内核分析 第4章读书笔记
第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...