Recarregar uma página via Ajax quando window.Location = self.location não funciona
-
05-07-2019 - |
Pergunta
Na minha página inicial, recebi:
<ul id="login">
<li> <a id="loginswitch" href="./login-page">log-in</a> | </li>
<li> <a id="signupswitch" href="./signup-page">sign-up</a> </li>
</ul>
Via Mootools, eu recebo esses elementos de âncora por ID para que, uma vez que eles clicados, uma div de maneira chamativa apareça abaixo deles que contém o formulário de login ou inscrição (com métodos para interromper a propagação de eventos, é claro) e, ao preencher o Fields A chamada do Ajax entra em ação-que deveria criar uma sessão e recarregar a página para que o usuário tenha um visual de que ele agora está conectado e os controlos de nível de usuário aparecem etc.
A chamada do Ajax é iniciada pela classe Mootools Ajax e evalScripts
a opção está definida como true. A página do Ajax retorna o código do script:
<script type="text/javascript">window.location = self.location;</script>
Este sistema funciona perfeitamente - agora estou me perguntando por que se eu mudar as âncoras ' href
valores para href="#"
Meus scripts não funcionam mais?
Tem algo a ver com a janela?
Ele mudou sua propriedade quando cliquei em um link ou mais, mesmo quando a propagação do evento foi interrompida?
Solução
window.location = self.location;
Este javascript está executando.
Quando ele é executado, o navegador está sendo instruído a substituir o valor da janela.Location por um novo valor. Nem todos os navegadores reagirá da mesma maneira aqui. Alguns provavelmente funcionarão como você espera, mas outros ficarão inteligentes e compararão os dois valores. O navegador sabe Em que página está, e sabe que você está apenas pedindo para ir para a mesma página.
Cache do navegador
O navegador ainda tem uma cópia da sua página atual em cache. Ele pode conversar com o servidor e perguntar se a página que possui no cache ainda é válida. Se o cache for válido, pode decidir não forçar uma recarga da página. Nos bastidores, isso acontece com os cabeçalhos HTTP. Navegadores e servidores podem se comunicar sobre o HTTP de várias maneiras. Nesse caso, seu navegador envia uma solicitação rápida ao servidor dizendo algo assim:
GET /stackoverflow.com/posts/196643/index.html
HTTP/1.1
Host: www.stackoverflow.com
User-Agent: Mozilla/5.0
If-Modified-Since: Sun, 12 Oct 2008 20:41:31 GMT
Isso é chamado de solicitação condicional de obter. Dizendo Se modificado-uma vez, seu navegador está dizendo: "Dê -me esse arquivo, mas apenas se tiver sido modificado desde a última vez que o vi".
Para encurtar a história, você não disse explicitamente ao navegador para recarregar a página.
Veja como você pode:
location.reload( true );
O "verdadeiro" é um parâmetro opcional, por forçando uma recarga. O navegador nem sequer olha para o cache. Isso fará o que você diz.
Outras dicas
Indo para uma âncora em uma página - que é o que #
significa - não requer uma recarga.
Se eles me entregassem essa tarefa específica no trabalho, eu o chutaria de volta ao design. A menos que estejamos falando de uma página segura ou de um login OpenID, você não deve exibir um formulário de login ou login. Os usuários precisam aprender a procurar isso HTTPS: na parte superior da página e nunca se inscreva se não a virem.