На самом деле, нет необходимости проверять случаи «вручную». Вы можете просто запустить следующий алгоритм:
Почему это правильно? Вот эскиз доказательства: если этот алгоритм сообщил, что последовательность исправлена, она обнаружила совпадающую пару всех скобок. Таким образом, последовательность действительно правильна по определению. Если он сообщил об ошибке:
Я показал, что:
Эти две точки подразумевают, что этот алгоритм работает для всех возможных входов.
Трудно сказать, не видя, что находится в вашем файле url/index.js
, но, вероятно, он пытается добавить узел к элементу <body>
или его потомку до того, как он существует. Он еще не будет существовать, если вы вызываете этот скрипт в разделе <head>
.
Причина, по которой <p></p>
исправляет это, заключается в том, что если браузер получает следующее:
<head>
<script>
console.log(document.body);
</script>
</head>
Он видит, что это недействительный HTML, и поэтому он интерпретируется как:
<html>
<head>
<script>
console.log(document.body);
</script>
</head>
<body></body>
</html>
- тело не существует к моменту запуска сценария, поэтому консоль записывает в журнал null
.
Если браузер получает:
<p>Paragraph</p>
<head>
<script>
console.log(document.body);
</script>
</head>
... это снова недействительный HTML, и он интерпретируется как
<html>
<head></head>
<body>
<p>Paragraph</p>
<script>
console.log(document.body);
</script>
</body>
</html>
... и элемент тела существует, когда скрипт выполняется, поэтому он регистрирует элемент body на консоли.
В итоге: Вы должны убедиться, что весь ваш HTML верен, и что ваш скрипт только пытается добавить что-то к элементу, который уже существует.