Odpowiedzi:
Na kilka sposobów:
if (element.firstChild) {
// It has at least one
}
lub hasChildNodes()funkcja:
if (element.hasChildNodes()) {
// It has at least one
}
lub lengthwłasność childNodes:
if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
// It has at least one
}
Jeśli chcesz wiedzieć tylko o elementach potomnych (w przeciwieństwie do węzłów tekstowych, węzłów atrybutów itp.) We wszystkich nowoczesnych przeglądarkach (i IE8 - w rzeczywistości nawet IE6), możesz to zrobić: (dziękuję Florian !)
if (element.children.length > 0) { // Or just `if (element.children.length)`
// It has at least one element as a child
}
Który opiera się na childrennieruchomości, która nie została zdefiniowana w DOM1 , DOM2 , lub DOM3 , ale który ma niemal powszechnego poparcia. (Działa w IE6 i nowszych oraz Chrome, Firefox i Opera przynajmniej od listopada 2012 r., Kiedy to zostało pierwotnie napisane). Jeśli obsługujesz starsze urządzenia mobilne, sprawdź, czy są obsługiwane.
Jeśli nie potrzebujesz obsługi IE8 i wcześniejszych wersji, możesz również zrobić to:
if (element.firstElementChild) {
// It has at least one element as a child
}
To zależy od firstElementChild. Podobnie jak childrennie zostało zdefiniowane w DOM1-3, ale w przeciwieństwie do childrentego nie zostało dodane do IE aż do IE9.
Jeśli chcesz trzymać się czegoś zdefiniowanego w DOM1 (może musisz obsługiwać naprawdę mało znane przeglądarki), musisz wykonać więcej pracy:
var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
hasChildElements = true;
break;
}
}
Wszystko to jest częścią DOM1 i jest prawie powszechnie obsługiwane.
Byłoby łatwo zawrzeć to w funkcji, np .:
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;
}
divelementów divma coś do powiedzenia xyz?
for (child = element.firstChild; child; child = child.nextSibling )głosowanie. Dzięki TJ
element.firstChildaby nie być - nullkiedy element.children.lengthjest 0: firstChildi dotyczy to węzłów, w tym elementów, węzłów tekstowych, uwag w komentarzach itp .; childrenjest czystą listą elementów potomnych. W nowoczesnych przeglądarkach możesz firstElementChildzamiast tego użyć .
Jak wspomina slashnick & bobince, hasChildNodes()zwróci wartość true dla białych znaków (węzłów tekstowych). Jednak nie chciałem takiego zachowania i to zadziałało dla mnie :)
element.getElementsByTagName('*').length > 0
Edycja : dla tej samej funkcjonalności jest to lepsze rozwiązanie:
element.children.length > 0
children[]jest podzbiorem childNodes[]zawierającym tylko elementy.
Możesz sprawdzić, czy element ma węzły potomne element.hasChildNodes(). Uważaj w Mozilli to zwróci prawdę, jeśli po tagu znajduje się spacja, więc będziesz musiał zweryfikować typ tagu.
Możesz też wykonać następujące czynności:
if (element.innerHTML.trim() !== '') {
// It has at least one
}
Używa metody trim () do traktowania pustych elementów, które mają tylko białe spacje (w takim przypadku hasChildNodeszwraca wartość true), jako pustych.
Spóźniony, ale fragment dokumentu może być węzłem:
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;
}
Zobacz:
https://github.com/k-gun/so/blob/master/so.dom.js#L42
https://github.com/k-gun/so/blob/master/so.dom.js # L741
Wypróbuj właściwość childElementCount :
if ( element.childElementCount !== 0 ){
alert('i have children');
} else {
alert('no kids here');
}
Funkcja wielokrotnego użytku isEmpty( <selector> ).
Możesz również uruchomić go w kierunku zbioru elementów (patrz przykład)
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>
zwraca true(i wychodzi z pętli), gdy tylko jeden element ma jakąkolwiek zawartość poza spacjami lub znakami nowej linii.
<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>
childrenzostało dodane tylko w DOM4. Wiedząc, że jest obsługiwany w każdej znanej przeglądarce, pomyślałem, że to prawie DOM0 / 1.