简单的问题,我有一个我通过.getElementById ()
抓取的元素。我如何检查它是否有孩子?
答案 0 :(得分:165)
有两种方式:
if (element.firstChild) {
// It has at least one
}
或hasChildNodes()
函数:
if (element.hasChildNodes()) {
// It has at least one
}
或length
的{{1}}属性:
childNodes
如果你只想了解所有现代浏览器(和IE8 - 实际上甚至是IE6)中的子元素(而不是文本节点,属性节点等),你可以这样做:(谢谢Florian!)
if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
// It has at least one
}
这取决于children
属性,该属性未在DOM1,DOM2,或 DOM3中定义,但附近有 - 普遍的支持。 (早在2012年11月,最初编写时,它适用于IE6及以上版本以及至少的Chrome,Firefox和Opera)。如果支持旧版移动设备,请务必检查是否支持。
如果您不需要IE8及更早版本的支持,您也可以这样做:
if (element.children.length > 0) { // Or just `if (element.children.length)`
// It has at least one element as a child
}
这取决于firstElementChild
。与if (element.firstElementChild) {
// It has at least one element as a child
}
一样,它也没有在DOM1-3中定义,但与children
不同,它直到IE9才被添加到IE中。
如果你想坚持使用DOM1中定义的东西(也许你必须支持非常模糊的浏览器),你必须做更多的工作:
children
所有这些都是DOM1的一部分,几乎得到普遍支持。
将它包装在一个函数中很容易,例如:
var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
hasChildElements = true;
break;
}
}
答案 1 :(得分:5)
as slashnick& bobince提到,hasChildNodes()
将为空格(文本节点)返回true。但是,我不想要这种行为,这对我有用:)
element.getElementsByTagName('*').length > 0
修改:对于相同的功能,这是一个更好的解决方案:
element.children.length > 0
children[]
是childNodes[]
的子集,仅包含元素。
答案 2 :(得分:2)
您可以检查元素是否具有子节点element.hasChildNodes()
。请注意,在Mozilla中,如果标记后面有空格,则返回true,因此您需要验证标记类型。
答案 3 :(得分:2)
您还可以执行以下操作:
if (element.innerHTML.trim() !== '') {
// It has at least one
}
这使用trim()方法将只有空格的空元素(在这种情况下hasChildNodes
返回true)视为空。
答案 4 :(得分:1)
迟到但文档片段可能是一个节点:
function hasChild(el){
var child = el && el.firstChild;
while (child) {
if (child.nodeType === 1 || child.nodeType === 11) {
return true;
}
child = child.nextSibling;
}
return false;
}
// or
function hasChild(el){
for (var i = 0; el && el.childNodes[i]; i++) {
if (el.childNodes[i].nodeType === 1 || el.childNodes[i].nodeType === 11) {
return true;
}
}
return false;
}
请参阅:
https://github.com/k-gun/so/blob/master/so.dom.js#L42
https://github.com/k-gun/so/blob/master/so.dom.js#L741
答案 5 :(得分:0)
可重复使用的isEmpty( <selector> )
功能。
您也可以将它运行到元素集合(参见示例)
const isEmpty = sel =>
![... document.querySelectorAll(sel)].some(el => el.innerHTML.trim() !== "");
console.log(
isEmpty("#one"), // false
isEmpty("#two"), // true
isEmpty(".foo"), // false
isEmpty(".bar") // true
);
&#13;
<div id="one">
foo
</div>
<div id="two">
</div>
<div class="foo"></div>
<div class="foo"><p>foo</p></div>
<div class="foo"></div>
<div class="bar"></div>
<div class="bar"></div>
<div class="bar"></div>
&#13;
只要一个元素在空格或换行符旁边有任何类型的内容,
就会返回true
(并退出循环)。
答案 6 :(得分:0)
if ( element.childElementCount !== 0 ){
alert('i have children');
} else {
alert('no kids here');
}
答案 7 :(得分:-9)
<script type="text/javascript">
function uwtPBSTree_NodeChecked(treeId, nodeId, bChecked)
{
//debugger;
var selectedNode = igtree_getNodeById(nodeId);
var ParentNodes = selectedNode.getChildNodes();
var length = ParentNodes.length;
if (bChecked)
{
/* if (length != 0) {
for (i = 0; i < length; i++) {
ParentNodes[i].setChecked(true);
}
}*/
}
else
{
if (length != 0)
{
for (i = 0; i < length; i++)
{
ParentNodes[i].setChecked(false);
}
}
}
}
</script>
<ignav:UltraWebTree ID="uwtPBSTree" runat="server"..........>
<ClientSideEvents NodeChecked="uwtPBSTree_NodeChecked"></ClientSideEvents>
</ignav:UltraWebTree>