JavaScriptで要素に子があるかどうかを確認するにはどうすればよいですか?


103

簡単な質問です.getElementById ()。私がを介して取得している要素があります。子供がいるかどうかを確認するにはどうすればよいですか?

回答:


194

いくつかの方法:

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
}

これはchildrenDOM1DOM2または DOM3で定義されていなかったが、ほぼ普遍的なサポートがあるプロパティに依存しています。(IE6以降とChrome、Firefox、Operaで動作します。少なくとも、これが最初に書かれた2012年11月までさかのぼります。)古いモバイルデバイスをサポートしている場合は、必ずサポートを確認してください。

IE8以前のサポートが必要ない場合は、次のようにすることもできます。

if (element.firstElementChild) {
    // It has at least one element as a child
}

それはに依存していfirstElementChildます。のようにchildren、DOM1-3でも定義されていませんが、childrenIE9までIEに追加されていませんでした。

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;
}

ああ、childrenDOM4に追加されただけだとは知らなかった。既知のブラウザでサポートされていることを知っていたので、これはかなりDOM0 / 1だと思いました。
Florian Margaine、2012年

特定のクラスをdiv持つ要素divがあるかどうかを確認するにはどうすればxyzいいですか?
Pooja Desai

firstChildおよびhasChildNodesは、子(nodeType == 1)だけでなく任意のノードを返します。あなたはそれを修正する必要があります。;-)
Adrian Maire、

1
for (child = element.firstChild; child; child = child.nextSibling )投票したようなループ条件を見たことがない。TJに感謝
NiCkニューマン

2
@Aaron:それはのために完全に可能だelement.firstChild非するnullときelement.children.lengthです0firstChildそして、そのようなはに関連したノードの要素、テキストノード、コメント・ノートなどを含みます; children純粋に要素の子のリストです。最新のブラウザではfirstElementChild代わりに使用できます。
TJクラウダー2015

8

slashnick&bobinceが言及しているように、hasChildNodes()空白(テキストノード)に対してtrueを返します。しかし、私はこの動作を望んでおらず、これは私にとってはうまくいきました:)

element.getElementsByTagName('*').length > 0

編集:同じ機能の場合、これはより良い解決策です:

 element.children.length > 0

children[]のサブセットでchildNodes[]、要素のみを含みます。

互換性



2

次のこともできます。

if (element.innerHTML.trim() !== '') {
    // It has at least one
} 

これは、trim()メソッドを使用して、空白のみ(この場合hasChildNodesはtrueを返す)を持つ空の要素を空として扱います。

JSBinデモ


これはHTMLコメントでどのように動作しますか?
ビクターザマニアン

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



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
);
<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>

true1つの要素にスペースまたは改行以外のコンテンツが含まれるとすぐに戻ります(ループを終了します)。


-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>

コードのみのソリューションを提供しないでください。また、なぜそこにコメントアウトされたコードがあるのですか?
リーテイラー

反対票:このコードはあいまいで、コードの一部は不要であり、コメントや説明はなく、コピー/過去のように見えます。また、XML部分はここでは何もしません。
Adrian Maire、2013

2
この狂気は何ですか?
NiCkニューマン2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.