(转)appendChild()、insertBefore()是移动element节点!

原文地址

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));
}

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

时间: 2024-10-08 14:11:13

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

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

首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在已有的子节点前插入一个新的子节点.语法 :insertBefore(newchild,refchild) 相同之处:插入子节点 不同之处:实现原理方法不同.  appendChild 方法是在父级节点中的子节点的末尾添加新的节点(相对于父级节点来说).  insertBefore  方法是在已有的节

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

本文主要讲解DOM常用的CURD操作,appendChild(往后追加节点),insertBefore(往前追加节点),removeChild(移除节点),replaceChild(替换节点),cloneNode(克隆节点)的语法与实战应用 一.appendChild: 向元素的内部最后面增加一个节点,或者移动一个现有的节点到元素的内部最后面 用法: someNode.appendChild( newNode ) someNode通常为元素的父节点 返回值: 返回新增加的节点  1     <i

DOM Element节点类型详解

1.概况 Element 类型用于表现 HTML 或 XML 元素,提供了对元素标签名.子节点及特性的访问. Element 节点具有以下特征: nodeType 的值为 1 nodeName 的值为元素的标签名 nodeValue 的值为null parentNode 可能是 Document 或者 Element 其子节点可能是 Element.Text.Comment.ProcessingInstruction.CDATASection 或者 EntityReference 要访问元素的标

Element节点

Element节点对象对应网页的 HTML 元素.每一个 HTML 元素,在 DOM 树上都会转化成一个Element节点对象(以下简称元素节点).元素节点的nodeType属性都是1.Element对象继承了Node接口,因此Node的属性和方法在Element对象都存在.并且元素节点不是一种对象,而是一组对象,这些对象除了继承Element的属性和方法,还有各自构造函数的属性和方法. 实例属性 元素特性的相关属性 Element.id 返回元素的id属性 Element.tagName 返回

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

这几天看书看到这几个属性做几个笔记 parentNode:顾名思义,就是获取某元素的父元素等同于jq的parent(). lastChild:获取最后一个子元素. appendChild:在某元素内最后面添加一个子元素. insertBefore:在某元素外的 前面添加一个元素. 此函数有两个参数insertBefore(newelem,targetelem),newelem是要插入的元素,targetelem是与newelem相对的 元素,调用此方法必须用 targetelem的父元素调用 即

Element节点输出到System.out

1 protected void writeElementToFile(Element valrespEle) { 2 3 try { 4 TransformerFactory transformerFactory = TransformerFactory.newInstance(); 5 Transformer transformer = transformerFactory.newTransformer(); 6 transformer.transform(new DOMSource(val

在Element节点上进行Xpath

1 XPathFactory xPathFactory = XPathFactory.newInstance(); 2 XPath xpath = xPathFactory.newXPath(); 3 4 try { 5 String rdfID = xpath.evaluate("/validateResponse/id", respValtElement); 6 String rdfResult = xpath.evaluate("/validateResponse/co

jQuery时代已去,JavaScript仍是王道

当初jQuery的诞生有两个目的,第一简化DOM操作,第二减少开发过程中跨浏览器的问题.jQuery是伟大的,但是在当下技术发展的今天,我们不需要再兼容IE6和IE7的情况下,很多兼容性问题浏览器已经自行解决了,所以说,将jQuery从你的网站中删除是正确的做法.而且js现在已经更加简洁,对于很多DOM操作,用原生js来写也会非常简洁. jQuery速览 1.文档载入后执行: $(document).ready(function(){}) $(function(){}) 2.jQuery事件绑定

DOM相关

归纳一下, 不管是DOM Core还是HTML-DOM,我们在使用JavaScript的时候要注意浏览器之间的兼容性,因为不同的浏览器对这两类方法和属性的支持可能不一样,一般推荐使用DOM Core方法和属性,尽管稍显繁杂. 常见的Core DOM方法如下: 1.创建节点 createElement() createTextNode() 2.复制节点 cloneNode() 3.插入节点 appendChild() insertBefore() 4.删除节点 removeChild() 5.替换