2011-07-01 53 views
2

我已经实现了一个例程来排序基于(=或多或少从)Nicholas C. Zakas,的专业JavaScript for Web Developers,Ch。 12.它的工作原理与广告一样,但我有几个关于代码如何工作的问题,并且会对建议感激不尽。以下是相关位:旧对象在哪里?

var oldTable = document.getElementById('myTable'); 
var oldTableBody = oldTable.tBodies[0]; 
var oldTableRows = oldTableBody.rows; 
var newTableArray = new Array(); 
for (var i = 0, rowCount = oldTableRows.length; i < rowCount; i++) { 
    newTableArray.push(oldTableRows[i]); 
} 
newTableArray.sort(chooseSort); 
var newFragment = document.createDocumentFragment(); 
for (var i = 0, rowCount = newTableArray.length; i < rowCount; i++) { 
    newFragment.appendChild(newTableArray[i]); 
} 
oldTableBody.appendChild(newFragment); 

我明白,我加入的指针到现有的表行,当我推新值到newTableArray,但我不知道appendChild方法的工作原理。具体做法是:

  1. 当I(指针到原来的行)追加各阵列项到文档片段,我只是增加一个指针(离开行还在原来的表),还是我除去将原始表中的行对象附加到其他位置?

  2. 当我追加newFragmentoldTableBody,如果我理解正确的话,我其实没有追加的片段作为对象,但是,我已经追加到该行的对象,而这仅仅是片段的工作方式。那是对的吗?

  3. 当我将newFragment附加到oldTableBody时,我没有做任何明确的操作来删除最初存在的行。他们去了哪里?是否重新附加它们会自动删除它们的旧痕迹,因为它们只能连接一次?如果我正在使用指针,而不是对象本身(我认为是什么让我将它们附加到newTableArray而不自动使它们从表中消失),这是否意味着我可以在一些对象中有多个指向同一对象的指针case(oldTablenewTableArray)但不是其他人(原始表中的原始行加上我添加的新排序行)?

对于天真的问题抱歉,但尽管我想要的结果令人满意,但不理解代码的工作方式让我感到不安。

回答

1

我认为你所有的问题归结为问什么appendChild做什么。它将元素从DOM中的元素中移除,并将新元素放置在新点上。

1
  1. 你的第二个断言是正确的。您不是创建指针,而是将对象重定位到文档片段中。

  2. 您对文档片段的理解是正确的。它是一个永远不会成为DOM一部分的通用容器。而是其内容被附加。

  3. 有关项目一。将它们附加到片段后,将它们从表格中删除。将它们添加到数组时,它只是一个指向要添加的行对象的指针。向数组添加元素不会操纵DOM本身。

因此,您的代码是最终:

  • 做一次迭代到每个表行引用为Array
  • 在阵列做一次迭代到每一行重新定位到一个文档片段
  • 将片段的内容添加到原始表格中

...导致无法通知更改为DOM。

如果您希望复制行,您可能会对.cloneNode()方法感兴趣。

但是,不可以在DOM中的几个不同位置出现单个元素,以便在一个位置中元素的更新将反映在其他位置。