Eu sei que isso é uma má prática. Não escreva códigos como este, se possível.
Obviamente, sempre nos encontraremos em situações em que um snippet inteligente de Javascript embutido pode solucionar um problema rapidamente.
Estou buscando esta consulta no interesse de entender completamente o que acontece (e as possíveis armadilhas) quando algo assim é escrito:
<a href="#" onclick="alert('Hi')">Click Me</a>
Até onde eu sei, isso é funcionalmente o mesmo que
<script type="text/javascript">
$(function(){ // I use jQuery in this example
document.getElementById('click_me').onclick =
function () { alert('Hi'); };
});
</script>
<a href="#" id="click_me">Click Me</a>
Extrapolando disso, parece que a string atribuída ao atributo onclick
é inserida em uma função anônima que é atribuída ao manipulador de cliques do elemento. Este é realmente o caso?
Porque estou começando a fazer coisas assim:
<a href="#" onclick="$(this).next().fadeIn(); return false;">Display my next sibling</a> <!-- Return false in handler so as not to scroll to top of page! -->
O que funciona. Mas eu não sei o quanto isso é um hack. Parece suspeito porque não há nenhuma função aparente que está sendo retornada!
Você pode perguntar, por que está fazendo isso, Steve? JS embutido é uma prática ruim!
Bem, para ser sincero, estou cansado de editar três seções diferentes de código apenas para modificar uma seção de uma página, especialmente quando estou apenas criando um protótipo de algo para ver se funcionará. É muito mais fácil e, às vezes, até faz sentido que o código especificamente relacionado a esse elemento HTML seja definido dentro do elemento: Quando eu decido, 2 minutos depois, que essa foi uma ideia terrível, terrível, eu posso destruir a div inteira (ou qualquer outra coisa) ) e não tenho um monte de mistérios misteriosos de JS e CSS no resto da página, diminuindo a renderização. Isso é semelhante ao conceito de localidade de referência, mas, em vez de erros de cache, estamos observando bugs e inchaço do código.
fonte
#click_me
no evento DOMready ou colocar o script após o nó.document.getElementById("click_me").onclick;
. Ou alerte. Você verá que está em uma função.Respostas:
Você está quase correto, mas não contabilizou o
this
valor fornecido ao código embutido.é realmente mais perto de:
Manipuladores de eventos embutidos definidos como
this
iguais ao destino do evento. Você também pode usar a função anônima no script embutidofonte
event
com um inlineonclick='myFunction(event)'
?O que o navegador faz quando você tem
é definir o valor real de "onclick" para algo efetivamente como:
Ou seja, ele cria uma função que espera um parâmetro "evento". (Bem, o IE não; é mais uma função anônima simples).
fonte
event
para recuperar o evento (e o elemento de origem a partir deleevent.target
), do meu snippet JS embutido! Legal.event
parâmetro, mas se você usarevent
essa função anônima, o IE o entenderá como o objeto de evento real. Como a função anônima é definida como uma propriedade dowindow
objeto no IE, ela será vista comowindow.event
.Parece haver muitas práticas ruins sendo lançadas em torno dos Atributos do Manipulador de Eventos. A prática recomendada é não conhecer e usar os recursos disponíveis onde for mais apropriado. Os atributos do evento são padrões totalmente documentados pelo W3C e não há nada de ruim nas práticas. Não é diferente de colocar estilos em linha, que também é documentado pelo W3C e pode ser útil em alguns momentos. Se você o colocar em tags de script ou não, será interpretado da mesma maneira.
https://www.w3.org/TR/html5/webappapis.html#event-handler-idl-attributes
fonte
bad practice/spaghettification
para alguns égood practice/structure
para outros.A melhor maneira de responder sua pergunta é vê- la em ação.
Nos js
Como você vê no
console
, se você estiver usando o Chrome, ele imprime uma função anônima com o objeto de evento passado, embora seja um pouco diferente no IE.Concordo com alguns de seus pontos de vista sobre manipuladores de eventos em linha. Sim, eles são fáceis de escrever, mas não concordo com o seu ponto de precisar alterar o código em vários locais; se você estruturar bem o seu código, não precisará fazer isso.
fonte
<button onclick="login()"> test login </button>
é perfeitamente adequado para prototipagem. Você deseja testar algo que exija interação do usuário no momento e só o excluirá mais tarde. Por que escrever código extra em todo o lugar?É uma função anônima que foi anexada ao evento click do objeto.
Por que diabos você está doi ... Ah, deixa pra lá, como você mencionou, é realmente uma prática ruim amplamente adotada :)
fonte
Tente isso no console:
No Chrome, mostra o seguinte:
... e a
name
propriedade não padrão dediv.onclick
é"onclick"
.Portanto, se isso é ou não anônimo, depende da sua definição de "anônimo". Compare com algo como
var foo = new Function()
, ondefoo.name
é uma string vazia, efoo.toString()
produzirá algo comofonte