Impossible de lire la propriété 'addEventListener' De null

Je dois utiliser vanilla JavaScript pour un projet. J'ai quelques fonctions, dont l'une est un bouton qui ouvre un menu. Il fonctionne sur les pages où l'id de la cible existe, mais provoque une erreur sur les pages où l'id n'existe pas. Sur les pages où la fonction ne peut pas trouver l'id, je reçois une erreur "Impossible de lire la propriété 'addEventListener' de null " et aucune de mes autres fonctions ne fonctionne.

Voici le code du bouton qui ouvre le menu.

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;
};

Comment puis-je traiter avec cette? J'ai probablement besoin d'envelopper ce code dans une autre fonction ou d'utiliser une instruction if/else afin qu'elle ne recherche que l'id sur des pages spécifiques, mais pas sûr exactement.

53
demandé sur Stephen Kennedy 2014-09-29 23:11:31

10 réponses

Je pense que l'approche la plus simple serait de simplement vérifier que el n'est pas null avant d'ajouter un écouteur d'événement:

var el = document.getElementById('overlayBtn');
if(el){
  el.addEventListener('click', swapper, false);
}
110
répondu Rob M. 2014-09-29 19:14:37

Il semble que document.getElementById('overlayBtn'); retourne null car il s'exécute avant le chargement complet du DOM.

Si vous mettez cette ligne de code sous

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

Ensuite, il fonctionnera sans problème.

Exemple:

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>");
}
63
répondu Dilip Agheda 2017-12-30 16:49:18

J'ai fait face à une situation similaire. C'est probablement parce que le script est exécuté avant le chargement de la page. En plaçant le script au bas de la page, j'ai contourné le problème.

13
répondu sridhar 2015-08-23 08:18:07

Je recevais la même erreur, mais effectuer une vérification nulle ne semblait pas aider.

La solution que j'ai trouvée était d'envelopper ma fonction dans un écouteur d'événement pour que tout le document vérifie quand le DOM a fini de charger.

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

Je pense que c'est parce que j'utilise un framework (angulaire) qui change dynamiquement mes classes HTML et mes ID.

11
répondu MattSidor 2015-05-05 21:16:17

Merci à @ Rob M. pour son aide. Voici à quoi ressemblait le dernier bloc de code:

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;
  };
}
2
répondu morocklo 2015-12-24 03:41:32

J'ai simplement ajouté "asynchrone" à ma balise de script, qui semble avoir résolu le problème. Je ne sais pas pourquoi, si quelqu'un peut expliquer, mais cela a fonctionné pour moi. Je suppose que la page n'attend pas le chargement du script, donc la page se charge en même temps que le JavaScript.

1
répondu Andy Smith 2018-03-11 09:44:27

Comme d'autres l'ont dit, le problème est que le script est exécuté avant le chargement de la page (et en particulier de l'élément cible).

Mais je n'aime pas la solution de réorganiser le contenu.

La solution préférée consiste à placer un gestionnaire d'événements sur l'événement page onload et à y définir l'écouteur. Cela garantira que la page et l'élément cible sont chargés avant l'exécution de l'affectation. par exemple

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

    <body onload="onLoadFunct()" ....>
    .....
0
répondu pjm 2015-09-03 09:23:51

J'ai une collection de citations avec des noms. J'utilise le bouton de mise à jour pour mettre à jour la dernière citation associée à un nom spécifique, mais en cliquant sur le bouton de mise à jour, il ne se met pas à jour. J'inclus le code ci-dessous pour le serveur.fichier JS et fichier JS externe (principal.js).

Principal.js (JS externe)

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);
})
})
}

Serveur.fichier 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);
  })

})
0
répondu Ambreen Fatima 2017-12-30 16:50:57

C'est parce que l'élément n'avait pas été chargé au moment où le bundle js était en cours d'exécution.

Je déplacerais le <script src="sample.js" type="text/javascript"></script> tout en bas du fichier index.html. De cette façon, vous pouvez vous assurer que le script est exécuté après que tous les éléments html ont été analysés et rendus .

-1
répondu Xcode 2017-12-27 15:36:43

Ajoute tous les écouteurs d'événements lors du chargement d'une fenêtre.Fonctionne comme un charme, peu importe où vous mettez des balises de script.

window.addEventListener("load", startup);
function startup() {
document.getElementById("el").addEventListener("click", myFunc);
document.getElementById("el2").addEventListener("input", myFunc);
}
myFunc(){
}
-2
répondu Natalie Jimenez 2017-12-30 16:46:04