จะตรวจสอบได้อย่างไรว่า element มีลูกใน Javascript หรือไม่?


104

.getElementById ()คำถามง่ายๆฉันมีองค์ประกอบที่ฉันโลภผ่าน จะตรวจสอบได้อย่างไรว่ามีลูกหรือไม่?

คำตอบ:


196

สองวิธี:

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

โอ้ฉันไม่รู้ว่าchildrenถูกเพิ่มใน DOM4 เท่านั้น เมื่อทราบว่าได้รับการสนับสนุนในเบราว์เซอร์ที่รู้จักฉันคิดว่านี่เป็น DOM0 / 1 ค่อนข้างมาก
Florian Margaine

ฉันจะตรวจสอบถ้าdivมีองค์ประกอบที่divมีระดับการพูดเฉพาะxyz?
Pooja Desai

firstChild และ hasChildNodes ส่งคืนโหนดใด ๆ ไม่ใช่เฉพาะชายด์ (nodeType == 1) คุณควรแก้ไขสิ่งนั้น ;-)
Adrian Maire

1
ไม่เคยเห็นเงื่อนไขการวนซ้ำเช่นfor (child = element.firstChild; child; child = child.nextSibling )โหวต ขอบคุณ TJ
NiCk Newman

2
@Aaron: เป็นไปได้ทั้งหมดelement.firstChildที่จะไม่ใช่nullเมื่อelement.children.lengthเป็น0: firstChildและเกี่ยวข้องกับโหนดรวมถึงองค์ประกอบโหนดข้อความบันทึกความคิดเห็น ฯลฯ ; childrenเป็นรายการขององค์ประกอบย่อยเท่านั้น ในเบราว์เซอร์สมัยใหม่คุณสามารถใช้firstElementChildแทนได้
TJ Crowder

8

ตามที่กล่าวถึง slashnick & bobince hasChildNodes()จะคืนค่าจริงสำหรับช่องว่าง (โหนดข้อความ) อย่างไรก็ตามฉันไม่ต้องการพฤติกรรมนี้และสิ่งนี้ได้ผลสำหรับฉัน :)

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

แก้ไข : สำหรับฟังก์ชันเดียวกันนี่เป็นทางออกที่ดีกว่า:

 element.children.length > 0

children[]เป็นส่วนย่อยchildNodes[]ที่มีองค์ประกอบเท่านั้น

ความเข้ากันได้


2

คุณสามารถตรวจสอบว่าองค์ประกอบมีโหนดลูกelement.hasChildNodes()หรือไม่ ระวังใน Mozilla สิ่งนี้จะส่งคืนจริงหากช่องว่างหลังแท็กดังนั้นคุณจะต้องตรวจสอบประเภทแท็ก

https://developer.mozilla.org/En/DOM/Node.hasChildNodes


7
ไม่ใช่แค่ใน Mozilla นี่คือพฤติกรรมที่ถูกต้อง เป็น IE ที่เข้าใจผิด
Bobince

2

คุณสามารถทำสิ่งต่อไปนี้ได้:

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

สิ่งนี้ใช้เมธอด trim () เพื่อจัดการกับองค์ประกอบว่างที่มีเฉพาะช่องว่าง (ซึ่งในกรณีนี้hasChildNodesจะส่งกลับค่าจริง) ว่าว่างเปล่า

การสาธิต JSBin


สิ่งนี้ทำงานอย่างไรกับความคิดเห็น HTML
Victor Zamanian

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>

ส่งคืนtrue(และออกจากลูป) ทันทีที่องค์ประกอบหนึ่งมีเนื้อหาประเภทใดก็ได้ข้างช่องว่างหรือขึ้นบรรทัดใหม่


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

โปรดอย่าเพียงแค่ให้โซลูชันรหัสเท่านั้น นอกจากนี้ทำไมคุณมีรหัสแสดงความคิดเห็นอยู่ในนั้น
Lee Taylor

โหวตลง: รหัสนี้คลุมเครือส่วนหนึ่งของรหัสไม่ชัดเจนไม่มีความคิดเห็นหรือคำอธิบายและดูเหมือนสำเนา / อดีต นอกจากนี้ส่วน XML ยังไม่มีอะไรให้ทำที่นี่
Adrian Maire

2
นี่มันเป็นบ้าอะไรกัน?
NiCk Newman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.