Элемент HTML добавляется в цикл Javascript for, а затем удаляется при увеличении счетчика

Я работаю над решением для упражнения «зацикливание треугольника» в конце Eloquent JavaScript ch2. Книга просит записывать вывод на консоль, но я хочу вместо этого распечатать вывод на веб-страницу в div с id = "треугольник".

Этот код печатает нужное количество хешей. Проблема в том, что тег
, который создается внутри цикла for, таинственным образом удаляется, когда цикл увеличивается в конечном выражении. То есть: если я прохожу по коду, hashPrint.appendChild (каретка) отлично выполняется в точке останова, но как только отладчик переходит на i ++, дочерний элемент
удаляется с веб-страницы.

var hash = "";
var hashPrint = document.getElementById("triangle");
var carriage = document.createElement("br");

for (var i = 0; i < 7; i++) {
    hash += "#";
    var content = document.createTextNode(hash);
    hashPrint.appendChild(content); 
    hashPrint.appendChild(carriage);
}

Если я помещаю объявление каретки var в цикл for, он работает нормально. Я знаю, что передовая практика JS поощряет избегать глобальной области видимости, в последнее время я много занимаюсь программированием на Java, и мне показалось, что наличие createElement («br») в global может быть удобно, если я хочу использовать его в другом цикле. на странице.

Несмотря на то, что у меня уже есть решение этой проблемы, я хотел бы знать, почему последнее выражение в цикле for вызовет удаление дочернего узла. В принципе, почему это не работает? Я безуспешно искал объяснение везде и всюду.

appendChild удаляет элемент из DOM перед добавлением его в новую позицию.
Jonas Wilms 07.05.2018 21:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
73
2

Ответы 2

потому что вы добавляете один и тот же элемент, чтобы он заменял себя каждый раз, когда вы его используете. Вам нужно создавать новый каждый раз, когда вы его используете.

for (var i = 0; i < 7; i++) {
  hash += "#";
  var content = document.createTextNode(hash);
  hashPrint.appendChild(content);
  var carriage = document.createElement("br");
  hashPrint.appendChild(carriage);
}

Я также не уверен, можно ли добавить несколько textNodes к одному элементу

Jonathan 07.05.2018 21:40

Да, у меня работал тот же код, и мне было интересно, почему код в моем примере не работает. Я думаю, что понял. Объявляя узел вне цикла, он создается только один раз, а затем перемещается в DOM с помощью appendChild () после каждой итерации цикла. Мне все еще кажется странным, что узел удаляется при инкременте, а затем не заменяется до тех пор, пока метод не будет вызван снова.

alodrummer 10.05.2018 17:23

Попробуйте клонировать узел, иначе appendChild () съест его:

var hash = "";
var hashPrint = document.getElementById("triangle");
var carriage = document.createElement("br");

for (var i = 0; i < 7; i++) {
    hash += "#";
    var content = document.createTextNode(hash);
    hashPrint.appendChild(content); 
    hashPrint.appendChild(carriage.cloneNode(true));
}

См .: https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild

или, Почему нужно использовать cloneNode при добавлении documentFragment?

Другие вопросы по теме