js便签笔记(3)——切记: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中;
代码如下:
<table id="tableContent" cellpadding="0" cellspacing="0"></table>
var tableContent = document.getElementById("tableContent");
var trNum = 5000,
tdNum = 100,
html = "",
tempDiv = document.createElement("div");
//创建 5000 * 100 的table,并放在临时div中
html += "<table>";
for (i = 0; i < trNum; i++) {
html += "<tr>";
for (j = 0; j < tdNum; j++) {
html += "<td>" + i + "|" + j + "</td>";
}
html += "</tr>";
}
html += "</table>";
tempDiv.innerHTML = html;
//取出前100行,加载到tableContent 上
var trs = tempDiv.firstChild.firstChild.childNodes,
trLen = trs.length;
tempTbody = document.createElement("tbody");
for (i = 0; i < 100 && i < trLen; i++) {
tempTbody.appendChild(trs[i]); //出问题的地方!
}
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));
}
这种鸡毛蒜皮的问题,有时候还是需要多注意,多积累。且行且珍惜,且写且注意啊!
js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!的更多相关文章
- js便签笔记(12)——浏览TOM大叔博客的学习笔记 part2
1. 前言 昨天写了<js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1>,简单记录了几个问题.part1的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭 ...
- js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- js便签笔记(13)——jsonp其实很简单【ajax跨域请求】
前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ...
- js便签笔记(13)——jsonp事实上非常easy【ajax跨域请求】
前两天被问到ajax跨域怎样解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了很多资料,原来如此.. . 为何一直知道jsonp,但一直迷迷糊糊的不明 ...
- js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1
1. 前言 这两天看了一下TOM大叔的<深入理解js系列>中的基础部分,根据自己的实际情况,做了读书笔记,记录了部分容易绊脚的问题.写篇文章,供大家分享. 2. 关于HTMLCollect ...
- js便签笔记(10) - 分享:json2.js源码解读笔记
1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...
- js便签笔记(10) - 分享:json.js源码解读笔记
1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...
- js便签笔记(9)——解读jquery源码时记录的一些知识点
近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...
- js便签笔记(1)——说说HTMLCollection、NodeList以及NamedNodeMap
介绍 在js的dom操作中,除了常用的document.html**Element之外,还有三个集合对象,即HTMLCollection.NodeList以及NamedNodeMap.试看以下操作: ...
随机推荐
- 关于sifari兼容性的一个问题
输入框 一个很基础的控件 结果出现了兼容性问题 在chrome ie android上页面正常 结果在Safari和IOS系统里面输入框无法输入, 点击后边框有高亮效果但是无法输入文本,问题代码如下: ...
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
背景: 最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言: ...
- 后勤数据源增量队列Delta Queue(RSA7)中的增量更新区Delta Update、增量重复区Delta Repetition
声明:原创作品,转载时请注明文章来自SAP师太技术博客:( 博/客/园www.cnblogs.com)www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 从webRoot中下载Excel
@RequestMapping("downLoad") public void downLoad(Offsupervise off1,HttpServletRequest requ ...
- Jqplot 使用总结之一(线条及节点颜色)
好不容易抽出时间将Jqplot做下最后的总结,下面通过四个例子来学习Jqplot的一些常见技巧:示例1. 设置线条颜色(包括背景色及线条颜色的批量赋值) <!DOCTYPE html> & ...
- ASP.NET MVC Html.Partial/Html.RenderPartial/Html.Action/Html.RenderAction区别
1. @Html.Raw() 方法输出带有html标签的字符串: <div style="margin:10px 0px 0px;border:1px;border-color:red ...
- OneProxy的功能与限制
数据库中间件的核心目的之一就是尽可能透明的线性扩展数据库能力.其主要功能介绍参考(http://www.onexsoft.com/zh/oneproxy.html). 但是透明只是相对的,下面就简要 ...
- Python’s SQLAlchemy vs Other ORMs[转发 5] PonyORM
PonyORM PonyORM allows you to query the database using Python generators. These generators are trans ...
- 探索C++的秘密之详解extern "C",这就是为什么很多.lib被我们正确调用确总是无法解析的。
(转载,绝对的有用) lib被我们正确调用确总是无法解析.这是C++编译和C编译的区别 时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C&qu ...
- uva 1660 & poj 1966(点连通度)
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4267 Accepted: 2003 ...