[HTML/JS] Neuladen erzwingen

M

Mr. Snoot

Gast
Hio,

ich habe eine Seite mit einem Eingabefeld, welches einen absolut einmaligen Namen haben muss. Dazu hänge ich dem Feldnamen einfach den aktuellen Timestamp hinten dran.

Problem: wenn man das Formular abgeschickt hat, und mit der Zurückfunktion des Browsers zu der Seite zurückkehrt, kommt die Seite aus dem Cache und das Feld hat noch den alten Timestamp im Namen.

Wie erreiche ich, dass dort in jedem Fall der Timestamp aktuell ist; evtl. über JS? Wichtig: ich brauche den Timestamp an mehreren Stellen im Code.

Ich hab zwar einen Meta-Tag gefunden, der cachen unterbinden soll, aber das zeigt keine Wirkung:
HTML:
<meta http-equiv="cache-control" content="no-cache">

Hintergrund: ich will verhindern, dass sich der Browser die Eingabe merkt, ohne autocomplete="off" zu verwenden, da das nicht HTML-valid ist. Wenn der Feldname unbekannt = neuer Timestamp ist, kann sich der Browser auch nichts merken.
 
Zuletzt bearbeitet:
Arbeitest du mit PHP?
Dann könnest du doch die Timestamp beim abspeichern hinzufügen. Diese kann dann nie wiederholt auftreten.

Ansonsten bleibt noch Ajax übrig um zu prüfen ob der Name bereits schon verwendet wurde.
Oder mit Ajax die Zeit aktuell immer einfügen lassen.

Aber ganz ehrlich: Wirklich verstanden was du willst, bzw. damit erreichen erhoffst verstehe ich nicht.
 
Zuletzt bearbeitet:
Code:
<meta http-equiv="expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

Dein Meta-Tag ist - wenn man SelfHTML glauben schenken darf - nicht "offiziell": http://de.selfhtml.org/html/kopfdaten/meta.htm

@Eagle-PsyX-: Das Feld soll einen eindeutigen Namen haben, nicht der Inhalt...
 
Zuletzt bearbeitet:
Das mit dem Header funktioniert immer nur bedingt.

Für den PHP-Header kannst du auch einige Befehle nutzen um das Caching zu unterdrücken (doch die volle Kontrolle hast du nie):
PHP:
	header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
	header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
	header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
	header("Cache-Control: no-store, no-cache, must-revalidate");
	header("Cache-Control: post-check=0, pre-check=0", false);
	header("Pragma: no-cache");
oder noch in HTML:
HTML:
		<meta http-equiv="pragma" content="no-cache" />

P.S.: Die vorher genannten HTML-Tags von euch habe ich hier rausgeholt.
 
hi!
häng den Timestamp beim PHP Code dran.
Wenn du den timestam unbedingt bei der HTML Seite brauchst dann mach einen onClick event beim button und hängs dort an.

BTW muss es die ID sein? Kannst du nicht andere Attribute nehmen?
bzw. wozu brauchst du es, was willst du genau machen'?

mfg
 
@ timurinamanu:
Mr. Snoot schrieb:
Hintergrund: ich will verhindern, dass sich der Browser die Eingabe merkt, ohne autocomplete="off" zu verwenden, da das nicht HTML-valid ist. Wenn der Feldname unbekannt = neuer Timestamp ist, kann sich der Browser auch nichts merken.

Ich brauche den Timestamp also einmal als Feldnamen und einmal als Value in einem hidden-Field, damit ich den Timestamp ans nächste Script übergeben kann. Denn das Script muss ja über den Timestamp = Feldname auf das eigenliche Feld zugreifen können.

  • Formular:
    HTML:
    <input type="text" name="v1234567890" value="eingabe">
    <input type="hidden" name="timestamp" value="v1234567890">
  • Script:
    PHP:
    $timestampe = $_POST['timestamp'];
    $eingabe = $_POST[$timestamp];
Eure genannten Codes funktionieren leider auch nicht.
 
Also ich glaube den anderen geht es wie mir, dass sie den Sinn dahinter nicht verstehen...

Vielleicht wäre es gut, zu erklären, warum das ganze so sein muss... also warum müssen die Timestamps sein? Für mich sieht es so aus als seien Timestamps eine Lösung für ein Problem A, aber verursacht Problem B... du fragst jetzt nach ner Lösung für Problem B, aber vielleicht wäre es ja eleganter, A anders zu lösen...

Edit:
"wenn man das Formular abgeschickt hat, und mit der Zurückfunktion des Browsers zu der Seite zurückkehrt"
das Problem is halt, dass man gegen das Zurück echt wenig machen kann... und alles was du in JS realisierst würde sich halt auch problemlos aushebeln lassen...

Das einzige, was meiner Meinung nach funktionieren würde ist, dass der Timestamp vom JS erzeugt wird... dass dein Script die Feldbezeichnung nach dem Laden festlegt und eben ins hidden-feld legt...
Aber da solltest du auf jeden Fall eine Fall-Back-Einstellung haben, falls JS deaktiviert ist... (also standard-werte für name und hidden-feld)

Die Frage im Übrigen ist auch, ob das hidden-feld überhaupt nötig ist... du könntest auch bezeichner machen wie 'name-12343242" und dann suchst du in $POST halt nach dem Eintrag, wo der Schlüssel mit name beginnt... wobei das an sich keine großen Vorteile bringt, ja...
 
Zuletzt bearbeitet:
Ich brauche einfach bei jedem Seitenaufruf einen einmaligen Namen für das Textfeld - das muss nicht der Timestamp sein, das kann auch sowas wie ZUHNBCVXCHSD sein.

