Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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 将div中的所有表追加到主体上_Javascript - Fatal编程技术网

Javascript 将div中的所有表追加到主体上

Javascript 将div中的所有表追加到主体上,javascript,Javascript,我有一个沙发,里面有三张桌子 var x = tempDiv.getElementsByClassName("hiscore_table"); 我肯定知道这一点,因为当我记录它时,它打印如下: 我创建了一个新的div来附加表 var newDiv = document.createElement('div'); for (let i = 0; i < x.length; i++) { newDiv.appendChild(x[i]); } 然后我将其附加到主体中,但只显示了两

我有一个沙发,里面有三张桌子

var x = tempDiv.getElementsByClassName("hiscore_table");
我肯定知道这一点,因为当我记录它时,它打印如下:

我创建了一个新的div来附加表

var newDiv = document.createElement('div');

for (let i = 0; i < x.length; i++) {
    newDiv.appendChild(x[i]);
}
然后我将其附加到主体中,但只显示了两个表。我调试了for循环,它只运行了2次循环。如果我打印x.length,我得到3。我不太擅长调试,但当我附加child时,它似乎是在从旧div中删除它,也许这就是原因。

您正在创建一个新的,并将DOM中当前存在的元素附加到它。这意味着您要从DOM中删除这些元素,以便将它们附加到不在DOM中的

接下来,关于document.getElementsByClassName的返回值,您需要知道的是它们是一个活动列表。这意味着对DOM的任何更改都会立即反映在集合中

所以,我是0,你附加第一个元素,你的集合现在只包含两个元素

接下来,i是1,您将附加剩余集合的第二个元素,这是整个集合的第三个元素。集合中只剩下一个元素

接下来,i是2,对于现在的单元素集合来说,这超出了范围

这类似于

有几种方法可以解决这个问题,比如按相反顺序迭代。但我更喜欢功能性方法:

Array.from(x).forEach((table) => newDiv.appendChild(table));

这会立即将HTMLCollection转换为一个数组,因此它不再是一个实时列表。

为了完整起见,如果您想支持旧浏览器而不需要pollyfill或类似工具,即编写健壮、易于维护的代码,您可以使用while循环:

而x[0]{ newDiv.appendChildx[0];
}那太好了。我需要调查一下实时列表的区别。谢谢:在较新的实现中,NodeList也有很多,支持Array.from的所有或多个主机可能都支持它。