Qual é o propósito (se houver) de “javascript:” nas tags do manipulador de eventos?
-
09-06-2019 - |
Pergunta
Ultimamente, tenho feito um esforço conjunto para melhorar minhas habilidades em javascript, lendo o máximo de código javascript que posso.Ao fazer isso, às vezes vejo o javascript:
prefixo anexado à frente dos atributos do manipulador de eventos em tags de elementos HTML.Qual é o propósito deste prefixo?Basicamente, existe alguma diferença apreciável entre:
onchange="javascript: myFunction(this)"
e
onchange="myFunction(this)"
?
Solução
Provavelmente nada no seu exemplo.Meu entendimento é que javascript:
é para tags âncora (no lugar de um real href
).Você o usaria para que seu script pudesse ser executado quando o usuário clicar no link, mas sem iniciar uma navegação de volta à página (que é um espaço em branco href
juntamente com um onclick
vai fazer).
Por exemplo:
<a href="javascript:someFunction();">Blah</a>
Em vez de:
<a href="" onclick="someFunction();">Blah</a>
Outras dicas
Não deve ser usado em manipuladores de eventos (embora a maioria dos navegadores trabalhe defensivamente e não irá puni-lo).Eu também argumentaria que não deveria ser usado no atributo href de uma âncora.Se um navegador suportar javascript, ele usará o manipulador de eventos definido corretamente.Se um navegador não funcionar, um javascript:o link aparecerá quebrado.IMO, é melhor encaminhá-los para uma página explicando que eles precisam habilitar o javascript para usar essa funcionalidade, ou melhor ainda, uma versão da funcionalidade necessária que não seja javascript.Então, algo como:
<a href="non-ajax.html" onclick="niftyAjax(); return false;">Ajax me</a>
Editar:Pensei em um bom motivo para usar javascript:.Marcadores.Por exemplo, este envia você ao Google Reader para visualizar os feeds RSS de uma página:
var b=document.body;
if(b&&!document.xmlVersion){
void(z=document.createElement('script'));
void(z.src='http://www.google.com/reader/ui/subscribe-bookmarklet.js');
void(b.appendChild(z));
}else{
location='http://www.google.com/reader/view/feed/'+encodeURIComponent(location.href)
}
Para que um usuário adicione facilmente este Bookmarklet, você deve formatá-lo assim:
<a href="javascript:var%20b=document.body;if(b&&!document.xmlVersion){void(z=document.createElement('script'));void(z.src='http://www.google.com/reader/ui/subscribe-bookmarklet.js');void(b.appendChild(z));}else{location='http://www.google.com/reader/view/feed/'+encodeURIComponent(location.href)}">Drag this to your bookmarks, or right click and bookmark it!</a>
Deve ser usado apenas na tag href.
Isso é ridículo.
A forma aceita é esta:
<a href="/non-js-version/" onclick="someFunction(); return false">Blah</a>
Mas para responder ao OP, geralmente não há razão para usar javascript:
não mais.Na verdade, você deve anexar o evento javascript do seu script, e não inline na marcação.Mas isso é uma coisa purista, eu acho :-D
As origens de javascript:
em um manipulador de eventos é, na verdade, apenas uma coisa específica do IE, para que você possa especificar o idioma além do manipulador.Isto é porque vbscript
também é uma linguagem de script do lado do cliente suportada no IE.Aqui está um exemplo de "vbscript:".
Em outros navegadores (como foi dito por Shadow2531) javascript:
é apenas um rótulo e é basicamente ignorado.
href="javascript:..."
pode ser usado em links para executar código javascript, como aponta DannySmurf.
javascript:no código JS (como em um atributo onclick) é apenas um rótulo para uso com instruções de rótulo continue/goto que podem ou não ser suportadas pelo navegador (provavelmente em nenhum lugar).Poderia ser zipzambam:em vez de.Mesmo que o rótulo não possa ser usado, os navegadores ainda o aceitam, portanto não causa erro.
Isso significa que se alguém estiver jogando um rótulo inútil em um atributo onclick, provavelmente não sabe o que está fazendo e está apenas copiando e colando ou fazendo isso por hábito de fazer o que está abaixo.
javascript:no atributo href significa um URI Javascript.
javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B
Não sou autoridade em JavaScript e talvez seja mais burro do que quem pergunta, mas AFAIK, a diferença é que o javascript:
prefixo é preferido/obrigatório em contextos de URI, onde o argumento pode ser tanto uma URL HTTP tradicional quanto um gatilho JavaScript.
Então, minha resposta intuitiva seria que, já que onChange
espera JavaScript, o javascript:
prefixo é redundante (se não totalmente errôneo).Você pode, no entanto, escrever javascript:myFunction(this)
na sua barra de endereço e essa função é executada.Sem o javascript:
, seu navegador tentaria interpretar myFunction(this)
como uma URL e tenta buscar as informações de DNS, navegar até esse servidor, etc.
Isso é ridículo.
Não, não é ridículo, javascript:é um pseudoprotocolo que só pode ser usado como objeto de um link, então ele está certo.Sua sugestão é realmente melhor, mas a melhor maneira de todas é usar técnicas de javascript discretas para iterar elementos HTML e adicionar comportamento programaticamente, conforme usado em bibliotecas como jQuery.
Basicamente, existe alguma diferença apreciável entre:
onchange="javascript: myFunction(this)"
eonchange="myFunction(this)"
?
Supondo que você quis dizer href="javascript: myFunction(this)"
, sim, existe, especialmente ao carregar conteúdo usando javascript.Usando o javascript:O pseudoprotocolo torna o conteúdo inacessível para alguns humanos e todos os mecanismos de pesquisa, enquanto usar um href real e depois alterar o comportamento do link usando javascript torna o conteúdo acessível se o javascript estiver desativado ou não disponível no cliente específico.
Flubba:
Uso de javascript:
em HREF
quebra "Abrir em nova janela" e "Abrir em nova guia" no Firefox e em outros navegadores.
Não é "errado", mas se você quiser dificultar a navegação no seu site...
Eu não sei se o javascript:
prefixo significa qualquer coisa dentro do onevent
atributos, mas sei que eles são irritantes nas tags âncora ao tentar abrir o link em uma nova guia.O href
deve ser usado como uma alternativa e nunca para anexar javascript aos links.