Manueller reload der Seite != window.reload?

Liebe/-r Experte/-in,
ich habe ein kleines Problem.
Folgender Ablauf:

Seite1-> ruft popup auf
Im popup formular mit 2 radios
als form action habe ich eine Seite2.php
Seite2 macht ua ein Datenbankupdate und daher muss die Seite1 reloaded werden.
Und nun zu meinem Problem: Mach eich manuell über den butto ein relaod im Browser ists genau so wie ichs haben möchte. Löse ich ein relaod via

 setTimeout("top.document. location.reload();",2\*1000);

macht er im Prinzipnur eine Weiterleitung auf die Hauptseite. Dabei gehen alle variablen verloren, die vorher im hiddenfeld gesetzt waren.

Wie kann ich das verhindern? Anbei etwas Code:

  
Seite1  
...  
  
[  
](javascript:openURLWindow('emailoderdrucken_test.php?id=<?php%20echo%20%24ausgabe_einsaetze%5B'einsatz_id'%5D;?>'))  
  
...  
  
Seite2  
  
 function ende()  
 {  
 //setTimeout( "window.parent.reload();", 2\*1000 );  
 setTimeout("top.document. location.reload();",2\*1000);  
  
  
 }  
  
  
  
  
Speichern/Email:smiley:rucken:   
  
  
...  

Alternativ ginge noch ein submit des Hauptformulars. Danke für eure Mühe / Hilfe! Ach ja, ein simples close_window geht nicht, da das ganze übermootools realisiert ist und quasi ein iframe ist…

I don’t know php, so I didn’t look through all your code. But here some general comments:

  • Don’t use timeouts, refresh when necessary.
  • If the popup is modal, include a return value that you check in the main window to know if you need to refresh.
  • Because both windows are directly connected, you can pass pointers to each other (or access with ‚parent‘ or so). Then just call a ‚RefreshMe‘ js function in the other window.

I hope this helps a bit.

Hi Oliver,

so wie sich das anhört ist das Kernproblem, dass du bereits getätigte Eingaben in der Hauptseite behalten willst, dabei aber die Seite trotzdem neu laden willst. Hierzu sehe ich derzeit zwei Möglichkeiten:
Die kompliziertere wäre, jedes Formularfeld der Seite mit einem onchange zu versehen, dass die aktuelle Eingabe für das Feld in die Session schreibt. Beim Reload musst du dann allerdings auch noch abfragen ob was in der Session ist und die Felder vorbelegen.

Einfacher wäre es, mit dem absenden des Popups in der öffnenden Seite das Formular abzuschicken. Dabei könntest du durch das absenden des Popups auch noch einen zusätzlichen Wert im Formular setzen, der beim neu laden signalisiert, dass vorher das Popup abgeschickt wurde. Eine Fehlerprüfung, die per Default auf das Formular gemacht wird könntest du in abhängigkeit von diesem Feld dann unterdrücken.

Einen reinen Reload, der die Eingaben behält, gibt es in der Form meines Wissens nicht auf JS-Basis. Das macht beim Refresh per Browser-Button der Browser von sich aus.

Bei Fragen kannst du dich gerne nochmal melden.

Gruß, Björn

I don’t know php, so I didn’t look through all your code. But here some general comments:

  • Don’t use timeouts, refresh when necessary.
  • If the popup is modal, include a return value that you check in the main window to know if you need to refresh.
  • Because both windows are directly connected, you can pass pointers to each other (or access with ‚parent‘ or so). Then just call a ‚RefreshMe‘ js function in the other window.

I hope this helps a bit.

EDIT: Ups, habe gerade gesehen, dass hier alles deutsch ist. Sorry, hoffe du verstehst mich trotzdem.

Hallo Oliver,

das Popup ist ein IFrame oder wie? Prinzipiell kann man von Popup-Fenstern (mit window.open() geöffnet) aus auf das Elternfenster (welches das Popup geöffnet hat) über window.opener zugreifen und erhält das window-Objekt des Elternfensters. Wenn diese Popup aber bei dir gar keins ist, sondern ein IFrame (jedenfalls habe ich das deinem letzten Satz entnommen), geht das natürlich nicht.

Das Anstoßen des Reloads scheint aber nicht dein Problem zu sein, sondern eher, dass die Formulardaten, mit denen Seite 1 ursprünglich aufgerufen wurden, beim Reload nicht mehr übermittelt werden und die Seite 1 damit wertlos wird. Hab ich das richtig verstanden?

