Подтвердить что ты не робот

Невозможно прочитать свойство addEventListener 'null

Мне нужно использовать ванильный JavaScript для проекта. У меня есть несколько функций, одна из которых - кнопка, открывающая меню. Он работает на страницах, где существует целевой идентификатор, но вызывает ошибку на страницах, где идентификатор не существует. На тех страницах, где функция не может найти идентификатор, я получаю сообщение "Can not read property" addEventListener "null", и ни одна из моих других функций не работает.

Ниже приведен код кнопки, которая открывает меню.

function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}

var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);

var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};

Как я могу справиться с этим? Вероятно, мне нужно все обернуть этот код в другую функцию или использовать оператор if/else, чтобы он искал только идентификатор на определенных страницах, но точно не уверен.

4b9b3361

Ответ 1

Я думаю, что самый простой подход состоял бы в том, чтобы просто проверить, что el не имеет значения null до добавления слушателя событий:

var el = document.getElementById('overlayBtn');
if(el){
  el.addEventListener('click', swapper, false);
}

Ответ 2

Кажется, что document.getElementById('overlayBtn'); возвращает null, потому что он выполняется до полной загрузки DOM.

Если вы поместите эту строку кода под

window.onload=function(){
  -- put your code here
}

то он будет работать без проблем.

Пример:

window.onload=function(){
    var mb = document.getElementById("b");
    mb.addEventListener("click", handler);
    mb.addEventListener("click", handler2);
}


function handler() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-1!<br>");
}

function handler2() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-2!<br>");
}

Ответ 3

Я получал ту же ошибку, но выполнение нулевой проверки, похоже, не помогло.

Решение, которое я нашел, состояло в том, чтобы обернуть мою функцию внутри прослушивателя событий для всего документа, чтобы проверить, когда DOM закончил загрузку.

document.addEventListener('DOMContentLoaded', function () {
    el.addEventListener('click', swapper, false);
});

Я думаю, это связано с тем, что я использую фреймворк (Angular), который динамически меняет мои классы и идентификатор HTML.

Ответ 4

Я столкнулся с подобной ситуацией. Вероятно, это связано с тем, что script выполняется до загрузки страницы. Поместив script в нижней части страницы, я обошел эту проблему.

Ответ 5

Спасибо @Rob M. за помощь. Вот как выглядел последний блок кода:

function swapper() {
  toggleClass(document.getElementById('overlay'), 'open');
}

var el = document.getElementById('overlayBtn');
if (el){
  el.addEventListener('click', swapper, false);

  var text = document.getElementById('overlayBtn');
  text.onclick = function(){
    this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
    return false;
  };
}

Ответ 6

Как утверждают другие, проблема заключается в том, что script выполняется до загрузки страницы (и, в частности, целевого элемента).

Но мне не нравится решение переупорядочения содержимого.

Предпочтительным решением является установка обработчика события на событие onload на странице и установка там Listener. Это обеспечит загрузку страницы и целевого элемента до выполнения назначения. например,

    <script>
    function onLoadFunct(){
            // set Listener here, also using suggested test for null
    }
    ....
    </script>

    <body onload="onLoadFunct()" ....>
    .....

Ответ 7

У меня есть коллекция цитат вместе с именами. Я использую кнопку обновления, чтобы обновить последнюю цитату, связанную с определенным именем, но при нажатии кнопки обновления она не обновляется. Я включаю код ниже для файла server.js и внешнего js файла (main.js).

main.js(внешний js)

var update = document.getElementById('update');
if (update){
update.addEventListener('click', function () {

  fetch('quotes', {
  method: 'put',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'name': 'Muskan',
    'quote': 'I find your lack of faith disturbing.'
  })
})var update = document.getElementById('update');
if (update){
update.addEventListener('click', function () {

  fetch('quotes', {
  method: 'put',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'name': 'Muskan',
    'quote': 'I find your lack of faith disturbing.'
  })
})
.then(res =>{
    if(res.ok) return res.json()
})
.then(data =>{
    console.log(data);
    window.location.reload(true);
})
})
}

файл server.js

app.put('/quotes', (req, res) => {
  db.collection('quotations').findOneAndUpdate({name: 'Vikas'},{
    $set:{
        name: req.body.name,
        quote: req.body.quote
    }
  },{
    sort: {_id: -1},
    upsert: true
  },(err, result) =>{
    if (err) return res.send(err);
    res.send(result);
  })

})

Ответ 8

Это решение сработало для меня.

var el = document.getElementById('toggles');
if (el) {
  addEventListener('click', function (e) {
    toggleMenu();
  });
};

Ответ 9

Это связано с тем, что элемент не был загружен в момент выполнения пакета js.

Я переместил бы <script src="sample.js" type="text/javascript"></script> в самую нижнюю часть файла index.html. Таким образом, вы можете гарантировать, что script выполняется после того, как все элементы html были проанализированы и отображены.

Ответ 10

Добавить все прослушиватели событий, когда загружается окно. Работает как шарм независимо от того, где вы помещаете теги script.

window.addEventListener("load", startup);
function startup() {
document.getElementById("el").addEventListener("click", myFunc);
document.getElementById("el2").addEventListener("input", myFunc);
}
myFunc(){
}