Эта строка JavaScript:
var eng = document.querySelector('.eng')
пытается получить доступ к элементу на странице HTML, который, вероятно, выглядит так:
<div class="eng">english text here</div>
Для того, чтобы код JavaScript, чтобы найти этот элемент HTML, страница должна быть уже загружена до запуска строки JavaScript кода. В противном случае выражение document.querySelector('.eng')
вернет значение null.
Чтобы повысить шансы того, что HTML будет загружен и доступен до запуска JavaScript, рекомендуется поместить свои сценарии в нижняя часть элемента <body>
. Примерно так:
<body>
<div class="eng">english text</div>
<script src="myjavascript.js"></script>
<body>
Но это не полная гарантия. Чтобы еще больше повысить свои шансы, вы можете добавить атрибут defer
к тегу скрипта, который предотвращает запуск скрипта до тех пор, пока страница не загрузится.
<script src="myjavascript.js" defer></script>
Проблема №2 - Поднятие
. Есть еще одна проблема с кодом JavaScript, которая может вызвать ошибку. Это связано с «подъемом», когда переменные и объявления функций «поднимаются» наверх своих блоков.
Это JavaScript включает в себя подъем: подъем, он на самом деле делает это:
function () {
// declare 'eng' as undefined
var eng;
// declare setLocalStorage
function setLocalStorage () {
// JavaScript interpreter says during declaration:
// "TypeError: I don't know what 'eng.addEventListener' is"
eng.addEventListener('click', () => {
localStorage.setItem('locale', 'en');
});
}
// set 'eng'
eng = document.querySelector('.eng');
// now that 'eng' is set, call setLocalStorage
setLocalStorage();
}
Исправление - не используйте неустановленную переменную в поднятой функции. Этот код делает то же самое, без проблем с подъемом:
(function () {
var eng = document.querySelector('.eng');
eng.addEventListener('click', () => {
localStorage.setItem('locale', 'en');
});
})();