Manipulação do navegador Nativo Clique antes do DOM: Carregado
-
11-07-2019 - |
Pergunta
Eu tenho um problema com eventos nativos de navegador cruzado versus eventos de retorno de chamada.
Eu tenho um link html "clique em mim" com um dado href=""
. Sobre dom:loaded
Anexo uma função a este link (para fazer coisas de Ajax).
O código JavaScript é carregado no final da página para seguir as recomendações da YSLOW.
Questão:
Se você carregar esta página muito rapidamente (pressionando F5), clique no link, então
- a
alert()
não é chamado - O link é seguido (recarregando a página)
Isso acontece quando o servidor fica lento. De fato, a página não terminou de carregar e o navegador executa o código.
Demonstração:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
</head>
<body>
<a href="#toolate" id="action">Click Me</a>
<!-- According to YSlow Recommandation load at the bottom -->
<script src="../js/lib/prototype.js" type="text/javascript" language="JavaScript"></script>
<script>
/* <![CDATA[ */
document.observe('dom:loaded', function() {
$('action').observe('click', function(event){ alert("click"); Event.stop(event); });
});
/* ]]> */
</script>
</body>
</html>
Inversão de marcha:
Uma virada é adicionar onClick="return false;"
:
<a href="#toolate" id="action" onClick="return false;">Click Me</a>
Funciona para atrasos, mas não para clicar rápido. E eu não gosto desse tipo de virar porque meu objetivo é remover o onclick
em todos <a href="">
Cumprimentos
Solução 2
Fizemos muitos testes em nossos CMs em muitos navegadores.
Classificado por velocidade:
- JavaScript não pode executar antes de um clique muito rápido
- OnClick = "Return false" funciona bem na maioria dos casos
- JavaScript fazendo 2.) Onload é muito lento, mas pode ser suficiente
- Div usando como Shield traz outros problemas e não é uma boa escolha
Outras dicas
Você pode investigar isso:
O JQuery tem uma pequena função útil que inicia o seu JavaScript assim que o modelo de objeto de documento estiver pronto ... o que acontece antes que a página termine de carregar.
$(document).ready(function(){ //
Your code here...
});
Você também pode colocar uma grande div deficiente na frente de tudo enquanto a página está carregando para proibir o clique, mas eu não recomendaria.
Não tenho certeza se acertei sua pergunta, me avise se não
Parece que você tem coisas muito bem em mãos, e tudo o que você deseja fazer é criar alguns links que fazem nada em áreas onde a degradação graciosa não é possível.
Nesses casos, sugiro um vínculo com o seguinte formato:
<a href="javascript:void(0);">Linktext</a>
Este link deve funcionalmente não fazer absolutamente nada com o JavaScript ativado ou desativado.
Anotações importantes
- O número zero no vazio é absolutamente necessário. O Internet Explorer reclamará de outra forma.
- O uso de "JavaScript: void (0);" é fortemente desencorajado pela Microsoft porque coisas estranhas podem acontecer. Para evitar a maioria dos bugs, não envolva nada além de texto em seus links vazios (0).
- Antes de tomar uma decisão, considere cuidadosamente se adicionar "JavaScript: void (0);" é realmente uma solução melhor do que adicionar um OnClick que retorna falsa.
Ao remover o atributo href:
A remoção do atributo href de um link é válida xhtml. Apesar de ser XHTML válido, seu link perderá seu estilo de link automático. Chega de sublinhado, não há mais cores, não mais pairam, e não há mais mudança de cor automática se o link for visitado.
Você não pode corrigir a falta de estilos com CSS devido ao suporte irregular de: Passe o Mirse no Internet Explorer.