节点插入

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操作节点的插入,复制,移除的更多相关文章

  1. 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)

    打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...

  2. Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗、嗅探、dns欺骗、session劫持

    Kali Linux Web 渗透测试视频教程—第十四课-arp欺骗.嗅探.dns欺骗.session劫持 文/玄魂 目录 Kali Linux Web 渗透测试—第十四课-arp欺骗.嗅探.dns欺 ...

  3. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第十四课:图形字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作

     孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...

  8. webgl(three.js)实现室内三维定位,3D定位,3D楼宇bim、实时定位三维可视化解决方案——第十四课(定位升级版)

    序: 还是要抽出时间看书的,迷上了豆豆的作品,最近在看<天幕红尘>,书中主人公的人生价值观以及修为都是让我惊为叹止.很想成为那样的人,但是再看看自己每天干的事,与时间的支配情况,真是十分的 ...

  9. 第六十四天 JS基础操作

    一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...

随机推荐

  1. linux 截图利器-scrot

    一.前言 linux下截图工具有很多,scrot无疑是众多工具中的一个亮点,下面记录下其安装配置过程 二.使用环境 操作系统: centos 6.2 三.依赖 scrot依赖 giblib, gibl ...

  2. redis 非集群的主从配置及切换

    单纯的master-slave不能称之为集群,只能叫做读写分离.此案例只针对master为单点服务,且程序端写死master为可写,slave为只读.若master宕机则不可用,若主从未开启持久化,不 ...

  3. mysql启动不成功显示The server quit without updating PID file的解决方法

    上午在编译安装mysql的时候 就出现标题中的错误,经实践在第二步操作后启动成功,参考链接 链接http://linuxadministrator.pro/blog/?p=225 You may fa ...

  4. HDU 1171 Big Event in HDU --暴力+生成函数

    题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方 ...

  5. sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整

    第十六章: 利用索引改善性能 1. create index 单字段索引:  create index index_name on table_name (column_name);唯一索引:     ...

  6. sizeof 和 strlen 的区别

    sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度.那么他么到底有什么区别 1.sizeof    不是函数,而是一个操作符.字节数的计算在程序编译时进行,而不是在 ...

  7. java 12 - 5 带有缓冲区的字符流

    字符流为了高效读写,也提供了对应的字符缓冲流. 字符缓冲流:A. BufferedWriter:字符缓冲输出流 B. BufferedReader:字符缓冲输入流 A.BufferedWriter:字 ...

  8. Sql注入截取字符串常用函数

    在sql注入中,往往会用到截取字符串的问题,例如不回显的情况下进行的注入,也成为盲注,这种情况下往往需要一个一个字符的去猜解,过程中需要用到截取字符串.本文中主要列举三个函数和该函数注入过程中的一些用 ...

  9. 域策略禁用usb

    文档及模板可在 http://pan.baidu.com/s/1qYTcjTy  下载 pro_usb_users.adm  此模板可禁用到 指定盘符,针对用户策略 pro_usb_computers ...

  10. [转]redis 五种数据类型的使用场景

    FROM : http://blog.csdn.net/gaogaoshan/article/details/41039581#t5 String 1.String 常用命令: 除了get.set.i ...