Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 旧物体去了哪里?_Javascript_Sorting - Fatal编程技术网

Javascript 旧物体去了哪里?

Javascript 旧物体去了哪里?,javascript,sorting,Javascript,Sorting,我已经实现了一个对xhtml表进行排序的例程,它基于(或多或少地抄袭自)Nicholas C.Zakas,《面向Web开发人员的专业JavaScript》,第12章。它的工作原理如广告所示,但我对代码的工作原理有一些疑问,如果您能提供建议,我将不胜感激。以下是相关位: var oldTable = document.getElementById('myTable'); var oldTableBody = oldTable.tBodies[0]; var oldTableRows = oldTa

我已经实现了一个对xhtml表进行排序的例程,它基于(或多或少地抄袭自)Nicholas C.Zakas,《面向Web开发人员的专业JavaScript》,第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);
var oldTable=document.getElementById('myTable');
var oldTableBody=oldTable.tBodies[0];
var oldTableRows=oldTableBody.rows;
var newTableArray=新数组();
for(var i=0,rowCount=oldTableRows.length;i
我知道当我将新值推送到
newTableArray
上时,我正在向现有表行添加指针,但我不确定
appendChild
方法是如何工作的。具体而言:

  • 当我将每个数组项(指向原始行的指针)附加到文档片段时,我只是添加了一个指针(将该行仍保留在原始表中),还是通过将其附加到其他位置来从原始表中删除该行对象

  • 当我将
    newFragment
    附加到
    oldTableBody
    时,如果我理解正确,我实际上不是将片段作为对象附加,而是将我附加到它的行对象附加,这就是片段的工作方式。对吗

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


  • 对于这些天真的问题,我深表歉意,但尽管得到了我想要的结果是令人满意的,但不理解代码是如何工作的让我感到不安。

    我想你所有的问题都归结为问孩子做了什么。它从DOM中删除元素,并将相同的元素放置在新位置

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

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

  • 与第一项有关。将它们附加到片段时,您将它们从表中删除。将它们添加到数组中时,它只是指向要添加的行对象的指针。向数组中添加元素对操作DOM本身没有任何作用

  • 因此,您的代码最终是:

    • 进行迭代以将每个表行引用到数组中
    • 在数组上进行迭代以将每一行重新定位到文档片段中
    • 将片段的内容追加到原始表中
    …导致DOM没有明显变化

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

    但是,不能让一个元素出现在DOM中的多个不同位置,从而使一个位置的元素更新反映在其他位置