Добрый день. Ошибка возникает, т.к. script отрабатывает до выведения разметки. При этом сам он написан правильно. В этом примере script нужно расположить после разметочных элементов. А по уму вынести JS-логику в отдельный файл и прописать у script свойство defer, которое будет вызывать логику в нем только после вывода разметки.