Почему нельзя писать DOM без HTML

Ответ

DOM (Document Object Model) — это программное представление HTML-документа, его структуры и содержимого. Без HTML DOM не существует, так как он строится на основе HTML-разметки.

Пример:

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
    <script>
      // DOM доступен только после загрузки HTML
      const root = document.getElementById('root');
      root.textContent = 'Hello, DOM!';
    </script>
  </body>
</html>

Если HTML отсутствует, браузеру нечего парсить и преобразовывать в DOM. DOM API (например, document.createElement) работает с уже существующим документом или создаёт элементы внутри него.

Ответ 18+ 🔞

Давай разберёмся, что за зверь такой этот DOM, а то некоторые думают, что он из воздуха берётся, как фокусник из цирка.

Смотри, DOM — это типа живая, дышащая копия твоего HTML, которую браузер выстраивает у себя в башке. Без самого HTML-документа — нихуя не будет. Ну вот вообще. Это как пытаться сделать борщ без воды и свёклы — получится пиздец, а не еда.

Вот смотри на этот кусок кода, он всё объясняет:

<!DOCTYPE html>
<html>
  <body>
    <div id="root"></div>
    <script>
      // DOM доступен только после загрузки HTML
      const root = document.getElementById('root');
      root.textContent = 'Hello, DOM!';
    </script>
  </body>
</html>

Видишь? Сначала вёрстка — <div id="root">. Потом скрипт приползает и орёт: «Эй, document, дай-ка мне этот root!». И document, такой весь важный, отвечает: «На, мудак, держи, только не сломай». И только потому, что этот div уже есть в HTML, всё работает.

А если HTML пустой? Ну, типа, чистый лист? Тогда твой document.getElementById('root') вернёт тебе null, и ты останешься с носом, как лох на базаре. Все эти createElement, appendChild — они же не в вакууме работают! Им нужен этот самый document, который рождается только когда браузер проглотит и переварит HTML.

Короче, запомни раз и навсегда: HTML — это скелет, а DOM — это тот же скелет, но уже обросший сухожилиями, мышцами и волшебными кнопками, которые можно тыкать из JavaScript. Без первого — второе просто не существует, ёпта. Всё гениальное просто, как три копейки.