O que a expressão href <a href= pôjavascript:;"> </a> faz?

228

Vi o seguinte href usado em páginas da web de tempos em tempos. No entanto, não entendo o que isso está tentando fazer ou a técnica. Alguém pode elaborar por favor?

<a href="javascript:;"></a>
John Livermore
fonte
2
Você pode chamar um método JS com isso se não estiver enganado. Javascript: SomeFunction ()
Rob
1
Não está tentando fazer nada que não possa ser melhor tratado com um manipulador de cliques adequado. Você deve evitar isso porque é feio, inacessível e tem causado as pessoas a usar o javascript:esquema de onde ele não deve ser usado ( onclick="javascript:…")
Gareth
2
Verifique isso: stackoverflow.com/a/138233/908879
ajax333221

Respostas:

247

Um <a>elemento é HTML inválido, a menos que tenha um atributo hrefou name.

Se você deseja que ele seja renderizado corretamente como um link (por exemplo, sublinhado, ponteiro de mão, etc.), o fará somente se tiver um hrefatributo.

Um código como esse é, portanto, às vezes usado como uma maneira de criar um link, mas sem a necessidade de fornecer uma URL real no hrefatributo. Obviamente, o desenvolvedor queria que o link não fizesse nada, e essa era a maneira mais fácil que ele conhecia.

Ele provavelmente tem algum código de evento javascript em outro lugar que é acionado quando o link é clicado, e é isso que ele realmente quer que aconteça, mas ele quer que pareça um <a>link de tag normal .

Alguns desenvolvedores usam href='#'para o mesmo objetivo, mas isso faz com que o navegador pule para o topo da página, o que pode não ser desejado. E ele não podia simplesmente deixar o href em branco, porque href=''é um link para a página atual (ou seja, causa uma atualização da página).

Existem maneiras de contornar essas coisas. Usar um pedaço vazio de código Javascript no hrefé um deles e, embora não seja a melhor solução, ele funciona.

Spudley
fonte
16
Por curiosidade, existe uma maneira melhor de fazer isso?
Rahman Kalfane 13/10
28
o melhor a fazer é se a função de evento faz return false;ou event.preventDefault()então a hrefação nunca será chamada, para que você possa colocar algo mais sensato nela.
Spudley 13/10/11
6
Um <a>sem hrefou namenão é inválido; isso pode ser verificado facilmente usando um validador.
Jukka K. Korpela
2
O fragmento (seção #) nunca deve ser enviado ao servidor da Web de acordo com as especificações, portanto, é possível que seu navegador esteja fazendo algo errado lá.
27413 Joshua Walsh
2
Sim, ao que o @YoshieMaster disse. Se a URL tiver um # fragmento , isso nunca será enviado ao servidor da Web (ou, portanto, ao firewall); é usado apenas internamente pelo navegador. Nesse caso, clicar em um link marcado com <a href="#">... </a>não fará com que seu navegador envie solicitações HTTP em qualquer lugar; tudo o que fará é rolar para o topo da página.
Mark Reed
38

basicamente, em vez de usar o link para mover páginas (ou âncoras), esse método inicia uma função javascript

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

clicar no link acionará o alerta.

Eonasdan
fonte
31

Existem vários mecanismos para evitar um link para chegar ao seu destino. O da questão não é muito intuitivo.

Uma opção mais limpa é usar href="#no"onde #nohá uma âncora não definida no documento.

Você pode usar um nome mais semântico, como #disable, ou #action para aumentar a legibilidade.

Benefícios da abordagem:

  • Evita o efeito "mover para o topo" do href = "#" vazio
  • Evita o uso de javascript

Desvantagens:

  • Você deve ter certeza de que o nome da âncora não é usado no documento.

Como o <a>elemento não está atuando como um link, a melhor opção nesses casos não é usar um <a>elemento, mas a <div>e fornecer o estilo de link desejado.

Pau Giner
fonte
13
Também gosto da âncora não definida. No entanto, outra desvantagem é que ela adiciona a âncora ao histórico do navegador, portanto, eu opto por usar o método JS em branco no OP.
John Reid
10
<a href="javascript:alert('Hello');"></a>

é apenas uma abreviação para:

<a href="" onclick="alert('Hello'); return false;"></a>
bjornd
fonte
3
Mais ou menos, mas não é uma comparação "like for like" verdadeira. Razão pela qual alguns caem na armadilha de usá-lo em primeiro lugar.
Lankymart
9

É uma maneira de fazer um link não fazer absolutamente nada quando clicado (a menos que os eventos Javascript estejam vinculados a ele).

É uma maneira de executar Javascript em vez de seguir um link:

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

Quando não há realmente javascript para executar (como o seu exemplo), ele não faz nada.

Daan Wilmer
fonte
Ah entendo. Desativa efetivamente o link.
John John
9

Consulte o seguinte:

<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
fonte
4
<a href="javascript:void(0);"></a>

javascript: informa ao navegador que escreverá o código javascript

Gowri
fonte
3

Tópico antigo, mas pensei em acrescentar que o motivo pelo qual os desenvolvedores usam essa construção não é criar um link morto, mas porque URLs javascript, por algum motivo, não passam referências ao elemento html ativo corretamente.

por exemplo, handler_function(this.id)funciona como onClickum URL javascript , mas não como.

Portanto, é uma escolha entre escrever código compatível com padrões pedanticamente, que envolve a necessidade de ajustar manualmente a chamada para cada hiperlink ou código ligeiramente fora do padrão que pode ser escrito uma vez e usado em qualquer lugar.


fonte
2

Portanto, é usado para escrever códigos js dentro de, em hrefvez de ouvintes de eventos, onclicke evitar #links hrefpara tornar as atags válidas para html.

Eu fiz uma pesquisa sobre como usar javascript:dentro do 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>

Através desse código, você pode até escrever códigos js lá, em vez de apenas chamar funções.


Testado no chrome Versão 68.0.3440.106 (versão oficial) (64 bits)

Testado no Firefox Quantom 61.0.1 (64 bits)

Amir Fo
fonte
-4

A melhor maneira de sempre renderizar um link corretamente é com o css da seguinte maneira:

a {cursor: pointer !important}

Deve-se evitar seguir coisas desnecessárias como as mencionadas no tópico.

Imran Nazir
fonte