Eu tenho que usar o JavaScript vanilla para um projeto. Tenho algumas funções, uma das quais é um botão que abre um menu. Funciona em páginas onde o id de destino existe, mas causa um erro nas páginas onde o id não existe. Nas páginas em que a função não consegue encontrar o id, recebo um erro "Não é possível ler a propriedade 'addEventListener' de nulo" e nenhuma das minhas outras funções funcionam.
Abaixo está o código do botão que abre o 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;
};
Como faço para lidar com isso? Provavelmente, preciso envolver todo esse código em outra função ou usar uma instrução if / else para que ele busque apenas o id em páginas específicas, mas não tenho certeza exatamente.
class
em seu html em vez deid
e solicitar umgetElementById
em seus scripts.Respostas:
Acho que a abordagem mais fácil seria apenas verificar
el
se não é nulo antes de adicionar um ouvinte de evento:fonte
null
antes que o componente de reação seja montado!Parece que
document.getElementById('overlayBtn');
esta voltandonull
porque é executado antes de o DOM carregar totalmente.Se você colocar esta linha de código em
então ele será executado sem problemas.
Exemplo:
fonte
Eu enfrentei uma situação semelhante. Provavelmente, isso ocorre porque o script é executado antes do carregamento da página. Ao colocar o script na parte inferior da página, evitei o problema.
fonte
Eu estava recebendo o mesmo erro, mas a execução de uma verificação de nulos não parecia ajudar.
A solução que encontrei foi envolver minha função dentro de um ouvinte de evento para todo o documento para verificar quando o DOM terminou de carregar.
Acho que é porque estou usando um framework (Angular) que está mudando minhas classes HTML e IDs dinamicamente.
fonte
É apenas bcz que seu JS é carregado antes da parte HTML e, portanto, não pode encontrar esse elemento. Basta colocar todo o seu código JS dentro de uma função que será chamada quando a janela for carregada.
Você também pode colocar seu código Javascript abaixo do html.
fonte
o script está carregando antes do corpo, mantenha o script após o conteúdo
fonte
Coloque o script no final da tag body.
fonte
Obrigado a @Rob M. por sua ajuda. Esta é a aparência do bloco final de código:
fonte
Eu simplesmente adicionei 'async' à minha tag de script, o que parece ter corrigido o problema. Não sei por que, se alguém pode explicar, mas funcionou para mim. Meu palpite é que a página não está esperando o script carregar, então a página carrega ao mesmo tempo que o JavaScript.
Async / Await nos permite escrever código assíncrono de maneira síncrona. é apenas açúcar sintático usando geradores e declarações de rendimento para “pausar” a execução, nos dando a capacidade de atribuí-la a uma variável!
Aqui está o link de referência- https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da
fonte
Eu encontrei o mesmo problema e verifiquei se havia nulo, mas não ajudou. Porque o script estava carregando antes do carregamento da página. Portanto, apenas colocar o script antes da tag final do corpo resolveu o problema.
fonte
Como outros disseram, o problema é que o script é executado antes que a página (e em particular o elemento de destino) seja carregada.
Mas não gosto da solução de reordenar o conteúdo.
A solução preferida é colocar um manipulador de eventos no evento onload da página e definir o Listener lá. Isso garantirá que a página e o elemento de destino sejam carregados antes que a atribuição seja executada. por exemplo
fonte
Tenho uma coleção de citações junto com nomes. Estou usando o botão atualizar para atualizar a última citação associada a um nome específico, mas ao clicar no botão atualizar não está atualizando. Estou incluindo o código abaixo para o arquivo server.js e o arquivo js externo (main.js).
main.js (js externo)
arquivo server.js
fonte
Obrigado de todos, carregue os scripts em páginas específicas que você usa, não para todas as páginas, às vezes usando swiper.js ou outra biblioteca pode causar esta mensagem de erro, a única maneira de resolver este problema é carregar a biblioteca JS em páginas específicas esse ID existe e evita o carregamento da mesma biblioteca em todas as páginas.
Espero que isso ajude você.
fonte
Eu tive o mesmo problema, mas minha identidade estava presente. Então tentei adicionar "window.onload = init;" Em seguida, envolvi meu código JS original com uma função init (chame do que quiser). Isso funcionou, então, pelo menos no meu caso, eu estava adicionando um ouvinte de evento antes de meu documento ser carregado. Isso pode ser o que você está experimentando também.
fonte
Isso ocorre porque o elemento não foi carregado no momento em que o pacote js estava sendo executado.
Eu moveria o
<script src="sample.js" type="text/javascript"></script>
para o final doindex.html
arquivo. Dessa forma, você pode garantir que o script seja executado depois que todos os elementos html forem analisados e renderizados.fonte
Adicione todos os ouvintes de evento quando uma janela for carregada. Funciona perfeitamente, não importa onde você coloque as tags de script.
fonte
load
também está obsoleta pelo mesmo motivo. DOMContentLoaded é a forma preferida, uma vez que dispara somente depois que o DOM é totalmente desenhado.