Je dois utiliser du JavaScript vanille pour un projet. J'ai quelques fonctions, dont l'une est un bouton qui ouvre un menu. Cela fonctionne sur les pages où l'ID cible existe, mais provoque une erreur sur les pages où l'ID n'existe pas. Sur les pages où la fonction ne trouve pas 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 gérer cela? J'ai probablement besoin de tout envelopper ce code dans une autre fonction ou d'utiliser une instruction if / else afin qu'il ne recherche que l'identifiant sur des pages spécifiques, mais pas exactement.
class
dans votre html au lieu deid
et que vous appelez ungetElementById
dans vos scripts.Réponses:
Je pense que l'approche la plus simple serait de simplement vérifier que ce
el
n'est pas nul avant d'ajouter un écouteur d'événements:la source
null
avant le montage du composant de réaction!Il semble que cela
document.getElementById('overlayBtn');
revientnull
car il s'exécute avant le chargement complet du DOM.Si vous mettez cette ligne de code sous
alors il fonctionnera sans problème.
Exemple:
la source
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 en bas de page, j'ai contourné le problème.
la source
J'obtenais 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énements pour tout le document afin de vérifier quand le DOM a fini de charger.
Je pense que c'est parce que j'utilise un framework (Angular) qui change dynamiquement mes classes HTML et mes ID.
la source
C'est juste que votre JS est chargé avant la partie HTML et il ne peut donc pas trouver cet élément. Mettez simplement votre code JS dans une fonction qui sera appelée lorsque la fenêtre sera chargée.
Vous pouvez également mettre votre code Javascript sous le html.
la source
le script se charge avant le corps, conserver le script après le contenu
la source
Mettez le script à la fin de la balise body.
la source
Merci à @Rob M. pour son aide. Voici à quoi ressemblait le dernier bloc de code:
la source
J'ai simplement ajouté «async» à ma balise de script, ce 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.
Async / Await nous permet d'écrire du code asynchrone de manière synchrone. c'est juste du sucre syntaxique utilisant des générateurs et des instructions yield pour «mettre en pause» l'exécution, ce qui nous donne la possibilité de l'assigner à une variable!
Voici le lien de référence - https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da
la source
J'ai rencontré le même problème et vérifié la valeur null, mais cela n'a pas aidé. Parce que le script se chargeait avant le chargement de la page. Donc, juste en plaçant le script avant la balise end body a résolu le problème.
la source
Comme d'autres l'ont dit, le problème est que le script est exécuté avant que la page (et en particulier l'élément cible) ne soit chargée.
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 de chargement de la page 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
la source
J'ai une collection de citations avec des noms. J'utilise le bouton de mise à jour pour mettre à jour le dernier devis associé à 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 fichier server.js et le fichier js externe (main.js).
main.js (js externes)
fichier server.js
la source
Merci à tous, chargez les scripts dans des pages spécifiques que vous utilisez, pas pour toutes les pages, parfois en utilisant swiper.js ou une autre bibliothèque, cela peut provoquer ce message d'erreur, le seul moyen de résoudre ce problème est de charger la bibliothèque JS sur des pages spécifiques cet identifiant existe et empêche le chargement de la même bibliothèque dans toutes les pages.
J'espère que cela vous aidera.
la source
J'ai eu le même problème, mais mon identité était présente. J'ai donc essayé d'ajouter "window.onload = init;" Ensuite, j'ai enveloppé mon code JS d'origine avec une fonction init (appelez-la comme vous voulez). Cela a fonctionné, donc au moins dans mon cas, j'ajoutais un écouteur d'événements avant le chargement de mon document. Cela pourrait aussi être ce que vous vivez.
la source
Ceci est dû au fait que l'élément n'avait pas été chargé au moment où le bundle js était en cours d'exécution.
Je déplacerais
<script src="sample.js" type="text/javascript"></script>
tout en bas duindex.html
fichier. 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.la source
Ajoutez tous les écouteurs d'événements lorsqu'une fenêtre se charge. Fonctionne comme un charme, peu importe où vous placez les balises de script.
la source
load
est également déconseillée pour la même raison. DOMContentLoaded est le moyen préféré, car il se déclenche uniquement après que le DOM est entièrement dessiné.