¿Cómo evitar que un clic en un enlace '#' salte a la parte superior de la página?

213

Actualmente estoy usando <a>etiquetas con jQuery para iniciar cosas como eventos de clic, etc.

Ejemplo es <a href="#" class="someclass">Text</a>

Pero odio cómo el '#' hace que la página salte a la parte superior de la página. ¿Qué puedo hacer en su lugar?

st4ck0v3rfl0w
fuente
2
Estoy con David Dorward aquí, y gargantaun en la pregunta duplicada vinculada. Si tiene enlaces en su sitio web, deben funcionar como enlaces normales. Si JavaScript los intercepta y hace algo diferente, todo bien y bien, pero necesita tener un enlace real allí, que conduzca a una página real. Esto es necesario por todo tipo de razones, entre ellas, SEO y accesibilidad.
Daniel Pryden
"Estúpido es tan estúpido" Todos hemos estado allí antes :)
ocupa el

Respuestas:

242

En jQuery, cuando manejas el evento click, devuelve falso para evitar que el enlace responda de la manera habitualevitar que la acción predeterminada, que es visitar el hrefatributo, tenga lugar (según el comentario de PoweRoy y la respuesta de Erik ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});
BoltClock
fuente
1
@pranay: OP especificó que está usando jQuery para trabajar con estos enlaces.
BoltClock
8
En lugar de devolver false, haga un event.preventDefault (). Esto es más claro para las personas que leerán su código.
RvdK
@PoweRoy: lo tengo. Hice la edición y aprendí algo nuevo :)
BoltClock
55
@BoltClock El OP debe usar botones para manejar los eventos de clic en lugar de anclajes. Su respuesta es bastante útil, pero en el caso cuando href apunta a algún lugar y no necesita la redirección en este momento . Prevenir el comportamiento de acción predeterminado que no es necesario en absoluto es un tipo de consejo como: tomar el cuchillo, agarrar la cuchilla y martillar las uñas con el mango :) ¡Tome la herramienta adecuada para el trabajo!
takeshin
1
Si jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin
298

Entonces esto es viejo pero ... en caso de que alguien encuentre esto en una búsqueda.

Simplemente use en "#/"lugar de "#"y la página no saltará.

Chris
fuente
2
¡EXACTAMENTE lo que necesitaba! Incluso un año después de tu comentario, esto fue útil para mí, así que gracias Chris
Zack
49
eso funciona porque navega al ancla nombrada /, no porque #/tenga ningún significado. puede hacer lo mismo #whateveryouwanty evitará un salto a la cima
argot
3
Esta debe ser la mejor respuesta. Gracias.
Gilberto Sánchez
1
@slang, aunque tienes razón, y esto es solo una trampa, pero preferiría usar "# /" en lugar de "#whateveryouwant" porque "# /" se usa bastante común y por lo tanto revela intenciones (Código limpio). Sin embargo, aún podría ser una adición a la respuesta.
jobbert
22
Cuidado: esto crea un registro en el historial del navegador, por lo que hacer clic de nuevo no hará lo que el usuario cree que hará después de hacer clic en un enlace #/o cualquier otra cosa, por ejemplo #whatever.
Darren Sweeney
61

incluso puedes escribirlo así:

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

No estoy seguro de que sea una mejor manera, pero es una forma :)

chico schaller
fuente
Este método estaba bien para pre-HTML 4, pero hoy es una práctica muy mala, ya que rompe demasiadas acciones de navegación como "abrir enlace en una pestaña nueva".
Steve-o
77
tal vez tengas razón, pero ... en este caso no importa porque está dando un evento onclick, por lo que abrir el enlace en una nueva pestaña no funcionaría de todos modos ...
guy schaller
El acceso directo es href='javascript:;'pero tenga cuidado, desencadena el evento window.beforeUnload en IE
Mihir
Esto podría romper su propia función? Porque si hago esto, mi función para renderizar diapositivas ya no se activa.
user3806549
29

Solución # 1: (simple)

<a href="#!" class="someclass">Text</a>

Solución # 2: (necesaria javascript)

<a href="javascript:void(0);" class="someclass">Text</a>

Solución # 3: (necesario jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>
Nabi KAZ
fuente
3
La primera solución es perfecta. Corto, limpio y simple. Esta debería ser la respuesta aceptada. ¡Gracias!
AlmostPitt
El número 1 es una solución increíble. ¡Gracias!
Brenton Scott, el
11

Simplemente use en <input type="button" />lugar de <a>y use CSS para diseñarlo para que se vea como un enlace si lo desea.

Los botones están hechos específicamente para hacer clic, y no necesitan ningún atributo href.

La mejor manera es usar la acción de carga para crear el botón y agregarlo donde lo necesite a través de JavaScript, por lo que con JavaScript deshabilitado, no se mostrarán en absoluto y no confundirán al usuario.

Cuando lo usa href="#", obtiene toneladas de enlaces diferentes que apuntan a la misma ubicación, lo que no funcionará cuando el agente no sea compatible con JavaScript.

tomashin
fuente
1
@kingjeffrey Pero no hacer nada sigue siendo mejor que navegar #.
Robert
8

Si desea usar un ancla, puede usar http://api.jquery.com/event.preventDefault/ como las otras respuestas sugeridas.

También puede usar cualquier otro elemento como un intervalo y adjuntar el evento de clic a eso.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});
Neothor
fuente
7