Wenn ja, dann hast du drei Möglichkeiten:

  1. Das Formular auf Seite 1 abschicken, wie du selbst schon sagtest.
  2. Eine Session benutzen (du arbeitest ja ofenbar sowieso mit PHP), damit beim Reload die Daten aus der Session ausgeliefert werden können.
  3. AJAX benutzen, um im Hintergrund Aktionen anzustoßen und nur die Änderungen an Seite 1, die sich daraus ergeben, per XML oder JSON übertragen. Im onreadystatechange-Callback kannst du diese Änderungen dann per DOM-Manipulation in das bestehende Dokument einarbeiten.

Wichtig: AJAX ist ohne weiteres nicht barrierefrei und bei Benutzern mit deaktiviertem oder nicht verfügbarem JavaScript wird es nicht funktionieren. Allerdings würde es das jetzt auch nicht, wegen der Popup- und Mootools-Geschichten.

Gruß,

Amica

Probier es mal mit dem Parameter „true“, also mit

parent.window.reload(true)  

Das müsste das gleiche Ergebnis wie mit manuellem Reload ergeben. In beiden Fällen kommt die Seite vom Server und nicht vom Cache.

Gruß
Murat

Hallo Oliver,

ich würde das so lösen:

Seite 2 ist von Anfang an eine php-seite und füllt alle hidden-felder per php falls sie per POST übergeben werden. Wenn nicht, dann eben nicht. Beim Abschicken der Seite wird die Datenbank aktualisiert und anschließend per POST die ursprüngliche Seite wieder aufgerufen. Die Aktualisierung erfolgt nun automatisch (durch PHP) und alle Variablen sind auch wieder da, weil sie vom PHP per POST übergeben wurden.

Viele Grüße,

Thorsten

Hallo Oliver,

leider verstehe ich nicht alles, was Du so meinst. Z.B. welche hidden Felder? Aber mal so ein paar Anmerkungen:

  • Wäre es nicht sinnvoll, statt nach einem Timeout von 2 Sekunden, die ausführende Seite den reaload machen zu lassen? Was, wenn man die Datenbank nicht reagiert, 2 sek. sind schnell vorbei.
  • Ich würde statt popup einen DIV-Layer nehmen.
  • Um die Ursprungsseite anzusprechen muss man das opener-Objekt benutzen, nicht top oder parent

Ich würde alles in eine Seite machen, einen DIV-Layer benutzen, darin das Form. Das ruft die Seite selbst wieder auf, gibt einen hidden Parameter mit wie save=1. Der wird vor Seitenaufbau im request abgefragt und wenn erfüllt, das Update in der DB gemacht.

Gruß, Alex

Hallo,

Hast du mal geschaut was in:

top.document.location
document.location
location.href

enthalten ist? Lass dir das mal im Alert-Fenster anzeigen. Da müssten ja dann die Verweise auf das Hauptfenster enthalten sein.

Alternativ kann du auch mit reinem HTML eine „Auffrischung“ erwirken.
Tragen im Headbereich folgendes ein:

Die 10 sind die Sekunden und die URL noch anpassen. Dann wird die Seite neu geladen.

Viele Grüße,

Nicky Erhardt

Wow, that’s fast! Thanx!
Well, to execude javascript, didn’t I need an event-handler like onload or onsubmit?
Or is it possible like.

html html html html html
run javascript
html html html

My problem is, that after the creation of a pdf , the data become locked, but the mainpage still shows the old unblocked status. When the user would click on edit, he will get an error. OK, one possibility would be to integrate js in the pdf-creation…

I solved it now by setTimeout(„parent.document.jahr_senden.submit();“,2*1000);

Hi Björn,
danke für die superschnelle Rückmeldung.
Ich habs nun gelöst: setTimeout(„parent.document.jahr_senden.submit();“,2*1000);

Das Problem sind halt vorher gesetzt Filter. Und nach der pdf-Generierung werden dei Daten gesperrt. Die Hauptseite zeigt aber noch die alte ungesperrte Übersicht. Das würde einen Error geben. zudem hat man vorher auf der Seite einige Filter gesetzt. Die stehen im hiddenfeld.
Daher der reload.

Hi,
danke für die superschnelle Rückmeldung.
Ich habs nun gelöst. Ein simples:
setTimeout(„parent.document.jahr_senden.submit();“,2*1000);

Das prob war halt, dass die Daten nach der pdf-Generierung gesperrt werden, der user abernoch die alte Übersicht (ungesperrt) hat. Und diverse Felder, welche in hidden-Felder standen sind weg gewesen.
In dem Popup wird eigendlich auch nur abgefragt, was gemacht werdn soll. Je nach Email oder driucken wird das pdf etwas anders formatiert.

