¿Qué hace la expresión href <a href= olvidarjavascript:;"> </a>?

228

He visto el siguiente href usado en páginas web de vez en cuando. Sin embargo, no entiendo qué está tratando de hacer esto o la técnica. ¿Alguien puede elaborar por favor?

<a href="javascript:;"></a>
John Livermore
fuente
2
Puede llamar a un método JS con esto si no me equivoco. Javascript: SomeFunction ()
Rob
1
No está tratando de hacer nada que no se pueda manejar mejor con un controlador de clic adecuado. Debe evitar esto porque es feo, inaccesible y ha provocado que las personas usen el javascript:esquema donde no debería usarse ( onclick="javascript:…")
Gareth
2
Mira esto: stackoverflow.com/a/138233/908879
ajax333221

Respuestas:

247

Un <a>elemento es HTML no válido a menos que tenga un atributo hrefo name.

Si desea que se represente correctamente como un enlace (es decir, subrayado, puntero de mano, etc.), solo lo hará si tiene un hrefatributo.

Por lo tanto, un código como este a veces se usa como una forma de hacer un enlace, pero sin tener que proporcionar una URL real en el hrefatributo. El desarrollador obviamente quería que el enlace en sí no hiciera nada, y esta era la forma más fácil que sabía.

Probablemente tiene algún código de evento de JavaScript en otro lugar que se activa cuando se hace clic en el enlace, y eso será lo que realmente quiere que suceda, pero quiere que se vea como un <a>enlace de etiqueta normal .

Algunos desarrolladores usan href='#'para el mismo propósito, pero esto hace que el navegador salte a la parte superior de la página, lo que puede no ser deseado. Y no podía simplemente dejar el href en blanco, porque href=''es un enlace a la página actual (es decir, causa una actualización de la página).

Hay formas de evitar estas cosas. El uso de un fragmento de código Javascript vacío en el hrefes uno de ellos, y aunque no es la mejor solución, funciona.

Spudley
fuente
16
Por curiosidad, ¿hay una mejor manera de hacer esto?
Rahman Kalfane
28
Una mejor manera de hacerlo es si la función de evento lo hace return false;o si event.preventDefault()la hrefacción nunca se llamará, por lo que puede poner algo más sensible allí.
Spudley
66
Un <a>sin hrefo nameno es inválido; Esto se puede verificar fácilmente con un validador.
Jukka K. Korpela
2
El fragmento (sección #) nunca debería enviarse al servidor web de acuerdo con las especificaciones, por lo que es probable que su navegador esté haciendo algo mal allí.
Joshua Walsh
2
Sí a lo que dijo @YoshieMaster. Si la URL tiene un # fragmento , eso nunca se envía al servidor web (o, por lo tanto, al firewall); solo lo usa internamente el navegador. En este caso, hacer clic en un enlace etiquetado con <a href="#">... </a>no hará que su navegador envíe solicitudes HTTP a ningún lado; todo lo que hará es desplazarse hasta la parte superior de la página.
Mark Reed
38

Básicamente, en lugar de usar el enlace para mover páginas (o anclas), el uso de este método lanza una función o funciones de JavaScript

<script>
function doSomething() {
  alert("hello")
}
</script>
<a href="javascript:doSomething();">click me</a>

Al hacer clic en el enlace, se activará la alerta.

Eonasdan
fuente
31

Existen varios mecanismos para evitar que un enlace llegue a su destino. El de la pregunta no es muy intuitivo.

Una opción más limpia es usar href="#no"where #noes un ancla no definida en el documento.

Puede usar un nombre más semántico como #disable o #action para aumentar la legibilidad.

Beneficios del enfoque:

  • Evita el efecto "moverse hacia arriba" del href = "#" vacío
  • Evita el uso de javascript

Inconvenientes:

  • Debe asegurarse de que el nombre del delimitador no se use en el documento.

Dado que el <a>elemento no actúa como un enlace, la mejor opción en estos casos no es usar un <a>elemento sino un <div>y proporcionar el estilo de enlace deseado.

Pau Giner
fuente
13
También me gusta el ancla no definida. Sin embargo, otro inconveniente es que agrega el ancla al historial de su navegador, por lo que opto por utilizar el método JS en blanco en el OP.
John Reid
10
<a href="javascript:alert('Hello');"></a>

es solo una abreviatura de:

<a href="" onclick="alert('Hello'); return false;"></a>
bjornd
fuente
3
Más o menos, pero no es una verdadera comparación "me gusta por me gusta". Es por eso que algunos caen en la trampa de usarlo en primer lugar.
Lankymart
9

Es una forma de hacer que un enlace no haga absolutamente nada cuando se hace clic (a menos que los eventos de Javascript estén vinculados a él).

Es una forma de ejecutar Javascript en lugar de seguir un enlace:

<a href="Javascript: doStuff();">link</a>

Cuando en realidad no hay javascript para ejecutar (como su ejemplo), no hace nada.

Daan Wilmer
fuente
Ah, ya veo. Desactiva efectivamente el enlace.
John Livermore
9

Consulte esto:

<a href="Http://WWW.stackoverflow.com">Link to the website opened in different tab</a>
<a href="#MyDive">Link to the div in the page(look at the chaneged url)</a>
<a href="javascript:;">Nothing happens if there is no javaScript to render</a>
bk
fuente
4
<a href="javascript:void(0);"></a>

javascript: le dice al navegador que va a escribir código javascript

Gowri
fuente
3

Hilo antiguo, pero pensé que solo agregaría que la razón por la que los desarrolladores usan esta construcción no es para crear un enlace muerto, sino porque las URL de JavaScript por alguna razón no pasan referencias al elemento html activo correctamente.

Por ejemplo, handler_function(this.id)funciona como onClickpero no como una URL de JavaScript.

Por lo tanto, es una opción entre escribir código pedagógicamente compatible con los estándares que implica que tenga que ajustar manualmente la llamada para cada hipervínculo, o un código ligeramente no estándar que se puede escribir una vez y usar en todas partes.


fuente
2

Por lo tanto, se usa para escribir códigos js dentro de los hrefoyentes de eventos onclicky evitar #enlaces hrefpara hacer que las aetiquetas sean válidas para html.

Tuve una investigación sobre cómo usar javascript:dentro del hrefatributo.

<a href="
     javascript:
        a = 4;
        console.log(a++); 
        a += 2; 
        console.log(a++); 
        if(a < 6){ 
            console.log('a is lower than 6');
        } 
        else 
            console.log('a is greater than 6');
        function log(s){
            console.log(s);
        }
        log('function inplimentation working too');

">Click here</a>

A través de este código, incluso puede escribir códigos js allí en lugar de solo llamar a funciones.


Probado en Chrome versión 68.0.3440.106 (versión oficial) (64 bits)

Probado en Firefox Quantom 61.0.1 (64 bits)

Amir Fo
fuente
-4

La mejor manera de representar siempre un enlace correctamente es con el CSS de la siguiente manera:

a {cursor: pointer !important}

Uno debe evitar seguir cosas innecesarias como las mencionadas en el hilo.

Imran Nazir
fuente