Como impedir que um clique em um link '#' salte para o topo da página?

212

Atualmente, estou usando <a>tags com jQuery para iniciar coisas como eventos de clique etc.

Exemplo é <a href="#" class="someclass">Text</a>

Mas eu odeio como o '#' faz a página pular para o topo da página. O que posso fazer em vez disso?

st4ck0v3rfl0w
fonte
2
Estou com David Dorward aqui e garanto a questão duplicada vinculada. Se você possui links no seu site, eles precisam funcionar como links normais. Se o JavaScript os intercepta e faz algo diferente, tudo bem, mas você precisa ter um link real lá, que leva a uma página real. Isso é necessário por todos os tipos de razões, entre as quais SEO e acessibilidade.
Daniel Pryden
“Estúpido é o mesmo que idiota” Todos nós já estivemos lá antes :)
takeshin

Respostas:

241

No jQuery, quando você lida com o evento click, return false para impedir que o link responda da maneira usualimpeça a ação padrão, que é visitar o hrefatributo, (pelo comentário de PoweRoy e pela resposta de Erik ):

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

    // Cancel the default action
    e.preventDefault();
});
BoltClock
fonte
1
@ pranay: OP especificou que ele está usando o jQuery para trabalhar com esses links.
BoltClock
8
Em vez de retornar false, faça um event.preventDefault (). Isso fica mais claro para as pessoas que lerão seu código.
RvdK
@ PoweRoy: entendi. Fiz a edição e aprendi algo novo :)
BoltClock
5
@BoltClock O OP deve usar botões para manipular os eventos de clique em vez de âncoras. Sua resposta é bastante útil, mas no caso em que o href aponta para algum lugar e você não precisa do redirecionamento no momento . Prevenir o comportamento padrão da ação que não é necessário é um tipo de conselho como: pegue a faca, agarre a lâmina e martele as unhas usando a alça :) Pegue a ferramenta certa para o trabalho!
takeshin
1
Se jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin 5/05
298

Portanto, isso é antigo, mas ... caso alguém encontre isso em uma pesquisa.

Basta usar em "#/"vez de "#"e a página não irá pular.

Chris
fonte
2
EXATAMENTE o que eu precisava! Mesmo um ano após o seu comentário esta foi útil para mim, então obrigado Chris
Zack
49
isso funciona porque ele navega para a âncora chamada /, não porque #/tem algum significado. você pode fazer a mesma coisa #whateveryouwante evitará um salto para o topo
gíria
3
Essa precisa ser a melhor resposta. Tnank você.
Gilberto Sánchez
1
@ slang, apesar de você estar certo, e isso é apenas nitpicking, mas eu prefiro usar "# /" em vez de "#whateveryouwant" porque "# /" é usado bastante comum e, portanto, revela intenções (Código Limpo). Ainda poderia ser uma adição à resposta.
Job16
22
Cuidado - isso cria um registro no histórico do navegador, portanto, clicar de volta não fará o que o usuário pensa que fará depois de clicar em um link #/ou qualquer outra coisa, por exemplo #whatever.
Darren Sweeney
61

você pode até escrever assim:

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

Não tenho a certeza que é uma maneira melhor, mas é uma maneira :)

cara schaller
fonte
Esse método foi bom para o pré-HTML 4, mas hoje é uma prática muito ruim, pois quebra muitas ações de navegação como "abrir link em uma nova guia".
Steve-o
7
você talvez certo, mas .., neste caso, não funciona nos importa, porque ele está dando um evento onclick de modo Abrir link em nova aba trabalho não tomaria qualquer maneira ...
cara schaller
Atalho é href='javascript:;', mas tenha cuidado que desencadeia evento window.beforeUnload no IE
Mihir
Isso pode quebrar sua própria função? Porque se eu fizer isso, minha função para renderizar slides não será mais acionada.
user3806549
29

Solução 1: (simples)

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

Solução 2: (necessário javascript)

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

