А почему в PHP и Js нет статической типизации?
На самом деле фундаментальные корни одни и те же. Web-разработчики привыкли к постоянному бардаку и хаосу в своих продуктах. Никогда нельзя сказать, сколько завтра будет таких элементов на странице, даже если сегодня он один. Вот есть у вас #popup. Завтра заказчик просит добавить всплывающую форму и вы быстренько вставляете еще один #popup... Это заканчивается неявными проблемами.
Если бы браузер увидев дублирование id "падал" бы отказываясь отображать страницу и выбрасывал бы исключение, таких бы проблем не возникало. Но разрабы браузеров стараются отобразить страницу любой ценой - игнорировать дубли id, закрывать не закрытые теги и т.п.
Это делает подобные ошибки неуловимыми и разработчики вынуждены писать код который бы свел к минимуму саму возможность их появления.
Весь веб это пример индустрии говнокода, и отнюдь не потому, что нет хороших разрабов. Их вполне достаточно. Но сама идеология веба такова, что заставляет создавать говнорешения.
Нет стандартов, а те что есть не соблюдаются. Код решений находится в состоянии перманентной разработки и рефакторинга прямо в продакшене. Разработчики в проектах часто меняют друг-друга. И при все при этом требования к функционированию и отказаоустойчивости очень жесткие - ошибка приводит к проблемам сразу на многих машинах многих пользователей.
Результат этого ровно то, что мы имеем.