Die meisten Browser merken sich ja Texteingaben und bieten diese später wieder zur Auswahl an. Das funktioniert, solange das Feld den gleichen Namen hat. Ich muss verhindern, dass sich der Browser die Eingabe merkt, also möchte ich dem Feld bei jedem Seitenaufruf einen einmaligen Namen geben.

HTML-seitig gibt es zwar das Attribut autocomplete (mit dem Wert off), das ist aber nicht standardisiert (erst ab HTML 5).

(Es gäbe zwar noch eine autocomplete-Variante über Javascript, aber das ist nur ein billiger Trick um den HTML-Code valide zu machen)
 
Zuletzt bearbeitet:
hi nochmal,

Du kannst es so machen:

Wenn du z.B.
<input type="text" name="v1234567890" value="eingabe" id="FormularId" onClick="function(){
var d=new Date();
document.getElementById("FormularId").id="deineId"+d.getTime();}
">

Du kannst natürlich auch onKeyDown onMouseOver etc. benützen.

ps ich weiss nicht ob die Syntax bei den Events ganz richtig ist, das kannst aber ganz leicht nachgucken :)

mfg
 
@timurinamanu: Ich versteh nur nicht warum die bei "onClick" oder einem vergleichbaren Event aufgerufen werden soll und nicht etwa, wenn beispielsweise das DOM fertig ist...

@Mr. Snoot: Hast du das gelesen?
Das einzige, was meiner Meinung nach funktionieren würde ist, dass der Timestamp vom JS erzeugt wird... dass dein Script die Feldbezeichnung nach dem Laden festlegt und eben ins hidden-feld legt...
Aber da solltest du auf jeden Fall eine Fall-Back-Einstellung haben, falls JS deaktiviert ist... (also standard-werte für name und hidden-feld)
(geht vom Ansatz her in die Richtug von timarinumanu)

Wobei bei beiden Varianten das Problem ist, dass das Auto-Complete die Felder evtl schon gefüllt hat, noch bevor die IDs geändert wurden... da müsstest du dann sicherheitshalber die Felder auch noch via JavaScript leeren...

Aber klar, JavaScript kann umgangen werden, deshalb würde ich das bisherige Verfahren mit dem hier ergänzen...
 
Zuletzt bearbeitet:
Wenn sich jemand ganz ganz ganz dolle vorgenommen hat die Felder vorfüllen zu lassen ist es kein Problem die Felder im HTML Code ausfindig zu machen, ist ja eine Recht schöne Baum strucktur.
JavaScript lässt sich leider auch deaktivieren und dann wäre alle mühe ebenfalls vergebens.

Außerdem kann ein Browser angaben des headers ignorieren, wenn er es wollen würde.

Was du aber machen könntest wäre ein Pseudo Textfeld, z.B. ein Leeres Div oder readonly/disabled Textfield.
Wenn man dort Raufklickt und dann in die tasten Hämmert füllt ein Script den Inhalt, aber nicht der Browser.
Oder direkt ein Java Applet :freak: (joke)
 
@1668mib

Soweit ich verstanden habe, will er vermeiden, dass die Einbaben angezeigt werden, wenn jemand auf den zurück button klickt. Also braucht er irgendeine JavaScriptmäßige manipulation, weil er denselben dom lädt, wenn man zurück drückt.

@Threadersteller
mach einfach ein event, wenn der User über das Feld die Maus bewegt und nenn die ID um, sollte hinhauen, ist aber nicht schön ....

mfg
 
Richtig, wenn jemand "zurück" drückt... aber deshalb versteh ich ja gerade deine Events nicht. Wenn ich im Browser zurückgehe dann habe ich noch nichts mit dem Formular gemacht also wie soll dann ein onClick- oder ähnliches Event helfen? Wie willst du sicherstellen, dass diese Events geworfen werden? Es bleibt in dem Fall nur ein Event vom Schlag "onLoad"...

@Mercsen: Das Problem an den Pseudo-Feldern ist, dass diese sich halt immer komisch anfühlen - finde ich zumindest...

@Mr. Snoot: Warum darf denn der Text nicht mehr drinstehen?
 
Der Text darf schon drinstehen bleiben, aber der Browser darf sich den Text nicht merken, da sonst das Vorschlagsfeld vom Browser (also die Eingaben des Benutzers) meine Vorschlagsliste verdeckt.
suggest.png


Ich kann mir ja mit JS auch den Timestamp ausgeben lassen; das scheint auch problemlos korrekt zu funktionieren, wenn man mit Zurück auf die Seite zurückkehrt. Müsste ich ja auch via .value und .name an meine beiden Felder übergeben können, oder? (test ich heute Abend)


Wenn der Besucher JS deaktiviert hat, funktioniert meine Vorschlagsliste sowieso nicht, dann ist das hinfällig.
 
Mr. Snoot schrieb:
[...] (test ich heute Abend)
Wenn der Besucher JS deaktiviert hat, funktioniert meine Vorschlagsliste sowieso nicht, dann ist das hinfällig.

Jetzt endlich verstehen wir was du wirklich willst :-D

Teste es mal und sag uns Bescheid.
Ja klar, Ajax kann ohne JavaScript nicht funktionieren (wie der Name drauf schließen lässt).
 
Irgendwie steh ich gerade total am Schlauch.

Wieso kann ich nicht mit document.getElementById('suche_eingabe') auf das Eingabefeld zugreifen? Bekomme hier immer einen Fehler ala document.getElementById('suche_eingabe') is null :confused_alt:
 
Hab das einfach so im <head> stehen; oder alternativ aufgerufen mit <body onload="">.
PHP:
<script type="text/javascript">
  var zeit = "s_" + new Date();
  document.getElementById('suche_eingabe').name = zeit;
  document.getElementById('time').value = zeit;
</script>
 
Zurück
Oben