HTML
<div id="divID">
<label></label>
<textarea></textarea>
</div>
JavaScript
function invisible(){
let div = document.getElementById("divID");
let children = div.childNodes;
for (let i = 0; i < children.length; i++) {
children[i].style.display = "none";
}
}
调用该函数后,不会发生任何事情。我做错了什么?
您必须将divID
设置为div
标记。
<div id="divID">
<label></label>
<textarea></textarea>
</div>
然后必须在invisible
函数中使用div.children
。
function invisible(){
let div = document.getElementById("divID");
let children = div.children;
for (let i = 0; i < children.length; i++) {
children[i].style.display = "none";
}
}
<input type="button" onClick=" invisible()" value="Remove" />
<div id="divID">
<label></label>
<textarea></textarea>
</div>
您可以通过接受其子元素作为第一个参数来提高函数的可重用性。它目前只适用于id为"divID"
的元素。
function invisible(parent){
for(const child of parent.children) child.style.display = 'none';
}
invisible(document.querySelector('div'))
<div>
<label>Label</label>
<textarea>Textarea</textarea>
</div>
问题似乎是您使用了childNodes
,而不是其他答案所指出的children
。
除了其他答案之外,这个答案试图提供更多关于正在发生的事情的背景。
let div = document.getElementById("divID");
console.log(div.childNodes)
// Returns something like
NodeList(5) [text, label, text, textarea, text]
console.log(div.children)
// Returns something like
HTMLCollection(2) [label, textarea]
所以childNodes
返回NodeList
,children
返回HTMLCollection
。
mdn上的children
定义解释了children
和childNodes
之间的区别:
Element.children只包括元素节点。要获取所有子节点,包括文本和注释节点等非元素节点,请使用Node.childNodes.
问题是这些text
节点没有style
属性。因此它返回undefined
。尝试访问style
上的display
属性会导致TypeError
。由于第一个元素是text
元素,所以循环立即失败,并且label
和textarea
从不被隐藏。
使用children
而不是childNodes
:
function invisible(){
let div = document.getElementById("divID");
let children = div.children; //<== children instead of childNodes
for (let i = 0; i < children.length; i++) {
children[i].style.display = "none";
}
}
//just to test after 1.5 sec all children of divID will be removed(display=none)
setTimeout(invisible, 1500)
<div id='divID'>
<label>test1</label>
<textarea>test2</textarea>
</div>