Solução 3: (necessário jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>
Nabi KAZ
fonte
3
A primeira solução é perfeita. Curto, limpo e simples. Essa deve ser a resposta aceita. Obrigado!
AlmostPitt
O número 1 é uma solução incrível. Obrigado!
Brenton Scott
11

Basta usar em <input type="button" />vez de <a>e usar CSS para estilizá-lo para parecer um link, se desejar.

Os botões são criados especificamente para clicar e não precisam de nenhum atributo href.

A melhor maneira é usar a ação onload para criar o botão e anexá-lo onde for necessário via javascript; portanto, com o javascript desativado, eles não serão exibidos e não confundirão o usuário.

Quando você usa, href="#"você obtém vários links diferentes apontando para o mesmo local, o que não funcionará quando o agente não suportar JavaScript.

leva
fonte
1
@kingjeffrey Mas não fazer nada ainda é melhor do que navegar para #.
Robert
8

Se você deseja usar uma âncora, pode usar http://api.jquery.com/event.preventDefault/ como as outras respostas sugeridas.

Você também pode usar qualquer outro elemento como uma extensão e anexar o evento click a ele.

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

Você pode usar #0como href, já que 0não é permitido como um ID, a página não irá pular.

<a href="#0" class="someclass">Text</a>
Veve
fonte
5
$('a[href="#"]').click(function(e) {e.preventDefault(); });
Praveen Manne
fonte
3
Você poderia adicionar uma breve explicação?
JF Meier
Parece-me que ele está adicionando um manipulador de cliques em qualquer âncora que tenha um href de "#" associado. Dessa forma, você não precisaria procurar todos os manipuladores de cliques que já existem e adicionar e.preventDefault () dentro deles.
Mani5556
4

Apenas use

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

JQUERY

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

Se o elemento não tiver um valor href significativo, ele não será realmente um link. Por que não usar outro elemento?

Conforme sugerido por Neothor, uma extensão é tão apropriada e, se modelada corretamente, será visivelmente óbvia como um item que pode ser clicado. Você pode até anexar um evento flutuante, para que o elemento 'acenda' à medida que o mouse do usuário se move sobre ele.

No entanto, tendo dito isso, convém repensar o design do seu site para que ele funcione sem javascript, mas seja aprimorado pelo javascript quando estiver disponível.

belugabob
fonte
4

Os links com href = "#" quase sempre devem ser substituídos por um elemento de botão:

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

O uso de links com href = "#" também é uma preocupação de acessibilidade, pois esses links estarão visíveis para os leitores de tela, que lerão "Link - Texto", mas se o usuário clicar, ele não irá a lugar algum.

martinedwards
fonte
3

Você pode passar uma tag de âncora sem uma propriedade href e usar o jQuery para executar a ação necessária:

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

kingjeffrey
fonte
Geralmente, não recomendo essa abordagem, pois não há ação de fallback se o usuário tiver o js desativado. Mas, como você já tem o href definido #, presumi que isso não é uma preocupação para você e, portanto, ofereci essa solução, pois é provavelmente o meio mais simples de atender às suas necessidades.
kingjeffrey
1
a:linkOs seletores de CSS não direcionarão essa tag de âncora.
BoltClock
BoltClock, isso é verdade. Mas st4ck0v3rfl0w não indicava essa necessidade.
kingjeffrey
Também pode usar um <div> então. Acredito que o objetivo de manter o <a> é manter o estilo, que já é definido pelos <a> 's regulares. Sem href, não será detectado e estilizado como os outros <a> 's.
MarsAndBack
3

Eu tenho usado:

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

O #/truque funciona, mas adiciona um evento histórico ao navegador. Portanto, clicar para trás não funciona como o usuário deseja / espera.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); é o caminho que segui, pois funciona para conteúdo já existente e quaisquer elementos adicionados ao DOM após o carregamento.

Especificamente, eu precisava fazer isso em um menu suspenso de inicialização dentro de um .btn-group(Referência) , então fiz:

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

Dessa forma, foi direcionado e não afetou mais nada na página.

David
fonte
3

Eu sempre usei:

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

ao tentar impedir o salto da página. Não tenho certeza se é o melhor, mas parece que está funcionando bem há anos.

Josh Harris
fonte
3

Existem quatro maneiras semelhantes de impedir que a página salte para o topo sem nenhum JavaScript:

Opção 1:

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

Opção 2:

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

Opção 3:

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

Opção 4 ( não recomendado ):

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

Mas é melhor usar event.preventDefault()se você estiver entregando o evento click no jQuery.

ExillustX
fonte
3
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
A. Suliman
2

Você também pode retornar false após processar seu jquery.

Por exemplo.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);
user3581326
fonte
1
Isso e o método ao vivo são preteridos e não devem mais ser usados.
Quentin
2

Eu uso algo como isto:

<a href="#null" class="someclass">Text</a>
Stefan
fonte
2

Para impedir que a página salte, você deve ligar e.stopPropagation();após ligar e.preventDefault();:

stopPropagationimpede que o evento suba na árvore DOM. Mais informações aqui: https://api.jquery.com/event.stoppropagation/

anthonyjruffa
fonte
você poderia, por favor, fornecer o código completo que eu poderia colar no meu html? Estou usando o Zurb Foundation 5.5.3.
Julie S.
2

Se você deseja migrar para uma seção âncora na mesma página sem aumentar a página, use:

Basta usar "# /" em vez de "#", por exemplo

<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
fonte
1

Adicionar algo depois #define o foco da página no elemento com esse ID. A solução mais simples é usar #/mesmo se você estiver usando o jQuery. No entanto, se você estiver lidando com o evento no jQuery, esse event.preventDefault()é o caminho a percorrer.

Vivek Vijayan
fonte
0

O <a href="#!">Link</a>e <a href="#/">Link</a>não funciona se for necessário clicar na mesma entrada mais de uma vez. Leva apenas um clique de evento para cada uma em várias entradas.

ainda o melhor caminho a seguir é com <a href="#">Link</a>

então,

event.preventDefault();
Richard Rosario
fonte