2008-10-08 6 views
9

Auf meiner Homepage funktioniert Ich habe:eine Seite über AJAX Nachladen, wenn window.location = self.location nicht

<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, ich diese Ankerelemente von ID erhalten, so dass, wenn sie angeklickt sind , erscheint ein auffälliges div unter ihnen, das das Anmelde- oder Anmeldeformular enthält (mit Methoden, um die Weitergabe von Ereignissen zu stoppen) und nach dem Auffüllen der Felder tritt der AJAX-Aufruf ein - das soll eine Sitzung erstellen und die neu laden Seite, so dass der Benutzer eine visuelle haben würde, dass er jetzt angemeldet ist und Benutzer-Level-Kontrollen usw. angezeigt wird.

Der Ajax-Aufruf ist Initia von der MooTools AJAX-Klasse und evalScripts Option wird auf True festgelegt. Die AJAX-Seite gibt den Script-Code:

<script type="text/javascript">window.location = self.location;</script> 

Dieses System funktioniert perfekt - jetzt frage ich mich, warum, wenn ich die href Werte Anker ändern href="#" meine Skripte nicht mehr funktionieren?

Hat es etwas mit dem Fenster zu tun?

Hat es seine Eigenschaft geändert, als ich auf einen Link geklickt habe oder so, selbst wenn die Übertragung des Ereignisses gestoppt wurde?

Antwort

20
window.location = self.location; 

Dieses Javascript ausgeführt wird.

Wenn es ausgeführt wird, wird der Browser aufgefordert, den Wert von window.location durch einen neuen Wert zu ersetzen. Nicht alle Browser werden auf die gleiche Weise hier reagieren .. Einige werden wahrscheinlich so funktionieren, wie Sie es erwarten, aber andere werden schlau und vergleichen die beiden Werte. Der Browser weiß welche Seite es ist, und es weiß, dass Sie nur darum bitten, auf die gleiche Seite zu gehen.

Browser-Cache

Der Browser selbst eine Kopie der aktuellen Seite in Cache hat. Es kann mit dem Server sprechen und fragen, ob die Seite im Cache noch gültig ist. Wenn der Cache gültig ist, kann er entscheiden, ein erneutes Laden der Seite nicht zu erzwingen. Hinter den Kulissen geschieht dies mit HTTP-Headern. Browser und Server können auf verschiedene Arten über HTTP kommunizieren. In diesem Fall sendet Ihr Browser eine schnelle Anfrage an den Server sagen, so etwas wie diese:

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 

Diese eine bedingten GET-Anfrage genannt wird. Mit den Worten If-Modified-Since sagt Ihr Browser: "Gib mir diese Datei, aber nur, wenn sie seit dem letzten Mal, als ich sie gesehen habe, geändert wurde."

Lange Rede, kurzer Sinn, Sie haben dem Browser nicht ausdrücklich gesagt, die Seite neu zu laden.

Hier ist, wie können Sie:

location.reload(true); 

Die "true" ist ein optionaler Parameter , für zwingt einen Reload. Der Browser wird nicht einmal auf den Cache schauen. Es wird nur tun, was Sie sagen.

+0

wow ein JS-Guru, vielen Dank dafür schulde ich dir einen Donut und etwas Kaffee :) – lock

+0

Was ist, wenn Sie eine Beitragsvariable einstellen und danach auffrischen möchten? Ich andere Wörter, wie man das Nachladen mit einer Postvariable ändert, die geändert wird? Vielen Dank – artaxerxe

1

Zu einem Anker auf einer Seite gehen - was bedeutet - erfordert kein erneutes Laden.

0

Wenn sie mir diese bestimmte Aufgabe bei der Arbeit übergeben würden, würde ich es zurück zum Design kicken. Sofern wir nicht über eine sichere Seite oder eine OpenID-Anmeldung sprechen, sollten Sie kein Anmelde- oder Anmeldeformular aufrufen. Benutzer müssen lernen, nach dem https zu suchen: am Anfang ihrer Seite, und melden Sie sich nie an, wenn sie es nicht sehen.

Verwandte Themen