¿Cómo hacer que una etiqueta de anclaje no se refiera a nada?

159

Uso jQuery, necesito hacer que algunas etiquetas de anclaje no realicen ninguna acción.

Usualmente lo escribo así:

<a href="#">link</a>

Sin embargo, esto se refiere a la parte superior de la página!

ahmed
fuente
porque jquery manejará el evento click así que quiero que el enlace sea como un enlace achor pero se comporte como una función de JavaScript
ahmed
1
Como se menciona en una de las respuestas a continuación: si no desea que un enlace apunte a un recurso, no use el elemento A.
Mathias Bynens
No use el hrefatributo en en él.
vsync

Respuestas:

103

Si no desea que apunte a nada, probablemente no debería usar la <a>etiqueta (ancla).

Si desea que algo se parezca a un enlace pero no que actúe como un enlace, es mejor usar el elemento apropiado (como <span>) y luego aplicarle estilo usando CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

Además, dado que etiquetó esta pregunta como "jQuery", supongo que desea adjuntar un controlador de eventos de clic. Si es así, simplemente haga lo mismo que antes y luego use algo como el siguiente JavaScript:

$('#fake-link-1').click(function() {
    /* put your code here */
});
Tyson
fuente
37
Esto tiene un problema: no permite la navegación con pestañas.
66
Tenga en cuenta que (como señala Iraimbilanja) el enfoque span aquí desactiva la posibilidad de invocar la función usando el teclado, lo que consideraría un problema de usabilidad.
Fredrik Mörk
3
También un problema de accesibilidad. Puede resolverlo utilizando un elemento de botón (generado a partir de JavaScript para que los usuarios que no sean JS no obtengan un control roto).
Quentin
44
Aquí hay una solución rápida para eso: tabindex = "0" en un elemento sin enlace permitirá la navegación por teclado en la mayoría de los navegadores modernos.
Mathias Bynens
1
Otro 'problema' es que no tiene CSS: la pseudo clase hover no funcionará en elementos que no sean enlaces en IE6. Pero dado que de todos modos está agregando estos elementos a través de JavaScript (al menos, debería hacerlo), podría escribir un script que agregue una clase .hover al elemento cuando esté suspendido.
Mathias Bynens
268

Hay algunas soluciones menos que perfectas:

1. Enlace a un ancla falsa

<a href="#">

Problema: hacer clic en el enlace vuelve a la parte superior de la página

2. Usando una etiqueta que no sea 'a'

Use una etiqueta span y use jquery para manejar el clic

Problema: rompe la navegación del teclado, tiene que cambiar manualmente el cursor de desplazamiento

3. Enlace a una función vacía de JavaScript

<a href="javascript:void(0);">
<a href="javascript:;">

Problema: se rompe al vincular imágenes en IE

Solución

Dado que todos estos tienen sus problemas, la solución que he decidido es vincular a un ancla falsa y luego devolver falso desde el método onClick:

<a href="#" onClick="return false;">

No es la solución más concisa, pero resuelve todos los problemas con los métodos anteriores.

zaius
fuente
2
Usualmente uso el javascript: void (0); enfoque, porque el uso de # muestra la URL actual en la barra de Firefox al pasar el mouse, lo que puede ser engañoso para el usuario.
lucaferrario
8
breaks when linking images in IE¿Qué significa esto?
eugene
14
@eugene, esta pregunta tiene 3 años, pero IE solía hacer que las imágenes desaparecieran cuando estaban rodeadas por un enlace a una función vacía. No estoy seguro de cuándo fue reparado, pero funciona en IE10, que es todo lo que tengo instalado. Yo personalmente uso<a href="javascript:;">
zaius
1
También he usado comentarios allí: <a href="javascript:void(0); // Mostrar propiedades paleta">. De esa manera, cuando el usuario pasa el mouse, ve el comentario que puede darles una pista de qué esperar cuando hacen clic. (Aunque también podría usar una información sobre herramientas.)
Robin Zimmermann
55
Parece que href="javascript:"también es suficiente y funciona en los últimos navegadores principales. No es necesario el punto y coma, de hecho, PhpStorm incluso sugiere eliminarlo.
jlh
40

