原文地址

appendChild()、insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下:

<div id="div1">
<p id="p1" style="background-color:blue">2014</p>
</div>
<hr />
<div id="div2"></div> var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
var p1 = document.getElementById("p1"); div2.appendChild(p1);

以上代码中,P本来是在div1中,hr的上面,执行了appendChild()之后,就移动到了div2中,hr下面了:

但是今天我在一个实际工作中,却忽略了这一问题。代码过程如下:

1. 用js创建一个5000 * 100的table,保存到一个临时的div中;

2. 取出这个table的前100行,加载到页面上的一个table中;

代码如下:

 1 <table id="tableContent" cellpadding="0" cellspacing="0"></table>
2
3 var tableContent = document.getElementById("tableContent");
4
5 var trNum = 5000,
6 tdNum = 100,
7 html = "",
8 tempDiv = document.createElement("div");
9
10 //创建 5000 * 100 的table,并放在临时div中
11 html += "<table>";
12 for (i = 0; i < trNum; i++) {
13 html += "<tr>";
14
15 for (j = 0; j < tdNum; j++) {
16 html += "<td>" + i + "|" + j + "</td>";
17 }
18
19 html += "</tr>";
20 }
21 html += "</table>";
22 tempDiv.innerHTML = html;
23
24 //取出前100行,加载到tableContent 上
25 var trs = tempDiv.firstChild.firstChild.childNodes,
26 trLen = trs.length;
27 tempTbody = document.createElement("tbody");
28
29 for (i = 0; i < 100 && i < trLen; i++) {
30 tempTbody.appendChild(trs[i]); //出问题的地方!
31 }
32
33 tableContent.appendChild(tempTbody);

问题的原因:

创建一个table,保存到临时的div中。然后再取出这个div,找到table的所有行tr,保存到trs中。

然后循环trs集合,取出前100个,添加到临时的tbody上,问题就出现在这里。

for (i = 0; i < 100 && i < trLen; i++) {
tempTbody.appendChild(trs[i]);
}

当我每执行一次tempTbody.appendChild(trs[i])的时候,其实都是从trs中移除一个元素,trs的长度会越来越小,因此得不到我想要的结果。

要解决这一问题,很简单,只需加上.cloneNode(true)即可。

for (i = 0; i < 100 && i < trLen; i++) {
tempTbody.appendChild(trs[i].cloneNode(true));
}

这种鸡毛蒜皮的问题,有时候还是需要多注意,多积累。且行且珍惜,且写且注意啊!

(转)appendChild()、insertBefore()是移动element节点!的更多相关文章

  1. js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!

    appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"> & ...

  2. js:插入节点appendChild insertBefore使用方法

    首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...

  3. [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用

    本文主要讲解DOM常用的CURD操作,appendChild(往后追加节点),insertBefore(往前追加节点),removeChild(移除节点),replaceChild(替换节点),clo ...

  4. DOM Element节点类型详解

    上文中我们讲解了 DOM 中最重要的节点类型之一的 Document 节点类型,本文我们继续深入,谈谈另一个重要的节点类型 Element . 1.概况 Element 类型用于表现 HTML 或 X ...

  5. (88)Wangdao.com第二十一天_JavaScript 元素节点Element 节点

    Element 节点 (元素节点) 是一组对象 对应网页的 HTML 元素 每一个 HTML 元素,在 DOM 树上都会转化成一个 Element 节点对象(以下简称元素节点) 所有元素节点的 nod ...

  6. Element节点

    Element节点对象对应网页的 HTML 元素.每一个 HTML 元素,在 DOM 树上都会转化成一个Element节点对象(以下简称元素节点).元素节点的nodeType属性都是1.Element ...

  7. 【笔记】js parentsNode,lastChild,appendChild,insertBefore,nextSibling的意义及运用

    这几天看书看到这几个属性做几个笔记 parentNode:顾名思义,就是获取某元素的父元素等同于jq的parent(). *注意一下,在调用parentNode 方法的时候 调用的对象必须是用ID 或 ...

  8. Element节点输出到System.out

    protected void writeElementToFile(Element valrespEle) { try { TransformerFactory transformerFactory ...

  9. 在Element节点上进行Xpath

    XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xpath = xPathFactory.newXPath(); try { ...

随机推荐

  1. DW安装步骤

    Adobe Dreamweaver CC 2015破解步骤 Adobe Dreamweaver CC 2015的安装包和破解补丁可以在这里下载.链接: http://pan.baidu.com/s/1 ...

  2. Linux教程:SSH免密码登录的方法

    公司里有N台服务器需要经常登录,每次ssh的时候都要输入密码实在太不爽了,今天有空一口气全部改为公钥/私钥认证,登录再也不用任何密码了. 实现步骤: 1.在你的自己的机器下面使用ssh-keygen命 ...

  3. 今天遇到了批量删除 redis 某个前缀的所有 key,发现只能是这么解决。

    redis-cli KEYS "php*" | xargs redis-cli DEL 利用 linux的 管道输出命令 xargs 根据返回结果逐条 删除.   上面这条命令 可 ...

  4. android学习之RadioButton和CheckBox

    移通152 余继彪 RadioBuuton是一个单选按钮,CheckBox是一个复选按钮 . RadioButton的使用 ,首先要将RadioButton放在RadioGroup中,RadioGro ...

  5. Dom学习笔记

    今天老师出了一道面试题目:取到表单里面的textbox的值,两种方法.知道一种,老师说的什么dom,我竟然不知道. 以前学html的时候,老师也重来没有提到dom的概念.javaScript只是学了一 ...

  6. Angular JS的依赖注入

    依赖注入是一个在组件中给出的替代了硬的组件内的编码它们的依赖关系的软件设计模式.这减轻一个组成部分,从定位的依赖,依赖配置.这有助于使组件可重用,维护和测试. AngularJS提供了一个至高无上的依 ...

  7. iOS 7.1耗电严重解决办法

    自从iOS 7.1正式版发布以来,三天后的升级率就已经达到17.9%,预计一周后升级率能突破40%.但是也有不少用户在苹果官方支持论坛上抱怨iOS 7.1系统耗电严重. 名为PJS2006的iPhon ...

  8. mySql的学习心得

    不知不觉又到晚上了,总感觉每天的时间有些不过用,总感觉每天都有学不完的东西.但是,让我欣慰的是,还是颇有收获的.今天学习了另一个数据库mysql5的相关知识,下面是有关学习内容(php文件): < ...

  9. eclipse创建maven管理Spark的scala

    说明,由于spark是用scala写的.因此,不管是在看源码还是在写spark有关的代码的时候,都最好是用scala.那么作为一个程序员首先是必须要把手中的宝剑给磨砺了.那就是创建好编写scala的代 ...

  10. matlab初学之strcat、num2str

    文章出处: http://blog.sina.com.cn/s/blog_6fb8aa0d01019id5.html http://wenda.so.com/q/1439143662729624 ht ...