Tengo que usar JavaScript vainilla para un proyecto. Tengo algunas funciones, una de las cuales es un botón que abre un menú. Funciona en páginas donde existe la identificación de destino, pero causa un error en páginas donde la identificación no existe. En aquellas páginas donde la función no puede encontrar la identificación, recibo un error "No se puede leer la propiedad 'addEventListener' de nulo" y ninguna de mis otras funciones funciona.
A continuación se muestra el código del botón que abre el menú.
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;
};
¿Cómo me enfrento a esto? Probablemente necesite envolver este código en otra función o usar una declaración if / else para que solo busque la identificación en páginas específicas, pero no estoy seguro exactamente.
class
en su html en lugar deid
y solicita ungetElementById
en sus scripts.Respuestas:
Creo que el enfoque más fácil sería simplemente verificar que
el
no sea nulo antes de agregar un detector de eventos:fuente
null
antes de que se monte el componente de reacción!Parece que
document.getElementById('overlayBtn');
está regresandonull
porque se ejecuta antes de que el DOM se cargue por completo.Si pones esta línea de código debajo
entonces se ejecutará sin problemas.
Ejemplo:
fuente
Enfrenté una situación similar. Probablemente esto se deba a que el script se ejecuta antes de que se cargue la página. Al colocar el guión al final de la página, evité el problema.
fuente
Recibí el mismo error, pero realizar una verificación nula no pareció ayudar.
La solución que encontré fue envolver mi función dentro de un detector de eventos para que todo el documento verifique cuando el DOM terminó de cargarse.
Creo que esto se debe a que estoy usando un marco (Angular) que está cambiando mis clases de HTML y mis ID de forma dinámica.
fuente
Es solo porque su JS se carga antes que la parte HTML y, por lo tanto, no puede encontrar ese elemento. Simplemente coloque todo su código JS dentro de una función que se llamará cuando se cargue la ventana.
También puede poner su código Javascript debajo del html.
fuente
la secuencia de comandos se carga antes del cuerpo, mantenga la secuencia de comandos después del contenido
fuente
Ponga el guión al final de la etiqueta del cuerpo.
fuente
Gracias a @Rob M. por su ayuda. Así es como se veía el bloque final de código:
fuente
Simplemente agregué 'async' a mi etiqueta de secuencia de comandos, que parece haber solucionado el problema. No estoy seguro de por qué, si alguien puede explicarme, pero funcionó para mí. Supongo que la página no está esperando a que se cargue el script, por lo que la página se carga al mismo tiempo que JavaScript.
Async / Await nos permite escribir código asincrónico de forma síncrona. es simplemente azúcar sintáctico usando generadores y declaraciones de rendimiento para "pausar" la ejecución, ¡dándonos la capacidad de asignarlo a una variable!
Aquí está el enlace de referencia: https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da
fuente
Encontré el mismo problema y verifiqué nulo, pero no ayudó. Porque el script se estaba cargando antes de que se cargara la página. Entonces, simplemente colocando el script antes de la etiqueta del cuerpo final resolvió el problema.
fuente
Como han dicho otros, el problema es que el script se ejecuta antes de que se cargue la página (y en particular el elemento de destino).
Pero no me gusta la solución de reordenar el contenido.
La solución preferida es poner un controlador de eventos en el evento de carga de la página y establecer allí el Oyente. Eso asegurará que la página y el elemento de destino se carguen antes de que se ejecute la asignación. p.ej
fuente
Tengo una colección de citas junto con nombres. Estoy usando el botón de actualización para actualizar la última cita asociada con un nombre específico, pero al hacer clic en el botón de actualización, no se actualiza. Incluyo el código a continuación para el archivo server.js y el archivo js externo (main.js).
main.js (js externos)
archivo server.js
fuente
Gracias de todos, cargue los scripts en páginas específicas que usa, no para todas las páginas, a veces usando swiper.js u otra biblioteca puede causar este mensaje de error, la única forma de resolver este problema es cargar la biblioteca JS en páginas específicas ese ID existe y evita la carga de la misma biblioteca en todas las páginas.
Espero que esto te ayude.
fuente
Tuve el mismo problema, pero mi identificación estaba presente. Así que intenté agregar "window.onload = init;" Luego envolví mi código JS original con una función de inicio (llámalo como quieras). Esto funcionó, así que al menos en mi caso, estaba agregando un detector de eventos antes de que se cargara mi documento. Esto también podría ser lo que estás experimentando.
fuente
Esto se debe a que el elemento no se había cargado en el momento en que se estaba ejecutando el paquete js.
Movería el
<script src="sample.js" type="text/javascript"></script>
al final delindex.html
archivo. De esta manera, puede asegurarse de que el script se ejecute después de que todos los elementos html hayan sido analizados y procesados.fuente
Agregue todos los detectores de eventos cuando se cargue una ventana. Funciona como un encanto sin importar dónde coloque las etiquetas de script.
fuente
load
también está obsoleta por la misma razón. DOMContentLoaded es la forma preferida, ya que se activa solo después de que el DOM está completamente dibujado.