Para que no haga nada en absoluto, use esto:

<a href="javascript:void(0)"> ... </a>
Philippe Leybaert
fuente
1
o simplemente <a href="javascript:;">. PS no funciona con target=_blankpesar
Alex
36

La forma correcta de manejar esto es "romper" el enlace con jQuery cuando manejas el enlace

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

Esas dos últimas llamadas detienen el navegador que interpreta el clic.

Oli
fuente
55
Si bien eso suena como "correcto" porque detiene el burbujeo de eventos, "return false" es mucho menos detallado y hace lo mismo. El único momento en que desearía hacerlo es si ya tiene controladores de eventos registrados para hacer clic en los enlaces a través de jQuery.
aleemb
25

Hay tantas formas de hacerlo como

No agregue y hrefatribuya

<a name="here"> Test <a>

Puede agregar un evento onclick en lugar de href como

<a name="here" onclick="YourFunction()"> Test <a>

O puede agregar una función vacía como esta, que sería la mejor manera

<a href="javascript:void(0);"> 
<a href="javascript:;">
Punit Gajjar
fuente
¿Se requiere el atributo de nombre?
Petrus Theron
@PetrusTheron No es necesario. .
Punit Gajjar
Esta es una estafa de respuestas preexistentes
aross
1
No olvide establecer el estilo de su etiqueta de anclaje si elimina el hrefatributo, ya que ya no se comportará como un hipervínculo (aunque el onclick todavía funciona) tendrá que restablecer cosas como cursor: pointer;y el :hoverselector.
Partack
@Partack Correcto .. Gracias por notarlo
Punit Gajjar
24

¿Qué quieres decir con nada?

<a href='about:blank'>blank page</a>

o

<a href='whatever' onclick='return false;'>won't navigate</a>
KristoferA
fuente
1
De acuerdo - simplemente falsa regreso de su método de jQuery y listo, no va a ir a ninguna parte
joshcomley
14

Creo que puedes intentar

<a href="JavaScript:void(0)">link</a>

El único inconveniente que veo aquí es que la seguridad del navegador de alto nivel puede solicitar la ejecución de JavaScript.

Aunque esta es una de las formas más fáciles que

<a href="#" onclick="return false;">Link</a>

esto debe usarse con moderación

Lea este artículo para ver algunos consejos https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void

Rutesh Makhijani
fuente
Respuesta correcta, permite la navegación por pestañas.
K - La toxicidad en SO está creciendo.
14

Esta respuesta debe actualizarse para reflejar los nuevos estándares web (HTML5).

Esta:

<a tabindex="0">This represents a placeholder hyperlink</a>

... es válido HTML5. El atributo tabindex hace que el teclado pueda enfocarse como hipervínculos normales. También podría usar el spanelemento para esto como se mencionó anteriormente, pero creo que usar el aelemento es más elegante.

Ver: https://w3c.github.io/html-reference/a.html
y: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href

aross
fuente
1
Esto también es HTML4 válido, pero no dará estilo al ancla como un enlace.
entre
1
No sabía que era html4 válido, pero la especificación HTML5 menciona explícitamente el caso de uso. Y los estilos que no se dirigen al atributo href funcionarán bien, solo los estilos predeterminados del navegador pueden ser un problema.
aross
1
Esto tampoco desencadena un clickevento cuando el usuario enfoca el elemento y presiona enter (probado en Firefox 51).
torvin
@torvin, eso es simple. Usa el keydownevento.
aross
peculiaridad elegante, pero en la ventana 10 agrega un cuadro bordeado alrededor del elemento
1-14x0r
12

Estas son las tres formas en que <a>la hrefpropiedad de etiqueta de la etiqueta no se refiere a nada:

<a href="JavaScript:void(0)"> link </a>

<a href="javascript:;">link</a >

<a href="#" onclick="return false;"> Link </a>
Milan Gajjar
fuente
1
Esto es sólo un duplicado de la actualidad con más votos respuesta , pero con menos información
aross
5

Sé que esta es una vieja pregunta, pero pensé agregar mis dos centavos de todos modos:

Depende de lo que vaya a hacer el enlace, pero por lo general, apuntaría el enlace a una url que posiblemente podría mostrar / hacer lo mismo, por ejemplo, si está haciendo un poco sobre el cuadro emergente:

<a id="about" href="/about">About</a>

Luego con jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

De esta forma, los navegadores muy antiguos (o navegadores con JavaScript deshabilitado) aún pueden navegar a una página separada por separado, pero lo más importante, Google también recogerá esto y rastreará el contenido de la página acerca de.

Connell
fuente
5

Asegúrese de que todos los enlaces que desea detener tengan href="#!"(o lo que quiera, realmente), y luego use esto:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});
novio
fuente
4

Puede tener un ancla HTML ( aetiqueta) sin un hrefatributo. Deje el hrefatributo y no se vinculará a nada:

<a>link</a>
tee
fuente
¡Gracias! Funcionó perfectamente para mi caso. Donde quería que la etiqueta Anchor se abriera en una nueva pestaña cuando hay URL, pero nada si no hay URL. En el caso de #, estaba aceptando un CLIC y moviéndolo a la parte superior de la página. Al no tener parte de href como sugeriste. ¡Resolvió el problema! El formato se ve muy bien debido a una etiqueta, el problema de clic desapareció sin href. ¡¡¡Gracias!!!
Mohsin
1
Si alguien más piensa si es HTML5 válido, la respuesta es SÍ :) stackoverflow.com/a/33046203/5323892 . Aquí está el ejemplo de la página de estándares (ver el ítem 3er li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Inicio </a> </li> <li> <a href = "/ news "> News </a> </li> <li> <a> Ejemplos </a> </li> <li> <a href="https://stackoverflow.com/legal"> Legal </a> </li> </ ul> </nav>
Mohsin
Funciona, pero si desea que el puntero del mouse cambie a dedo, simplemente agregue href = "JavaScript: void (0)" como se sugiere en la respuesta de @Rutesh Makhijani.
Tarik
3

Lo único que funcionó para mí fue una combinación de lo anterior:

Primero el li en el ul

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

Luego, en LoadTab2_1 cambié manualmente la pestaña divs

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

Esto se debe a que la desconexión de la también desconecta la acción en las pestañas

También debe hacer manualmente el estilo de la pestaña cuando la pestaña principal cambia las cosas

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");
Pat Capozzi
fuente
2

Puedes hacerlo por

<a style='cursor:pointer' >Link</a>
Naveen Heroorkar
fuente
1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

Esta fue mi etiqueta de anclaje. así que devuelve false en onClick = "" el evento no es útil aquí. Acabo de eliminar la propiedad href = "#" y funcionó para mí como a continuación

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

y necesitaba agregar este css.

.SomeClass
{
    cursor: pointer;
}
Burk
fuente
¿Qué quieres decir con eso? ¿Qué se recomienda y por qué?
Burk
Es una buena práctica mantener javascript y html en archivos separados, aquí hay una respuesta detallada: stackoverflow.com/questions/5871640/…
Alexandru Severin
1

Encontré este problema en un sitio de WordPress. Los encabezados en los menús desplegables siempre tenían el atributo href=""y el complemento de encabezado utilizado solo permitía URL estándar. La solución más fácil era simplemente ejecutar este código en el pie de página:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

Esto evitará que las anclas en blanco hagan algo.

Bryant Jackson
fuente
0

Reaccionar ya no admite el uso de una función como esta href="javascript:void(0)"en su etiqueta de anclaje, pero aquí hay algo que funciona bastante bien.

<a href="#" onClick={() => null} >link</a>
w3bh4ck
fuente
-1

Sé que esto está etiquetado como una pregunta jQuery, pero también puede responder esto con AngularJS.

en su elemento, agregue la directiva ng-click y use la variable $ event que es el evento click ... evite su comportamiento predeterminado:

<a href="#" ng-click="$event.preventDefault()">

Incluso puede pasar la variable $ event a una función:

<a href="#" ng-click="doSomething($event)">

en esa función, haces lo que quieras con el evento click.

Jeremy Jao
fuente