Hi,
danke für die superschnelle Rückmeldung!
Ich habs nun einfach mit

setTimeout(„parent.document.jahr_senden.submit();“,2*1000);

gelöst.
Problem ist, dass die Dtaen nach der pdf Generierung gesperrt werden. In der Übersicht steht aber noch die ungesperrte Version.

Hallo nochmal,

ich hab das wohl falsch verstanden :smile:

das Hauptfenster soll aktualisiert werden, nachdem auf dem PopupFenster was verändert wurde…

Gib dem Popup einen Namen:

var pop2;
pop2 = window.open(„test.html“, „POPUP“);

Somit kannst du im Popup auf das Hauptfenster zugreifen

setTimeout(„opener.location.href = opener.location“, „5000“);

Damit wird mein Hauptfenster aktualisert.

Ich hoffe das konnte dir helfen…

MfG

Nicky Erhardt

Danke für Deine Superschnelle Rüclmeldung.
Hm,
reines php und weniger js. Hört sich gut an. Aber:
Ein feature ist halt, dass das pdf je nach Versandart (email oder post) anders formatiert wird. Nach klick kommt daher das Popup und fragt Email oder Drucken.
Nach der generierung wird der Datensatz aber gesperrt.
In der Übersicht steht aber noch die alte Version (ungesperrt) . Daher der reload. Und die Filtevariablen stehen alle im hiddenfeld.

Hallo nochmal,

aber das eine schließt das andere doch garnicht aus! Der Datensatz wäre dann doch als gesperrt markiert. Das lässt sich jedenfalls 1a mit reinem PHP lösen, indem Du die Variablen per POST übergibst.

Ansonsten ließe es sich auch noch mit AJAX (eigentlich auch nur Javascript und PHP) lösen. In dem Fall würdest Du über eine Javascript-Funktion nur den Teil innerhalb des Dokumentes neu schreiben (also das gesperrte Feld) und nicht die ganze Seite neu laden. Finde ich aber deutlich komplizierter umzusetzen.

Viele Grüße,

Thorsten

Hi Alex,
danke für die superschnelle Rückmeldung.

Ich habs nun gelöst.
setTimeout(„parent.document.jahr_senden.submit();“,2*1000);

Mein Prblem ist, dass ich beim Generieren des pdfs die Daten sperre. In der Hauptseite stehe in der Übersicht aber immer noch die alte Version (ungesperrt). Daher der relaod. Zudem wird das pdf je nach versandart unterschiedlich formatiert. Daher überhaupt die Abfrage via popup.

„Wäre es nicht sinnvoll, statt nach einem Timeout von 2 Sekunden, die ausführende Seite den reaload machen zu lassen“

Brauche ich dafür nicht sowas wie einen eventhandler wie oncklick oder onload?
Oder kann ich im Fliesstext js ausführen lassen wie php?

Oh ha, div Layer und dann das ganze via css zu schweben bringen? Ist nicht meine Welt. :wink:

Das einzige was mir gerade so einfällt, ist dass der reload ohne timeout nach der pdf-Ausgabe aufgerufen wird.

Nur geht das überhaupt, dass ich Seite1 reloaden lasse, durch ein Script in Seite2?
Oder aber ich mache das DB Update im popup fenster nach dem onsubmit…

Hallo Oliver,

ich denke das es günstiger wäre das formular nicht erneut aufzurufen, sondern die variablen mit ein wenig JS im hauptfenster zu manipulieren.

Also z.b.

window.opener.document.getElementById(„xxx“).value = „yyy“;

Gruß,
Olaf

Hi Oliver,

wenn die Seite2.php die Änderungen an der Datenbank vorgenommen hat, muss sie die Seite1.php mit den geänderten Daten neu aufrufen. Nimm dazu nicht reload(), sondern die PHP-Funktion header().

MfG
Detlef

Hi,
danke für Deine schnelle Antwort. Gute Idee. Aber dann sind die ganzen Filter resettet. Ich kann die natürlich über get anhängen aber get möchte ich vermeiden.
post sieht doch schöner aus.
Ich habs nun mit einem submit gelöst. Nicht ganz optimal.
Mit einem timeout. Oder kann ich js im laufenden Script aufrufen?
html html html html html
html html
js
html html html html html html
html html

Normal brauche ich doch einen eventhandler à la onload etc. oder?