Ricaricare una pagina tramite AJAX quando window.location = self.location non funziona
-
05-07-2019 - |
Domanda
Sulla mia homepage ho ricevuto:
<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>
Tramite MooTools, ottengo questi elementi di ancoraggio per id in modo che una volta cliccato, un div appariscente si aprirà sotto di essi che contenga il modulo di accesso o di iscrizione (con metodi per interrompere la propagazione degli eventi ovviamente) e al momento della compilazione dei campi entra in gioco la chiamata AJAX - si suppone che crei una sessione e ricarichi la pagina in modo che l'utente abbia una visuale che ora è loggato e compaiano controlli a livello di utente ecc.
La chiamata ajax è iniziata dalla classe AJAX MooTools e l'opzione evalScripts
è impostata su true. La pagina AJAX restituisce il codice dello script:
<script type="text/javascript">window.location = self.location;</script>
Questo sistema funziona perfettamente - ora mi chiedo perché se cambio i valori href
delle ancore in href = " # "
i miei script non funzioneranno più?
Ha qualcosa a che fare con la finestra?
Ha cambiato la sua proprietà quando ho fatto clic su un collegamento o giù di lì anche quando la propagazione dell'evento è stata interrotta ??
Soluzione
window.location = self.location;
Questo javascript è in esecuzione .
Quando viene eseguito, viene chiesto al browser di sostituire il valore di window.location con un nuovo valore. Non tutti i browser reagiranno allo stesso modo qui. Alcuni probabilmente funzioneranno come previsto, ma altri diventeranno intelligenti e confronteranno i due valori. Il browser sa su quale pagina si trova e sa che lo stai semplicemente chiedendo di andare alla stessa pagina.
Cache del browser
Il browser ha anche una copia della tua pagina corrente nella cache . Può parlare con il server e chiedere se la pagina che ha nella cache è ancora valida. Se la cache è valida, potrebbe decidere di non forzare un ricaricamento della pagina. Dietro le quinte, questo accade con le intestazioni HTTP. Browser e server possono comunicare su HTTP in molti modi. In questo caso, il tuo browser invia una rapida richiesta al server dicendo qualcosa del genere:
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
Questa è chiamata richiesta GET condizionale . Dicendo If-Modified-Since , il tuo browser sta dicendo " Dammi quel file, ma solo se è stato modificato dall'ultima volta che l'ho visto. & Quot;
Per farla breve, non hai detto esplicitamente al browser di ricaricare la pagina.
Ecco come puoi:
location.reload( true );
Il " true " è un parametro opzionale , per forzare una ricarica . Il browser non guarderà nemmeno la cache .. Farà solo come dici tu.
Altri suggerimenti
Andare a un'ancora su una pagina - che è ciò che significa #
- non richiede un ricaricamento.
Se mi avessero affidato questo particolare compito al lavoro, lo avrei restituito al design. A meno che non si tratti di una pagina protetta o di un accesso OpenID, non è necessario visualizzare un modulo di accesso o di accesso. Gli utenti devono imparare a cercare quel https: nella parte superiore della loro pagina e non accedere mai se non lo vedono.