Puedes usarlo #0como href, ya 0que no está permitido como id, la página no saltará.

<a href="#0" class="someclass">Text</a>
Veve
fuente
5
$('a[href="#"]').click(function(e) {e.preventDefault(); });
Praveen Manne
fuente
3
¿Podría por favor agregar una breve explicación?
JF Meier
Me parece que está agregando un controlador de clics en cualquier ancla que tenga un href de "#" asociado. De esta forma, no tendría que buscar todos los controladores de clics que ya tiene y agregar e.preventDefault () dentro de ellos.
Mani5556
4

Solo usa

<a href="javascript:;" class="someclass">Text</a>

JQUERY

$('.someclass').click(function(e) { alert("action here"); }
Ayush
fuente
4

Si el elemento no tiene un valor href significativo, entonces no es realmente un enlace, entonces, ¿por qué no utilizar algún otro elemento?

Según lo sugerido por Neothor, un lapso es igual de apropiado y, si se diseña correctamente, será visiblemente obvio como un elemento en el que se puede hacer clic. Incluso puede adjuntar un evento de desplazamiento, para que el elemento se "ilumine" cuando el mouse del usuario se mueva sobre él.

Sin embargo, una vez dicho esto, es posible que desee repensar el diseño de su sitio para que funcione sin javascript, pero javascript lo mejore cuando esté disponible.

belugabob
fuente
4

Los enlaces con href = "#" casi siempre deben reemplazarse con un elemento de botón:

<button class="someclass">Text</button>

El uso de enlaces con href = "#" también es un problema de accesibilidad, ya que estos enlaces serán visibles para los lectores de pantalla, que leerán "Enlace - Texto", pero si el usuario hace clic, no irá a ningún lado.

martinedwards
fuente
3

Simplemente puede pasar una etiqueta de anclaje sin una propiedad href y usar jQuery para realizar la acción requerida:

<a class="foo">bar</a>

Kingjeffrey
fuente
Por lo general, no recomiendo este enfoque, ya que no existe una acción alternativa si el usuario tiene deshabilitado js. Pero dado que ya tiene el href configurado #, supuse que esto no es una preocupación para usted y, por lo tanto, le ofrecí esta solución, ya que es probable que sea el medio más simple para satisfacer sus necesidades.
kingjeffrey
1
a:linkLos selectores CSS no apuntarán a esta etiqueta de anclaje.
BoltClock
BoltClock, esto es cierto. Pero st4ck0v3rfl0w no indicó tal necesidad.
kingjeffrey
También podría usar un <div> entonces. Creo que el punto de mantener el <a> es mantener su estilo, que ya está definido por los <a> normales. Sin href, no se detectará ni se diseñará como los otros <a>.
MarsAndBack
3

He usado:

<a href="javascript://nop/" class="someClass">Text</a>
Brice Roncace
fuente
3

El #/truco funciona, pero agrega un evento de historial al navegador. Por lo tanto, hacer clic hacia atrás no funciona, ya que el usuario puede quererlo / esperarlo.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); es mi camino, ya que funciona para contenido ya existente y cualquier elemento agregado al DOM después de la carga.

Específicamente, necesitaba hacer esto en un menú desplegable de arranque dentro de una .btn-group(Referencia) , así que lo hice:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

De esta manera fue dirigido, y no afectó nada más en la página.

David
fuente
3

Siempre he usado:

<a href="#?">Some text</a>

al intentar evitar el salto de página. No estoy seguro si este es el mejor, pero parece que ha estado funcionando bien durante años.

Josh Harris
fuente
3

Hay 4 formas similares para evitar que la página salte a la parte superior sin JavaScript:

Opción 1:

<a href="#0">Link</a>

Opcion 2:

<a href="#!">Link</a>

Opcion 3:

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

Opción 4 ( no recomendado ):

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

Pero es mejor usarlo event.preventDefault()si está entregando el evento click en jQuery.

ExillustX
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
A. Suliman
2

También puede devolver falso después de procesar su jquery.

P.ej.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);
usuario3581326
fuente
1
Eso y el método en vivo están en desuso y ya no se deben usar.
Quentin
2

Yo uso algo como esto:

<a href="#null" class="someclass">Text</a>
stefan
fuente
2

Para evitar que la página salte, debe llamar e.stopPropagation();después de llamar e.preventDefault();:

stopPropagationevita que el evento suba al árbol DOM. Más información aquí: https://api.jquery.com/event.stoppropagation/

anthonyjruffa
fuente
¿podría proporcionar el código completo que pude pegar en mi html? Estoy usando Zurb Foundation 5.5.3.
Julie S.
2

Si desea migrar a una sección de anclaje en la misma página sin saltar de página, use:

Simplemente use "# /" en lugar de "#" por ej.

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..
Agidigbi Ayodeji Victor
fuente
1

Agregar algo después #establece el foco de la página en el elemento con esa ID. La solución más simple es usar #/incluso si está usando jQuery. Sin embargo, si está manejando el evento en jQuery, este event.preventDefault()es el camino a seguir.

Vivek Vijayan
fuente
0

El <a href="#!">Link</a>y <a href="#/">Link</a>no funciona si uno tiene que hacer clic en la misma entrada más de una vez ... solo requiere un clic de evento para cada entrada múltiple.

Todavía la mejor manera de hacerlo es con <a href="#">Link</a>

luego,

event.preventDefault();
Richard Rosario
fuente