A seguir, são apresentados dois métodos para criar um link com o único objetivo de executar o código JavaScript. Qual é melhor, em termos de funcionalidade, velocidade de carregamento da página, finalidades de validação etc.?
function myJsFunc() {
alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>
ou
function myJsFunc() {
alert("myJsFunc");
}
<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>
javascript
html
performance
optimization
href
Peter Mortensen
fonte
fonte
<a href="javascript:void(0)" onclick="myJsFunc();">
faz absolutamente nenhum sentido. Se você deve usar ojavascript:
protocolo psuedo, também não precisa doonclick
atributo.<a href="javascript:myJsFunc();">
vai fazer muito bem.myJsFunc()
tiver um valor de retorno, sua página será interrompida. jsfiddle.net/jAd9G você teria ainda tem que usarvoid
assim:<a href="javascript:void myJsFunc();">
. Mas então, o comportamento ainda seria diferente. A chamada do link pelo menu de contexto não aciona oclick
evento.<a href="javascript:;" onclick="myEvent()"
?javascript:;
é muito mais rápido de digitar do que #javascript:void(0)
<a>
tag se o que você deseja fazer é NÃO abrir outra página via recurso nativo do navegador, mas sim ter alguma ação javascript a ser acionada? Simplesmente usando umaspan
tag com uma classe dejs-trigger
provavelmente muito melhor ". Ou eu estou esquecendo de alguma coisa?Respostas:
Eu uso
javascript:void(0)
.Três razões Incentivar o uso de
#
uma equipe de desenvolvedores inevitavelmente leva alguns a usar o valor de retorno da função chamada assim:Mas então eles esquecem de usar
return doSomething()
no onclick e apenas usamdoSomething()
.Uma segunda razão para evitar
#
é que a finalreturn false;
não será executada se a função chamada gerar um erro. Portanto, os desenvolvedores também precisam se lembrar de manipular qualquer erro adequadamente na função chamada.Um terceiro motivo é que há casos em que a
onclick
propriedade do evento é atribuída dinamicamente. Prefiro poder chamar uma função ou atribuí-la dinamicamente sem precisar codificar a função especificamente para um método de anexo ou outro. Portanto, minhaonclick
(ou qualquer coisa) na marcação HTML fica assim:OU
O uso
javascript:void(0)
evita todas as dores de cabeça acima e não encontrei nenhum exemplo de desvantagem.Portanto, se você é um desenvolvedor independente, pode claramente fazer sua própria escolha, mas se trabalhar em equipe, precisará declarar:
Use
href="#"
, verifique seonclick
sempre contémreturn false;
no final, que qualquer função chamada não gera um erro e se você anexar uma função dinamicamente àonclick
propriedade, certifique-se de que, além de não gerar um erro, ela retornefalse
.OU
Usar
href="javascript:void(0)"
O segundo é claramente muito mais fácil de se comunicar.
fonte
href="javascript:void(0)"
métodojavascript:
deve ser considerado uma má prática, intrusivo e não desclassifica graciosamente.event.preventDefault()
existem exatamente para impedir o comportamento padrão (como pular para o topo da página nesse caso) e fazer um trabalho melhor sem toda areturn false;
loucura.javascript:void(0)
viola a Política de segurança de conteúdo nas páginas HTTPS habilitadas para CSP. Uma opção seria usarhref='#'
eevent.preventDefault()
no manipulador, mas não gosto muito disso. Talvez você possa estabelecer uma convenção para usarhref='#void'
e garantir que nenhum elemento da página tenhaid="void"
. Dessa forma, clicar em um link para uma âncora inexistente não rolará a página.href
. Isso seria feito no jQuery com:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Nem.
Se você puder ter um URL real que faça sentido, use-o como HREF. O onclick não será acionado se alguém clicar com o botão do meio no seu link para abrir uma nova guia ou se o JavaScript estiver desativado.
Se isso não for possível, você deve pelo menos injetar a tag anchor no documento com JavaScript e os manipuladores de eventos de clique apropriados.
Sei que isso nem sempre é possível, mas, na minha opinião, deve ser buscado no desenvolvimento de qualquer site público.
Confira JavaScript discreto e aprimoramento progressivo (ambos Wikipedia).
fonte
javascript:
ou#
são práticas ruins e não deve ser incentivado. Artigos agradáveis btw.<button>
foi feito. Mas concordou: provavelmente não deve ser especificamente um<a>
caso não exista um local adequado para o link.Fazer
<a href="#" onclick="myJsFunc();">Link</a>
ou<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>
qualquer outra coisa que contenha umonclick
atributo - era bom há cinco anos, embora agora possa ser uma má prática. Aqui está o porquê:Ele promove a prática de JavaScript invasivo - que se mostrou difícil de manter e difícil de dimensionar. Mais sobre isso em JavaScript discreto .
Você está gastando seu tempo escrevendo código incrivelmente detalhado - o que tem muito pouco (se houver) benefício para sua base de código.
Agora existem maneiras melhores, mais fáceis e mais sustentáveis e escaláveis de alcançar o resultado desejado.
A maneira discreta de JavaScript
Só não tem um
href
atributo! Qualquer boa redefinição de CSS cuidaria do estilo de cursor padrão ausente, o que é um problema. Em seguida, anexe sua funcionalidade JavaScript usando práticas recomendadas discretas e discretas - que são mais fáceis de manter à medida que sua lógica JavaScript permanece em JavaScript, em vez de em sua marcação - o que é essencial quando você começa a desenvolver aplicativos JavaScript em larga escala que exigem que sua lógica seja dividida em componentes e modelos na caixa preta. Mais sobre isso em arquitetura de aplicativos JavaScript em larga escalaExemplo de código simples
Um exemplo de Backbone.js em caixa preta
Para obter um exemplo de componente escalável, em caixa preta, Backbone.js - consulte este exemplo de trabalho do jsfiddle aqui . Observe como utilizamos práticas discretas de JavaScript e, em uma pequena quantidade de código, temos um componente que pode ser repetido na página várias vezes sem efeitos colaterais ou conflitos entre as diferentes instâncias do componente. Surpreendente!
Notas
A omissão do
href
atributo noa
elemento fará com que o elemento não seja acessível usando atab
navegação por teclas. Se você deseja que esses elementos sejam acessíveis por meio datab
chave, você pode definir otabindex
atributo ou usarbutton
elementos. Você pode estilizar facilmente os elementos do botão para se parecer com links normais, conforme mencionado na resposta do Tracker1 .A omissão do
href
atributo noa
elemento fará com que o Internet Explorer 6 e o Internet Explorer 7 não assumam oa:hover
estilo, motivo pelo qual adicionamos um shim simples de JavaScript para fazer isso viaa.hover
. O que é perfeitamente aceitável, como se você não tivesse um atributo href e nenhuma degradação normal, seu link não funcionaria de qualquer maneira - e você terá problemas maiores com que se preocupar.Se você deseja que sua ação ainda funcione com o JavaScript desativado, use um
a
elemento com umhref
atributo que vá para algum URL que executará a ação manualmente, em vez de através de uma solicitação do Ajax ou qualquer outro caminho a seguir. Se você estiver fazendo isso, certifique-se de fazer umaevent.preventDefault()
chamada de clique para garantir que, quando o botão for clicado, ele não siga o link. Essa opção é chamada de degradação normal.fonte
button
abordagem com estilo de link sugerida aqui é atormentada pelo inevitável estado ativo "3d" no IE9 e inferior .javascript:void(0)
. Essa é a resposta pragmática e a única resposta sensata no mundo real.'#'
levará o usuário de volta ao topo da página, então eu costumo segui-lovoid(0)
.javascript:;
também se comporta comojavascript:void(0);
fonte
#
ou#something
o levará para essa âncora na página href base , em vez de na página atual.#!
) faz o truque, mas é definitivamente uma prática ruim.Eu sinceramente sugeriria nenhum. Eu usaria um estilizado
<button></button>
para esse comportamento.Dessa forma, você pode atribuir seu onclick. Sugiro também a ligação via script, não usando o
onclick
atributo na tag do elemento. O único problema é o efeito de texto 3d psuedo em IEs mais antigos que não podem ser desativados.Se você DEVE usar um elemento A, use
javascript:void(0);
pelos motivos já mencionados.OBSERVAÇÃO: você pode substituir
0
por uma sequência como ajavascript:void('Delete record 123')
que pode servir como um indicador extra que mostrará o que o clique realmente fará.fonte
<button>
apenas uminput type=button
?<clickable>
elemento. Ou a<clickabletim>
se você preferir. Infelizmente, o uso de uma tag não padrão ou de uma div simples pode dificultar o foco do elemento nos usuários do teclado.button
. Felizmente, o IE9 está perdendo rapidamente participações de mercado, e o efeito ativo de 1px não deve nos impedir de usar a marcação semântica.<a>
é um link, destinado a enviar você a algum lugar, pelas ações que temos<button>
.O primeiro, idealmente com um link real a seguir, caso o usuário tenha o JavaScript desativado. Apenas certifique-se de retornar false para impedir que o evento click seja acionado se o JavaScript for executado.
Se você usa o Angular2, funciona dessa maneira:
<a [routerLink]="" (click)="passTheSalt()">Click me</a>
.Consulte aqui https://stackoverflow.com/a/45465728/2803344
fonte
Nem se você me perguntar;
Se o seu "link" tem o único objetivo de executar algum código JavaScript, ele não se qualifica como um link; um pedaço de texto com uma função JavaScript acoplada a ele. Eu recomendaria usar uma
<span>
tag com umonclick handler
anexo e algum CSS básico para imitar um link. Os links são criados para navegação e, se o seu código JavaScript não for para navegação, não deve ser uma<a>
tag.Exemplo:
fonte
<span>
s não devem fazer nada.<A>
nchors e<buttons>
são usados para isso!buttons
é uma escolha melhor aqui enquanto usar umspan
não é.Idealmente, você faria isso:
Ou, melhor ainda, você teria o link de ação padrão no HTML e adicionaria o evento onclick ao elemento sem obstrução via JavaScript após a renderização do DOM, garantindo assim que, se o JavaScript não estiver presente / utilizado, você não tenha manipuladores de eventos inúteis adivinhando seu código e potencialmente ofuscar (ou pelo menos distrair) seu conteúdo real.
fonte
Usando apenas
#
faz alguns movimentos engraçados, então eu recomendaria usar#self
se você gostaria de economizar nos esforços de digitaçãoJavaScript bla, bla,
.fonte
#self
tags for nomeadas e evitar o comportamento irritante do navegador ao pular para o topo da página. Obrigado.#self
não parece ser especial. Qualquer identificador de fragmento que não corresponda ao nome ou ID de qualquer elemento no documento (e não esteja em branco ou "em cima") deve ter o mesmo efeito.#void
convenção no outro comentário, mas na verdade#self
é tão curto e fácil de memorizar. Qualquer coisa é melhor que#
Eu uso o seguinte
em vez de
fonte
javascript:
(sem ponto e vírgula) porque parece mais arrumado na barra de status ao passar o mouse.javascript:void('Do foo')
como o void retornará indefinido, independentemente, ele dará um indicador ao usuário sobre o que o clique fará. OndeDo foo
pode estarDelete record X
ou o que você quiser.Concordo com sugestões em outros lugares, afirmando que você deve usar URL regular no
href
atributo e chamar alguma função JavaScript no onclick. A falha é que eles adicionam automaticamentereturn false
após a chamada.O problema dessa abordagem é que, se a função não funcionar ou se houver algum problema, o link se tornará impossível de clicar. O evento Onclick sempre retornará
false
, portanto o URL normal não será chamado.Existe uma solução muito simples. Deixe a função retornar
true
se funcionar corretamente. Em seguida, use o valor retornado para determinar se o clique deve ser cancelado ou não:Javascript
HTML
Note que eu nego o resultado da
doSomething()
função. Se funcionar, ele retornarátrue
, portanto será negado (false
) epath/to/some/URL
não será chamado. Se a função retornarfalse
(por exemplo, o navegador não suportar algo usado dentro da função ou se algo der errado), ela será negadatrue
epath/to/some/URL
será chamada.fonte
#
é melhor quejavascript:anything
, mas o seguinte é ainda melhor:HTML:
JavaScript:
Você deve sempre se esforçar para degradar normalmente (caso o usuário não tenha o JavaScript ativado ... e quando esteja com especificações e orçamento). Além disso, é considerado incorreto usar atributos e protocolo JavaScript diretamente em HTML.
fonte
click
nos links ...Eu recomendo usar um
<button>
elemento, especialmente se o controle deve produzir uma alteração nos dados. (Algo como um POST.)É ainda melhor se você injetar os elementos de maneira discreta, um tipo de aprimoramento progressivo. (Veja este comentário .)
fonte
.btn
faz com que botões e links pareçam exatamente iguais.button
também não introduz um # no URL ou mostra oa
href como javascript :;A menos que você esteja escrevendo o link usando JavaScript (para saber que ele está ativado no navegador), idealmente, você deve fornecer um link adequado para as pessoas que estão navegando com o JavaScript desabilitado e impedir a ação padrão do link no seu onclick manipulador de eventos. Dessa forma, aqueles com JavaScript ativado executarão a função e aqueles com JavaScript desativado irão para uma página apropriada (ou local dentro da mesma página), em vez de apenas clicar no link e não acontecer nada.
fonte
Definitivamente o hash (
#
) é melhor porque no JavaScript é um pseudo-esquema:É claro que "#" com um manipulador onclick que impede que a ação padrão seja [muito] melhor. Além disso, um link com o único objetivo de executar JavaScript não é realmente "um link", a menos que você esteja enviando o usuário para uma âncora sensível na página (apenas # será enviado para o topo) quando algo der errado. Você pode simplesmente simular a aparência do link com a folha de estilo e esquecer o href.
Além disso, em relação à sugestão de cowgod, particularmente esta:
...href="javascript_required.html" onclick="...
Esta é uma boa abordagem, mas não distingue entre os cenários "JavaScript desabilitado" e "falha ao clicar no onclick".fonte
Eu costumo ir
É mais curto que o javascript: void (0) e faz o mesmo.
fonte
Eu usaria:
Razões:
href
mecanismos de pesquisa simples, necessários. Se você usar qualquer outra coisa (como uma string), isso poderá causar um404 not found
erro.return false;
, a página não pula para o topo ou quebra oback
botão.fonte
Eu escolhi usar
javascript:void(0)
, porque isso pode impedir o clique com o botão direito do mouse para abrir o menu de conteúdo. Masjavascript:;
é mais curto e faz a mesma coisa.fonte
Portanto, quando você faz algumas coisas em JavaScript com uma
<a />
tag e, se colocarhref="#"
, também pode adicionar return false no final do evento (no caso de ligação de evento inline) como:Ou você pode alterar o atributo href com JavaScript, como:
ou
Mas semanticamente, todas as formas acima para conseguir isso estão erradas (embora funcione bem) . Se algum elemento não for criado para navegar na página e tiver algumas coisas JavaScript associadas, ele não deverá ser um
<a>
tag.Você pode simplesmente usar a
<button />
para fazer coisas ou qualquer outro elemento, como b, span ou o que for mais adequado, conforme sua necessidade, porque você pode adicionar eventos em todos os elementos.Portanto, há um benefício a ser usado
<a href="#">
. Você obtém o ponteiro do cursor por padrão nesse elemento quando obtéma href="#"
. Por isso, acho que você pode usar CSS para isso comocursor:pointer;
que resolve esse problema também.E, no final, se você estiver vinculando o evento a partir do próprio código JavaScript, poderá fazê
event.preventDefault()
-lo se estiver usando a<a>
tag, mas se não estiver usando um<a>
tag para isso, obterá uma vantagem, você não Não preciso fazer isso.Então, se você vê, é melhor não usar uma tag para esse tipo de coisa.
fonte
Não use links com o único objetivo de executar o JavaScript.
O uso de href = "#" rola a página para o topo; o uso de void (0) cria problemas de navegação no navegador.
Em vez disso, use um elemento que não seja um link:
E estilize-o com CSS:
fonte
span
elemento porque é um elemento não focalizável. É por isso que você precisa de um botão.tabindex="0"
ao intervalo. Dito isto, usar o botão é melhor porque oferece a funcionalidade desejada gratuitamente. Para torná-lo acessível usando um intervalo, você não apenas precisa anexar um manipulador de cliques, mas um manipulador de eventos do teclado que procura pressionamentos de barra de espaço ou tecla enter e, em seguida, aciona o manipulador de cliques normal. Você também deseja alterar o segundo seletor de CSS para,.funcActuator:hover, .funcActuator:focus
para que o fato de o elemento ter foco seja aparente.Seria melhor usar jQuery,
e omita ambos
href="#"
ehref="javascript:void(0)"
.A marcação da marca âncora será como
Simples o suficiente!
fonte
Se você estiver usando o AngularJS , poderá usar o seguinte:
O que não fará nada.
além do que, além do mais
false
com JavaScriptfonte
Se não houver,
href
talvez não haja motivo para usar uma marca de âncora.Você pode anexar eventos (clique, passar o mouse etc.) em quase todos os elementos. Por que não usar apenas a
span
ou adiv
?E para usuários com JavaScript desativado: se não houver um substituto (por exemplo, uma alternativa
href
), eles devem pelo menos não conseguir ver e interagir com esse elemento, seja ele<a>
uma<span>
marca ou uma tag.fonte
Normalmente, você sempre deve ter um link de retorno para garantir que os clientes com JavaScript desativado ainda tenham alguma funcionalidade. Esse conceito é chamado JavaScript discreto.
Exemplo ... Digamos que você tenha o seguinte link de pesquisa:
Você sempre pode fazer o seguinte:
Dessa forma, as pessoas com JavaScript desabilitado são direcionadas
search.php
enquanto seus visualizadores com JavaScript visualizam sua funcionalidade aprimorada.fonte
Eu pessoalmente os uso em combinação. Por exemplo:
HTML
com um pouco de jQuery
ou
Mas estou usando isso apenas para impedir que a página pule para o topo quando o usuário clica em uma âncora vazia. Eu raramente estou usando onClick e outros
on
eventos diretamente em HTML.Minha sugestão seria usar o
<span>
elemento com oclass
atributo em vez de uma âncora. Por exemplo:Em seguida, atribua a função a
.link
um script envolto no corpo e imediatamente antes da</body>
tag ou em um documento JavaScript externo.* Nota: Para elementos criados dinamicamente, use:
E para elementos criados dinamicamente, criados com elementos criados dinamicamente, use:
Em seguida, você pode estilizar o elemento span para parecer uma âncora com um pouco de CSS:
Aqui está um exemplo do jsFiddle acima mencionado.
fonte
Dependendo do que você deseja realizar, você pode esquecer o onclick e apenas usar o href:
Isso evita a necessidade de retornar false. Não gosto da
#
opção porque, como mencionado, levará o usuário ao topo da página. Se você tiver algum outro lugar para enviar ao usuário, se ele não tiver o JavaScript ativado (o que é raro no local onde trabalho, mas é uma boa ideia), o método proposto por Steve funciona muito bem.Por fim, você pode usar
javascript:void(0)
se não deseja que ninguém vá a lugar algum e se não deseja chamar uma função JavaScript. Funciona muito bem se você tem uma imagem na qual deseja que um evento de mouseover aconteça, mas não há nada para o usuário clicar.fonte
Quando tenho vários links falsos, prefiro dar a eles uma classe de 'sem link'.
Em seguida, no jQuery, adiciono o seguinte código:
E para o HTML, o link é simplesmente
Não gosto de usar tags hash, a menos que sejam usadas para âncoras, e só faço o acima quando tenho mais de dois links falsos, caso contrário, uso o javascript: void (0).
Normalmente, eu gosto de evitar o uso de um link e apenas enrolar algo em um intervalo e usá-lo como uma maneira de ativar algum código JavaScript, como um pop-up ou uma revelação de conteúdo.
fonte
Eu acredito que você está apresentando uma falsa dicotomia. Essas não são as únicas duas opções.
Concordo com o Sr. D4V360, que sugeriu que, mesmo que você esteja usando a marca de âncora, você realmente não tem uma âncora aqui. Tudo o que você tem é uma seção especial de um documento que deve se comportar um pouco diferente. Uma
<span>
tag é muito mais apropriada.fonte
a
por umspan
, precisará se lembrar de torná-lo focável via teclado.Eu tentei tanto no google chrome com as ferramentas de desenvolvedor, e
id="#"
demorou 0,32 segundos. Enquanto ojavascript:void(0)
método levou apenas 0,18 segundos. Portanto, no google chrome,javascript:void(0)
funciona melhor e mais rápido.fonte
Estou basicamente parafraseando este artigo prático usando aprimoramento progressivo . A resposta curta é que você nunca usa
javascript:void(0);
ou a#
menos que sua interface com o usuário já tenha inferido que o JavaScript está ativado. Nesse caso, você deve usarjavascript:void(0);
. Além disso, não use span como links, pois isso é semanticamente falso para começar.Usar rotas de URL amigáveis para SEO em seu aplicativo, como / Home / Ação / Parâmetros, também é uma boa prática. Se você tiver um link para uma página que funcione sem JavaScript primeiro, poderá aprimorar a experiência posteriormente. Use um link real para uma página de trabalho e adicione um evento onlick para aprimorar a apresentação.
Aqui está uma amostra. Home / ChangePicture é um link de trabalho para um formulário em uma página completo com interface do usuário e botões de envio de HTML padrão, mas parece melhor injetado em uma caixa de diálogo modal com os botões jQueryUI. De qualquer maneira, dependendo do navegador, o que satisfaz o primeiro desenvolvimento móvel.
fonte