Ошибки JavaScript на сайте: поиск причин и проверка исправлений
Клиентская ошибка может оставить страницу визуально целой, но сломать форму, меню, корзину, фильтр или отправку данных. Поэтому искать нужно не только сообщение в консоли, но и нарушенный пользовательский сценарий.
Что считать ошибкой JavaScript
Ошибка JavaScript — это сбой кода, выполняемого браузером. Он может возникнуть при загрузке файла, обращении к отсутствующему элементу, обработке ответа API или взаимодействии пользователя со страницей. Последствие зависит от места сбоя: иногда перестаёт работать одна кнопка, иногда не запускается весь интерфейс.
Ошибки JavaScript на сайте не следует смешивать с ответом HTTP 500. Код 500 формирует сервер, а клиентский сбой появляется уже в браузере, нередко после успешного ответа 200. Это также отдельная задача от проверки индексации контента, создаваемого JavaScript: доступность текста поисковому роботу нельзя установить по одной записи в консоли.
Первые признаки проблемы — кнопка без реакции, бесконечный индикатор загрузки, пустой блок вместо данных, невозможность отправить форму или различия между мобильной и настольной версиями. При этом отсутствие красных сообщений в консоли ещё не доказывает исправность: код может логически завершиться без исключения, но выполнить неправильное действие.
Диагностический алгоритм
1. Зафиксировать сломанный сценарий
Начинайте с наблюдаемого результата. Запишите URL, последовательность действий, ожидаемое и фактическое поведение. Добавьте браузер, версию, тип устройства, состояние авторизации и примерное время проверки. Формулировка «форма не работает» слишком широка; полезнее: «после заполнения обязательных полей и нажатия кнопки запрос не отправляется, подтверждение не появляется».
Проверьте сценарий в новом приватном окне. Так можно отделить проблему страницы от устаревшего кеша, расширений и сохранённого состояния. Затем повторите её в другом браузере и на узком экране. Не меняйте сразу несколько условий: иначе будет сложно понять, какое из них влияет на сбой.
2. Проверить Console
Откройте инструменты разработчика, перейдите на вкладку Console, очистите журнал и воспроизведите проблему с начала. Смотрите прежде всего на первое исключение: последующие сообщения часто являются его следствиями.
Для записи вида Uncaught TypeError важны текст, имя файла, строка, столбец и стек вызовов. Переход по ссылке на строку покажет место сбоя. Если сайт использует собранные и минифицированные файлы, исходники проще читать при наличии корректных source map. Предупреждения тоже стоит оценивать, но не каждое из них ломает сценарий.
3. Сопоставить ошибку с сетью
На вкладке Network включите сохранение журнала, обновите страницу и повторите действие. Проверьте, загрузились ли скрипты, какой запрос должен был уйти после клика и какой ответ вернулся. Статусы 404 для файла, заблокированный CORS-запрос, неверный MIME-тип или ответ HTML вместо ожидаемого JSON часто объясняют исключение в коде.
Если запрос вообще не появился, обработчик события мог не подключиться или выполнение остановилось раньше. Если запрос успешен, изучите его содержимое и ответ, не публикуя токены, персональные данные и другие секреты.
4. Локализовать минимальную причину
Свяжите наблюдения в короткую причинную цепочку: действие пользователя → обработчик → запрос или изменение DOM → исключение → видимый результат. Это лучше, чем исправлять каждое сообщение консоли без понимания его влияния.
Для временной диагностики полезны точки останова: на строке кода, на событии клика, на изменении DOM или на исключениях. Проверьте входные значения непосредственно перед сбоем. Например, при Cannot read properties of null выясните, почему элемент не найден: изменился селектор, код выполняется до построения DOM или элемент существует только в другом варианте шаблона.
const form = document.querySelector('[data-contact-form]');
if (form) {
form.addEventListener('submit', handleSubmit);
}
Защитная проверка предотвращает исключение, но не всегда устраняет первопричину. Если форма обязана присутствовать на странице, отсутствие элемента само по себе остаётся дефектом шаблона или порядка инициализации.
Типовые ошибки и направления проверки
| Наблюдение | Вероятная причина | Что проверить |
|---|---|---|
ReferenceError: x is not defined |
Переменная недоступна, файл не загрузился или нарушен порядок скриптов | Network, область видимости, атрибуты defer и async, зависимости сборки |
Cannot read properties of null |
Селектор не нашёл элемент | Разметку, момент запуска кода, разные шаблоны и адаптивные версии |
Unexpected token < при разборе JSON |
Вместо JSON получена HTML-страница | URL запроса, статус, заголовок Content-Type и тело ответа |
| CORS или blocked by client | Политика источников либо блокировка расширением | Заголовки ответа, домен запроса и воспроизведение без расширений |
| Работает после обновления без кеша | Старая версия ресурса или рассинхронизация файлов | Имена сборок, cache-control, service worker и порядок публикации |
| Ошибок нет, но действие неверно | Логическая ошибка или необработанное состояние | Входные данные, ветвления, DOM после действия и отправленные запросы |
Как проверить исправление
Проверка не должна ограничиваться исчезновением записи из Console. Основной критерий — восстановление исходного сценария с корректным результатом. Выполните те же шаги, на которых ошибка воспроизводилась, и отдельно проверьте соседние ветви: пустые значения, неверный ввод, повторный клик, отмену действия и сетевой отказ.
- Открыть опубликованный URL в приватном окне и выполнить жёсткое обновление.
- Повторить точную последовательность, ранее приводившую к сбою.
- Сравнить ожидаемый результат, состояние интерфейса и журнал Network.
- Убедиться, что обработчик не запускается дважды и не создаёт повторные запросы.
- Проверить основной сценарий в актуальных браузерах и на мобильной ширине.
- Проверить негативный случай: ошибку API, отсутствие данных или медленное соединение.
- Убедиться, что не сломались связанные формы, кнопки, модальные окна и навигация.
Если используется система мониторинга клиентских исключений, после публикации можно сопоставить новую версию приложения с повторными событиями. Но автоматический сигнал дополняет, а не заменяет ручную проверку пользовательского пути.
Границы метода
Проверка публичной страницы показывает только поведение, доступное снаружи. Она не раскрывает внутреннюю бизнес-логику, серверные журналы, закрытые разделы и состояние конкретного аккаунта. Редкие сбои могут зависеть от географии, эксперимента, браузерного расширения, качества сети или определённой последовательности действий.
Нельзя считать любую ошибку стороннего скрипта причиной поломки сайта. Сначала подтвердите связь с конкретным сценарием. Аналогично успешный ручной тест не доказывает отсутствие всех дефектов: он подтверждает работу только для проверенных условий.
Итог
Надёжная диагностика начинается не с попытки убрать красную строку, а с описания сломанного действия. Затем нужно воспроизвести его в контролируемых условиях, сопоставить Console и Network, локализовать первую причину и проверить исправление по наблюдаемому результату. Такая последовательность отделяет значимый клиентский дефект от фонового предупреждения и снижает риск исправить симптом вместо источника проблемы.
Дополнительные материалы о техническом состоянии страниц собраны в блоге SiteVisor.