Простой вопрос, у меня есть элемент, который я захватываю через .getElementById ()
. Как проверить, есть ли у него дети?
Как проверить, есть ли у элемента какие-либо дети в Javascript?
Ответ 1
Несколько способов:
if (element.firstChild) {
// It has at least one
}
или hasChildNodes()
:
if (element.hasChildNodes()) {
// It has at least one
}
или length
свойство childNodes
:
if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
// It has at least one
}
Если вы хотите знать только о дочерних элементах (в отличие от текстовых узлов, узлов атрибутов и т.д.) во всех современных браузерах (и IE8 — на самом деле, даже IE6), вы можете сделать это: (спасибо Florian!)
if (element.children.length > 0) { // Or just `if (element.children.length)`
// It has at least one element as a child
}
Это зависит от свойства children
, которое не было определено в DOM1, DOM2 или DOM3, но которая имеет почти универсальную поддержку. (Он работает в IE6 и выше, а Chrome, Firefox и Opera по крайней мере еще в ноябре 2012 года, когда это было изначально написано.) Если вы поддерживаете старые мобильные устройства, обязательно проверьте наличие поддержки.
Если вам не нужна поддержка IE8 и более ранних версий, вы также можете сделать это:
if (element.firstElementChild) {
// It has at least one element as a child
}
Это зависит от firstElementChild
. Как и children
, он также не был определен в DOM1-3, но в отличие от children
он не был добавлен в IE до IE9.
Если вы хотите придерживаться того, что определено в DOM1 (возможно, вам нужно поддерживать действительно неясные браузеры), вам нужно сделать больше работы:
var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
hasChildElements = true;
break;
}
}
Все это часть DOM1 и почти повсеместно поддерживается.
Было бы легко обернуть это в функцию, например:
function hasChildElement(elm) {
var child, rv;
if (elm.children) {
// Supports `children`
rv = elm.children.length !== 0;
} else {
// The hard way...
rv = false;
for (child = element.firstChild; !rv && child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
rv = true;
}
}
}
return rv;
}
Ответ 2
Как отмечают slashnick и bobince, hasChildNodes()
вернет true для пробелов (текстовых узлов). Однако я не хотел такого поведения, и это сработало для меня :)
element.getElementsByTagName('*').length > 0
Изменить: для той же функциональности, это лучшее решение:
element.children.length > 0
children[]
- это подмножество childNodes[]
, содержащее только элементы.
Ответ 3
Вы можете проверить, есть ли у элемента дочерние узлы element.hasChildNodes()
. Остерегайтесь в Mozilla, это вернет true, если это пробел после тега, поэтому вам нужно будет проверить тип тега.
Ответ 4
Позднее, но фрагмент документа может быть node:
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
Вы также можете сделать следующее:
if (element.innerHTML.trim() !== '') {
// It has at least one
}
Это использует метод trim() для обработки пустых элементов, которые имеют только пробелы (в этом случае hasChildNodes
возвращает true) как пустые.
JSBin Demo
Ответ 6
isEmpty(<selector> )
используется функция 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
);
<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>
Ответ 7
Попробуйте свойство childElementCount:
if ( element.childElementCount !== 0 ){
alert('i have children');
} else {
alert('no kids here');
}
Ответ 8
<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>