# o javascript:void(0): ¿qué elegir para enlaces JS?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

# o javascript:void(0): ¿qué elegir para enlaces JavaScript? Explicación completa con código



¡Hola, colega desarrollador! Si alguna vez has escrito enlaces que no llevan a una nueva página, sino que ejecutan código JavaScript (por ejemplo, abren una ventana modal, cargan contenido o realizan una animación), seguramente te has enfrentado al dilema: ¿qué valor del atributo href usar? ¿href="#" o href="javascript:void(0)"?



Esta pregunta es un verdadero éxito en Stack Overflow (¡miles de visitas!), y no es casualidad. Parece un detalle menor, pero de ello depende cómo se comportará la página: si se desplazará hacia arriba, si aparecerá un hash en la URL, si funcionará en navegadores antiguos. Aclaremos de una vez por todas qué enfoque es mejor y por qué la respuesta "correcta" no es tan simple.



El problema: ¿por qué cambiar el href?



Imagina: escribes un botón que abre un menú:



<a href="#" onclick="openMenu(); return false;">Menú</a>


O así:



<a href="javascript:void(0)" onclick="openMenu();">Menú</a>


Ambas opciones "funcionan", pero cada una esconde sorpresas. Comparemos según criterios clave.



Opción 1: href="#" — clásico con trampa



# es un enlace al "inicio" de la página. Si simplemente escribes <a href="#">, el navegador desplazará la página hacia arriba. Para evitarlo, debes agregar return false; en el manejador:



<a href="#" onclick="doSomething(); return false;">Haz clic</a>


Ventajas:

  • Accesibilidad: el enlace sigue siendo enfocable (se puede navegar con Tab).
  • Semántica: para los lectores de pantalla sigue siendo un enlace (aunque no lleve a ninguna parte).
  • Simplicidad: fácil de recordar, se escribe rápido.


Desventajas:

  • Desplazamiento hacia arriba: si olvidas return false, el usuario perderá su posición.
  • Cambio de URL: se agrega # en la barra de direcciones (a veces no es deseable).
  • Historial del navegador: se crea una entrada en el historial (el botón "Atrás" llevará a la página anterior con "#").


Opción 2: href="javascript:void(0)" — truco de antaño



javascript:void(0) es un pseudoprotocolo JavaScript. Le dice al navegador: "ejecuta el código void(0) y no sigas el enlace". void(0) devuelve undefined, por lo que la página no se mueve.



<a href="javascript:void(0)" onclick="doSomething();">Haz clic</a>


Ventajas:

  • No desplaza la página — no necesita return false.
  • No cambia la URL — no se agrega hash.


Desventajas:

  • Problemas de accesibilidad: algunos lectores de pantalla antiguos pueden "tropezar" con javascript: en el href.
  • Violación de los principios de mejora progresiva: si el usuario tiene JavaScript desactivado, el enlace no funciona (lleva a un vacío).
  • ¿HTML no válido? Formalmente, javascript: es un protocolo no estándar, pero los navegadores lo entienden. Sin embargo, el validador W3C puede quejarse.
  • Depuración más compleja: si hay un error en el href, el navegador puede comportarse de manera impredecible.


Comparación en tabla



Criterio href="#"

Blogs

Book Recommendations