Если серьезно, то обычно подобное делают не какими-то волшебными запретами, а экранированием вывода. Заменяют неправильные смиволы при помощи html_spaecal_chars или аналогов, или вырезают "лишние" теги используя strip_tags или регулярками.
Это не баг js, а особенность того как процессоры обрабатывают числа с плавающей запятой.
Про это есть стандарт IEEE 754, а вот здесь на примерах разных языков расписано: https://0.30000000000000004.com/
Как только вам захочется написать собственную библиотеку - напишите. Для набора экспы.
Потом сразу стоит поинтересоваться - нет ли в этом нашем интернете готовых библиотек, которые делают то-же самое что ваша, только лучше, да еще и с документацией.
Примерно с этого момента можно продолжать грызть основы, но уже с использованием библиотек.
(Подсказка: они точно есть, но вы свою все равно пишите, экспа важна!)
Потому что querySelectorAll возвращает не один элемент, а список (NodeList) а у списка нет метода addEventListener.
Нужно на каждый элемент вешать отдельный eventListener