Я пытаюсь выбрать элемент по его отношению с остальной частью этого DOM:
<div id="dad">
<p>son</p>
<p>son</p>
</div>
Как видно здесь:
let daddy = document.getElementById('dad');
daddy.firstChild.textContent = "Im first";
Что делает JS, вместо того, чтобы изменять свой внутренний HTML, вставляя строку в качестве первого элемента "dad" <div>
.
Это имеет смысл, но как я могу использовать это свойство для выбора этого первого ребенка и замены его содержимого? Вместо того, чтобы вставлять содержимое в качестве элемента первого дочернего элемента.
Первый дочерний #dad
является текстовым узлом, потому что между <div id="dad">
и <p>
есть пробелы. Если вы удалите эти пробелы, он отлично работает:
let daddy = document.getElementById('dad');
daddy.firstChild.textContent = "Im first";
<div id="dad"><p>son</p><p>son</p></div>
Или вы можете использовать свойство firstElementChild
:
let daddy = document.getElementById('dad');
daddy.firstElementChild.textContent = "Im first";
<div id="dad">
<p>son</p>
<p>son</p>
</div>
Метод children() возвращает все прямые дочерние элементы выбранного элемента.
Этот метод перемещается только на один уровень вниз по дереву DOM.
$("#dad").children(":first").text("Im first");
Кроме того, прокрутите дочерние узлы до тех пор, пока вы не найдете первый:
let daddy = document.getElementById('dad');
var child = daddy.firstChild;
while(child && child.nodeType !== 1) child = child.nextSibling;
child.textContent = "Im first";
<div id="dad">
<p>son</p>
<p>son</p>
</div>
Ожидается то, что вы видите. Это из-за текстовых узлов, которые немного менее очевидны, чем другие элементы. Глядя на ваш html:
<div id="dad">
<p>son</p>
<p>son</p>
</div>
У вас есть #dad
div, внутри которого есть 3 текстовых узла и 2 заметки элемента. Можете ли вы заметить текстовые узлы сейчас? (подсказка, новые строки и вкладки - текст). По этой причине многие браузеры теперь реализуют firstElementChild
.
Вы также можете проверить, чтобы nodeType === 1
перед его модификацией. Здесь вы можете прочитать о разных типах узлов. Вы также можете удалить все пробелы, но это затрудняет чтение кода:
<div id="dad"><p>son</p><p>son</p></div>