<a href="javascript:void(0)" id="loginlink">login</a>
Lo he visto href
muchas veces, pero no sé qué significa exactamente eso.
javascript
void
Dios mio
fuente
fuente
javascript:
es uno de los muchos esquemas de URI: en.wikipedia.org/wiki/URI_scheme , comodata:
.href="javascript:"
para el mismo propósito. Como se indicó en la respuesta a esta pregunta , lavoid(0)
parte estaba originalmente destinada a versiones anteriores de navegadores donde eljavascript:
manejo de URI era diferente. Pero ahora ni siquiera podía encontrar una versión donde la taquigrafía no funcionara, al menos IE7 maneja esto correctamente.Respuestas:
Aquí se proporciona una explicación:
void
operador .La razón por la que desea hacer esto con
href
un enlace es que, normalmente, unajavascript:
URL redirigirá el navegador a una versión de texto sin formato del resultado de la evaluación de ese JavaScript. Pero si el resultado esundefined
, entonces el navegador permanece en la misma página.void(0)
es solo un script corto y simple que evalúaundefined
.fuente
Además de la respuesta técnica,
javascript:void
significa que el autor está haciendo mal.No hay una buena razón para usar una
javascript:
pseudo URL (*). En la práctica, causará confusión o errores si alguien prueba cosas como 'enlace de marcador', 'abrir enlace en una nueva pestaña', etc. Esto sucede mucho ahora que la gente se ha acostumbrado a hacer clic con el botón central para una nueva pestaña: parece un enlace, desea leerlo en una pestaña nueva, pero resulta que no es un enlace real, y da resultados no deseados, como una página en blanco o un error JS cuando se hace clic con el botón central.<a href="#">
es una alternativa común que podría decirse que es menos mala. Sin embargo, debe recordar hacerloreturn false
desde suonclick
controlador de eventos para evitar que se siga el enlace y se desplace hacia la parte superior de la página.En algunos casos, puede haber un lugar útil real para apuntar el enlace. Por ejemplo, si tiene un control en el que puede hacer clic para abrir un elemento previamente oculto
<div id="foo">
, tiene sentido usarlo<a href="#foo">
para vincularlo. O si hay una forma que no sea JavaScript de hacer lo mismo (por ejemplo, 'thispage.php? Show = foo' que establece foo visible para empezar), puede vincular a eso.De lo contrario, si un enlace apunta solo a algún script, no es realmente un enlace y no debe marcarse como tal. El enfoque habitual sería agregar
onclick
a a<span>
,<div>
o an<a>
sin anhref
y aplicarle un estilo para que quede claro que puede hacer clic en él. Esto es lo que StackOverflow [hizo al momento de escribir; ahora usahref="#"
].La desventaja de esto es que pierde el control del teclado, ya que no puede tabular en un span / div / bare-a o activarlo con espacio. Si esto es realmente una desventaja depende de qué tipo de acción se pretende que tome el elemento. Puede, con un poco de esfuerzo, intentar imitar la interacción del teclado agregando
tabIndex
a al elemento y escuchando una tecla de espacio. Pero nunca va a reproducir al 100% el comportamiento real del navegador, sobre todo porque los diferentes navegadores pueden responder al teclado de manera diferente (sin mencionar los navegadores no visuales).Si realmente desea un elemento que no sea un enlace pero que pueda activarse normalmente con el mouse o el teclado, lo que desea es un
<button type="button">
(o<input type="button">
es igual de bueno, para contenidos textuales simples). Siempre puede usar CSS para rediseñarlo para que se parezca más a un enlace que a un botón, si lo desea. Pero como se comporta como un botón, así es como realmente debe marcarlo.(*: en la creación de sitios, de todos modos. Obviamente son útiles para los marcadores. Las
javascript:
pseudo-URL son una extrañeza conceptual: un localizador que no apunta a una ubicación, sino que llama a un código activo dentro de la ubicación actual. Han causado una seguridad masiva problemas para navegadores y aplicaciones web, y Netscape nunca debería haberlo inventado).fuente
href
s, incluidas las peculiaridades y los efectos secundarios; algunos de ustedes pueden encontrarlo útil: jakub-g.github.com/accessibility/onclickvoid(0)
es necesario en muchos casos; "#" es un truco que trae consigo una gran cantidad de problemas (no funcionaría en la aplicación que estoy escribiendo, eso me llevó a esta página).preventDefault
se use. No lo haga en el caso de que se utilice un ancla como botón en un formulario.Significa que no hará nada. Es un intento de que el enlace no 'navegue' a ningún lado. Pero no es la forma correcta.
En realidad, deberías solo
return false
en elonclick
evento, así:Por lo general, se usa si el enlace está haciendo algo 'JavaScript-y'. Como publicar un formulario AJAX, o intercambiar una imagen, o lo que sea. En ese caso, simplemente realiza cualquier función que se llame return
false
.Sin embargo, para hacer que su sitio web sea completamente increíble, generalmente incluirá un enlace que realiza la misma acción, si la persona que lo navega elige no ejecutar JavaScript.
fuente
<a href="enableJavaScriptToSeeMyCompletelyAwesomeSite.html" onclick="completelyAwesome();return false;">
.Hay una GRAN diferencia en el comportamiento de "#" vs javascript: void
"#" lo desplaza al inicio de la página mientras que "javascript: void (0);" no.
Esto es muy importante si está codificando páginas dinámicas. el usuario no quiere volver al principio solo porque hizo clic en un enlace de la página.
fuente
false
al controlador de eventos:onclick="doSomething();return false;"
o si sedoSomething()
devuelvefalse
, puede usarloonclick="return doSomething();"
.e.preventDefault()
."#"
que no se desplaza hacia la parte superior cuando devuelve falso.Es un método muy popular para agregar funciones de JavaScript a enlaces HTML.
Por ejemplo: los
[Print]
enlaces que ve en muchas páginas web se escriben así:¿Por qué necesitamos
href
mientrasonclick
solo podemos hacer el trabajo? Porque cuando los usuarios se ciernen sobre el texto 'Imprimir' cuando no hayhref
, el cursor cambiará a un cursor (ꕯ) en lugar de un puntero (👆). Solo tenerhref
unaa
etiqueta la valida como un hipervínculo.Una alternativa a
href="javascript:void(0);"
, es el uso dehref="#"
. Esta alternativa no requiere que JavaScript esté activado en el navegador del usuario, por lo que es más compatible.fuente
href
obtener el cursor de la mano señaladora; todo lo que se necesita es un poco de CSS.<a href="javascript:callPrintFunction()">
es más limpio (aunque probablemente debería ser unbutton
lugar en lugar de una
nchor si en realidad no lo lleva a ninguna parte).href="#"
puede llevar a sorpresas desagradables, como solicitudes xhr abortadas, que se llaman con un clic en ese enlace. Recientemente tuve dificultades para depurar un sitio web que canceló el inicio de sesión oidc solicitado, si el usuario se encontraba en una dirección que no era la raíz del sitio.#
href hizo que volviera a cargar la dirección antes de que se completara la solicitud xhr.Siempre debe tener un href en sus unas etiquetas. Llamar a una función de JavaScript que devuelve 'indefinido' funcionará bien. También lo vinculará a '#'.
Las etiquetas de anclaje en Internet Explorer 6 sin href no
a:hover
aplican el estilo.Sí, es terrible y un delito menor contra la humanidad, pero también lo es Internet Explorer 6 en general.
Espero que esto ayude.
Internet Explorer 6 es en realidad un gran crimen contra la humanidad.
fuente
Vale la pena mencionar que a veces verás el vacío 0 cuando verifiques si no está definido, simplemente porque requiere menos caracteres.
Por ejemplo:
vs.
Algunos métodos de minificación reemplazan undefined con void 0 por este motivo.
fuente
void 0
. La diferencia de 3 caracteres se suma rápidamente cuando muchos métodos utilizan valores de parámetros predeterminados.El uso de
javascript:void(0)
significa que el autor del HTML está haciendo mal uso del elemento de anclaje en lugar del elemento del botón.Fuente: Página de MDN
<a>
.fuente
void
es un operador que se utiliza para devolver unundefined
valor, por lo que el navegador no podrá cargar una nueva página.Los navegadores web intentarán tomar lo que se use como URL y cargarlo a menos que sea una función de JavaScript que devuelva nulo. Por ejemplo, si hacemos clic en un enlace como este:
entonces aparecerá un mensaje de alerta sin cargar una nueva página, y eso es porque
alert
es una función que devuelve un valor nulo. Esto significa que cuando el navegador intenta cargar una nueva página, ve nulo y no tiene nada que cargar.Una cosa importante a tener en cuenta sobre el operador vacío es que requiere un valor y no se puede usar solo. Deberíamos usarlo así:
fuente
Para entender este concepto, primero se debe entender el operador vacío en JavaScript.
La sintaxis para el operador vacío es:
void «expr»
que evalúa expr y devuelve indefinido.Si implementa void como una función, se ve de la siguiente manera:
Este operador vacío tiene un uso importante que es: descartar el resultado de una expresión.
En algunas situaciones, es importante volver indefinido en lugar del resultado de una expresión. Entonces void puede usarse para descartar ese resultado. Una de estas situaciones involucra javascript: URL, que deben evitarse para los enlaces, pero son útiles para los marcadores. Cuando visita una de esas URL, muchos navegadores reemplazan el documento actual con el resultado de evaluar el "contenido" de las URL, pero solo si el resultado no está indefinido. Por lo tanto, si desea abrir una nueva ventana sin cambiar el contenido que se muestra actualmente, puede hacer lo siguiente:
fuente
function myVoid(expr) { expr(); return undefined; }
Olvidó agregar expr ();expr
ya se evalúa cuando semyVoid()
llama (el resultado de esa expresión se pasa como parámetro)function() { alert("foo"); }
es una expresión válida .void(function() { alert("foo"); })
regresaundefined
y no muestra la alerta, mientras quemyVoid(function() { alert("foo"); })
sí (en su versión, no la de Gopal Yadav ).El
void
operador evalúa la expresión dada y luego devuelve indefinido. Evita actualizar la página.fuente
Los desarrolladores web usan
javascript:void(0)
porque es la forma más fácil de evitar el comportamiento predeterminado de laa
etiqueta.void(*anything*)
devuelveundefined
y es un valor falso. y devolver un valor falso es comoreturn false
en elonclick
caso de unaa
etiqueta que impide su comportamiento predeterminado.Así que creo que
javascript:void(0)
es la forma más sencilla de evitar el comportamiento predeterminado de laa
etiqueta.fuente
Un enlace debe tener un objetivo HREF que se especificará para permitir que sea un objeto de visualización utilizable.
La mayoría de los navegadores no analizarán JavaScript avanzado en un
etiqueta como:
debido a que la etiqueta HREF en la mayoría de los navegadores no permite espacios en blanco, o los convertirá en% 20, el equivalente HEX de un ESPACIO, lo que hace que su JavaScript sea absolutamente inútil para el intérprete.
Entonces, si desea usar una etiqueta A HREF para ejecutar JavaScript en línea, debe especificar un valor válido para HREF FIRST que no sea demasiado complejo (no contenga espacios en blanco), y luego proporcionar JavaScript en una etiqueta de atributo de evento como OnClick , OnMouseOver, OnMouseOut, etc.
La respuesta típica es hacer algo como esto:
Esto funciona bien pero hace que la página salte a la parte superior debido a que el signo de libra / etiqueta hash le dice que lo haga.
Solo proporcionar un signo de libra / etiqueta hash en una etiqueta A HREF realmente especifica el ancla raíz, que siempre, de forma predeterminada, en la parte superior de la página, puede especificar una ubicación diferente al especificar el atributo NAME dentro de una etiqueta A HREF.
Luego puede cambiar su etiqueta A HREF para saltar a 'middleofpage' y ejecutar el JavaScript en el evento OnClick, una vez que suceda así:
Habrá MUCHAS veces en las que no desea que ese enlace salte, por lo que puede hacer dos cosas:
Ahora no irá a ningún lado cuando se haga clic, pero podría hacer que la página se vuelva a centrar desde su ventana gráfica actual. Esto no es lindo. ¿Cuál es la mejor manera de proporcionar JavaScript en línea, usando un HREF A, pero sin tener que hacer nada de lo anterior? JavaScript: nulo (0);
Esto le dice al navegador que NO VAYA AQUÍ, sino que ejecute el JavaScript válido: void (0); funciona primero en la etiqueta HREF porque no contiene espacios en blanco y no se analizará como una URL. En su lugar, será ejecutado por el compilador. VOID es una palabra clave que, cuando se suministra con un perameter de 0, devuelve UNDEFINED, que no utiliza más recursos para manejar un valor de retorno que ocurriría sin especificar el 0 (es más amigable con el manejo de la memoria / rendimiento).
Lo siguiente que sucede es que se ejecuta OnClick. La página no se mueve, no ocurre nada en la pantalla.
fuente
<a>
elemento siempre debe ir a alguna parte ; si solo está en la página para ejecutar javascript, entonces se<button>
debe usar a en su lugar. Usar<button>
es a la vez más semántico y te ahorra todo este debate sobre qué hackear en un anclahref
. Editar: parece que la respuesta de @Ronnie Royston a continuación ya tiene cubierto este argumento.JavaScript: URL a un lado; Aquí es donde void puede ser útil para escribir código más corto.
fuente