Fabienne: Formular automatisch bei onchange versenden

Guten Morgen,

ich möchte ein Formular beim Verlassen der Seite automatisch versenden, wenn irgend ein Wert der Input-Felder geändert wurde und der "Speichern"-Button nicht angeklickt wurde.

Meine Idee dazu:
Ich initialisiere ein Formularfeld (hier "changed") mit "0". Diesen Werte ändere ich beim onchange irgendeines Formularfeldes nach "1".
Beim onleave der Seite wird eben dieser Wert abgefragt und ggf. das formular.submit()...

Aber irgendwo steckt ein Fehler... Wer findet ihn???

<script language="JavaScript">

// Ändert die "Variable" changed,
// falls ein Wert im Formular geändert wurde.
function changed()
{
document.form1.changed.value='1';
}

// Schickt das Formular ab, falls die "Variable" changed
// nicht gleich '0' ist

function submit_form()
{
if(document.form1.changed.value!='0')
 {
 document.form1.submit();
 }
}
</script>

<BODY onleave="submit_form();">

<form name="form1" method="post" action="mein_script.html">

<!-- Wird mal ein hidden-field -->
<input type="text" name="changed" value="0">

<input type="text" name="textfield" value="test">
<input type="text" name="textfield2" value="Hallo" onChange="changed();">
<input type="submit" name="Submit" value="Speichern">

</form>
</body>

