我想实现一个简单的函数,获取一些元素列表(在这种情况下,我通过一些<li>
元素)并将它们以随机顺序追加到某个父节点(<ul>
)。要做到这一点,我写了这样的事情:JS DOM追加孩子不工作
console.log(tmpList);
var maxIndex = tmpList.length;
while(tmpList.length > 0) {
var curIndex = Math.floor(Math.random() * maxIndex);
if(tmpList[curIndex] && tmpList[curIndex].nodeType===1) {
var elem = tmpList.splice(curIndex, 1);
console.log(elem);
parent.appendChild(elem);
}
}
正如你可以看到我做检查,如果随机chosed指数居然还在tmpList
存在,如果它实际上是html元素。但是,当我运行此代码时,我得到:
[li, li, li, li]
[li]
NotFoundError: Failed to execute 'appendChild' on 'Node': The new child element is null.
我该怎么做?
ps。请不要给我这样的建议,如“使用jQuery”或“只是使用innerHTML连接”,因为我有些理由不能使用它们。
parent
元素定义了几行,所以情况并非如此。
while(tmpList.length > 0) {
var curIndex = Math.floor(Math.random() * tmpList.length);
var elem = tmpList.splice(curIndex, 1);
console.log(elem);
if(elem instanceof HTMLElement) {
//console.log(curIndex);
console.log(elem);
parent.appendChild(elem);
}
}
return true;
现在看起来更好一点,但仍然有效奇怪:
UPDATE
我根据一个答案,使代码看起来如下做了一些改动。现在控制台输出为:
[li, li, li, li]
[li]
[li]
[li]
[li]
所以它拥有li元素,但不把他们当作HTMLNode ...:O(相同的结果,当我用elem !== null && elem !== undefined && elem.nodeType === 1
)
你如何在if循环中加入'if(typeof elem!== null)parent.appendChild(elem);'到你的循环中? – techouse
您可以提供一个JSFiddle,它引发您在控制台中看到的相同错误吗?那么帮助会容易得多。 –
http://jsfiddle.net/UR3ZQ/ <但是我没有看到任何控制台有错误 – Moby04