Danke für Eure Hilfe!

  1. Hi,

    Ich initialisiere ein Formularfeld (hier "changed") mit "0". Diesen Werte ändere ich beim onchange irgendeines Formularfeldes nach "1".
    Beim onleave der Seite wird eben dieser Wert abgefragt und ggf. das formular.submit()...
    Aber irgendwo steckt ein Fehler... Wer findet ihn???

    1. Es gibt kein onleave (im Gegensatz zu onunload).

    2. Es kann sein (ich bin mir da nicht sicher), daß zum Zeitpunkt des onunload die Seite mit dem Formular schon gar nicht mehr existiert.

    3. Die Response zu Deinem Submit wird im aktuellen Fenster dargestellt. Dort will der Benutzer aber die Seite sehen, wegen derer er Dein Formular verläßt.

    4. Was, wenn der Benutzer zwar irgendwelche Daten geändert hat, diese aber nun gar nicht abgeschickt haben will (was ja einer der Gründe sein könnte, eine andere Seite zu laden, ohne vorher das Formular abgeschickt zu haben).

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Es gibt kein onleave (im Gegensatz zu onunload).

      Das meinte ich ja.... Geht trotzdem nicht.

      1. Es kann sein (ich bin mir da nicht sicher), daß zum Zeitpunkt des onunload die Seite mit dem Formular schon gar nicht mehr existiert.

      Sollte schon, da jeder JS-Code noch ausgeführt wird, wenn onunload in Kraft tritt. Man könnte ja auch die Links auf der Seite mit einem onklick()-Eventhandler ausstatten. Zugegeben, das onunload ist wohl etwas übertrieben.

      1. Die Response zu Deinem Submit wird im aktuellen Fenster dargestellt. Dort will der Benutzer aber die Seite sehen, wegen derer er Dein Formular verläßt.

      Jop. Das ist eine weitere Problematik. Aber: Das Formular wird per PHP bearbeitet. Dort werde ich eine header("LOCATION....")-Weiterleitung zur gewünschten Seite einbauen.

      1. Was, wenn der Benutzer zwar irgendwelche Daten geändert hat, diese aber nun gar nicht abgeschickt haben will (was ja einer der Gründe sein könnte, eine andere Seite zu laden, ohne vorher das Formular abgeschickt zu haben).

      Ja, könnte sein. Dazu kommt noch ein Alert-Fenster rein. "Sie haben Daten geändert. Möchten Sie diese speichern?"

      Mein Problem ist folgendes:
      Die Seite wird ein Datenbank-Interface in "Registerkartenoptik". Nun könnte es doch sein, dass ein unwissender Windows-Benutzer denkt, er muss zuerst alle Registerkarten ausfüllen und dann auf "Speichern" klicken. Also: Jede einzelne Registerkarte wird auf Änderungen über onchange abgefragt und beim Verlassen (also beim Klick auf eine andere Registerkarte) der Seite wird nach einer Rückfrage ggf. der submit() durchgeführt.

      Danke!

      1. hi,

        1. Es kann sein (ich bin mir da nicht sicher), daß zum Zeitpunkt des onunload die Seite mit dem Formular schon gar nicht mehr existiert.

        Sollte schon, da jeder JS-Code noch ausgeführt wird, wenn onunload in Kraft tritt.

        wenn die _seite_ und damit das _formular_ schon gar nicht mehr existieren, dann kannst du so viel javascript ausführen, wie du willst - was nicht mehr da ist, kannst du auch nicht mehr abschicken.

        und ich würde nicht davon ausgehen, dass sich hierbei alle browser gleich verhalten.

        gruß,
        wahsaga

        --
        "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
        1. wenn die _seite_ und damit das _formular_ schon gar nicht mehr existieren, dann kannst du so viel javascript ausführen, wie du willst - was nicht mehr da ist, kannst du auch nicht mehr abschicken.

          Bist Du Dir da sicher? Warum gibt es dann den onunload-Eventhandler???

          und ich würde nicht davon ausgehen, dass sich hierbei alle browser gleich verhalten.

          O.K. Was wäre Dein Vorschlag?

          Das mit dem onunload finde ich auch etwas übertrieben. Ich werde es über onclick auf den Link zur anderen Registerkarte realisieren. Damit sind diejenigen, die ein andere URL eintippen nicht mehr berücksichtigt! Und (soviel ich weiß) sind beim onclick auf alle Fälle die Werte noch da!

          Grüßle und besten Dank!

          1. Hallo Fabienne,
            wie wärs denn, wenn Du statt onClick direkt die Links als JS definierst, quasi

            href="javascript:document.forms[0].submit();window.location.href='reiter2.php'"?
            Das ist in meinen Augen die einzige Variante um sicherzustellen, dass dein JS _komplett_ ausgeführt wird, bevor die neue Seite geladen wurde.

            Schöne Grüße

            Alex

            1. Hi,

              wie wärs denn, wenn Du statt onClick direkt die Links als JS definierst, quasi

              Schlecht. Im Sinne der Barriere-Freiheit wird mein Link mit <a href="seite2.php" onclick="check_formular()">Seite2</a> definiert werden.

              Ich habs mittlerweile hinbekommen.

              Aber ich hab noch ne Frage:

              Ich öffne (falls Daten geändert wurden) ein POP-Up (kein confirm-Fenster), in dem der User wählen kann zwischen "Daten speichern" und "Daten nicht speichern". Nur wie kann ich meiner ursprünglichen Seite eben diese Ergebnisse mitteilen?

              Dank Euch!

              1. hi,

                Ich öffne (falls Daten geändert wurden) ein POP-Up (kein confirm-Fenster), in dem der User wählen kann zwischen "Daten speichern" und "Daten nicht speichern". Nur wie kann ich meiner ursprünglichen Seite eben diese Ergebnisse mitteilen?

                zugriff von einem popup aus auf das öffnende fenster geht über die window-instanz opener.

                "wem" oder "was" im ursprungsfenster du das ergebnis "mitteilen" willst, müsstest du aber noch genauer spezifieren.

                gruß,
                wahsaga

                --
                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                1. zugriff von einem popup aus auf das öffnende fenster geht über die window-instanz opener.

                  "wem" oder "was" im ursprungsfenster du das ergebnis "mitteilen" willst, müsstest du aber noch genauer spezifieren.

                  Das Popup geht ja nur auf, wenn jemand was im Formular geändert hat. Folglich brauche ich vom Popup nur ein SPEICHERN, falls der User auf "Daten speichern" geklickt hat, und ein "WEITER", falls die Daten nicht gespeichert werden sollten.

                  Mit so nem Confirm-Fenster würde das ja recht einfach gehen:

                  check = confirm("Möchte Sie speichern?");
                  if(check == false)
                  {
                  //nicht speichern
                  }
                  else
                  {
                  document.form1.submit();
                  }

                  Aber im Confirm-Fenster gibts nur OK oder ABBRECHEN. Das könnt bei den Usern zur Verwechslung führen. Daher würde ich es lieber über ein POPUP mit klar definierten Buttons realisieren. Diese wiederum bewirken, dass
                  1. das popup zugeht (onclick=window.close();)
                  2. das aufrufende Hauptfenster (Formularseite) ggf. das Formular abschickt oder eben auch nicht (falls User auf NICHT SPEICHERN klickt!).

                  Was ist dieser window-instanz-opener?

                  mein_window_name = popup("abfrage.html");

                  Wie kann ich jetzt aber vom POPUP aus wieder auf mein_window_name zugreifen?

                  Dankeschön für Eure Tipps!

                  1. hi,

                    Aber im Confirm-Fenster gibts nur OK oder ABBRECHEN. Das könnt bei den Usern zur Verwechslung führen.

                    so "doof" ist der user normalerweise nicht wirklich.

                    ob diese beiden möglichkeiten klar verständlich sind, hängt aber u.a. auch davon ab, wie "gut" du die frage formulierst.

                    Was ist dieser window-instanz-opener?

                    mein_window_name = popup("abfrage.html");

                    Wie kann ich jetzt aber vom POPUP aus wieder auf mein_window_name zugreifen?

                    auf mein_window_name willst du nicht zugreifen, weil das ja eben die referenz auf dein popup ist - zugriff vom popup auf's popup wäre ja hier weitgehend sinnfrei.

                    informiere dich doch mal in selfhtml zum stichwort opener: http://de.selfhtml.org/javascript/objekte/window.htm#allgemeines.

                    gruß,
                    wahsaga

                    --
                    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                2. POPUP ist doch schlecht, da man das einfach schließen kann.

                  Werde es mit dem confirm realisieren.

                  Kann man in dem Confirm-Fenster die Buttons "OK" und "ABBRECHEN" umbennenen?

                  1. hi,

                    Kann man in dem Confirm-Fenster die Buttons "OK" und "ABBRECHEN" umbennenen?

                    diese bezeichnungen gibt der browser bzw. das OS vor.

                    gruß,
                    wahsaga

                    --
                    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      2. Hi,

        1. Die Response zu Deinem Submit wird im aktuellen Fenster dargestellt. Dort will der Benutzer aber die Seite sehen, wegen derer er Dein Formular verläßt.
          Jop. Das ist eine weitere Problematik. Aber: Das Formular wird per PHP bearbeitet. Dort werde ich eine header("LOCATION....")-Weiterleitung zur gewünschten Seite einbauen.

        Dazu müßtest Du aber wissen (können), wo der User hinwill. Das weißt Du aber allerhöchstens dann, wenn die Seite über einen Deiner Links verlassen wird.
        Nicht aber, wenn ein Bookmark/Favorit aufgerufen wird oder die neue Seite in der Adreßleiste eingegeben wird.

        Mein Problem ist folgendes:
        Die Seite wird ein Datenbank-Interface in "Registerkartenoptik". Nun könnte es doch sein, dass ein unwissender Windows-Benutzer denkt, er muss zuerst alle Registerkarten ausfüllen und dann auf "Speichern" klicken. Also: Jede einzelne Registerkarte wird auf Änderungen über onchange abgefragt und beim Verlassen (also beim Klick auf eine andere Registerkarte) der Seite wird nach einer Rückfrage ggf. der submit() durchgeführt.

        Dann mach aus den Karteireitern Submit-Buttons, die die Daten übermitteln und dann die neue Seite mit anderer aktiver Registerkarte anzeigt.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.