Marcus: Event-Handler vs. HREF

Liebe Runde,

ein Skript soll prüfen, ob seit dem Laden der Seite Änderungen an Formularfeldern vorgenommen wurden, und den Benutzer ggf. davor warnen ohne diese Änderungen zu speichern, weiter zu navigieren.

Die Prüfung klappt, der confirm Dialog kommt auch, nach Abbruch wird der HREF aber trotzdem "ausgeführt".

Meine Vermutung ist nun, dass das "hochgebubblete" onclick event auf BODY-Ebene einfach schon zu spät erfasst wird, man den Vorgang also nur während der capture Phase abfangen könnte.

Die m.W. dafür notwendige Methode addEventListener() wird aber v.a. vom IE noch nicht vernünftig unterstützt.

Hat jemand einen Tipp?
Herzlichen Dank!!
Marcus

Der Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
 <title>Untitled</title>
<script>
var j = "";

function getStatus() {
var iMax = document.getElementsByTagName("input").length;
for (var i = 0; i < iMax; i++)
 {
 j = j + document.getElementsByTagName("input")[i].value;
 }
}

function getClick(objectType) {
var t = mouseEventHandler(objectType);
var k = j;
if (t == "A")
 {
 j = "";
 getStatus();
 if (j != k)
  {
  Check = confirm("Deine Angaben sind nicht gespeichert! Willst Du wirklich ohne zu speichern wechseln?");
  if (Check == false)
  return false;
  }
 }
}

function mouseEventHandler(mEvent)
{
    // Internet Explorer
  if (mEvent.srcElement)
  {
    return(mEvent.srcElement.nodeName);
  }
  // Firefox
  else if (mEvent.target)
  {
    return(mEvent.target.nodeName);
  }
}

</script>

</head>

<body onclick="getClick(event);" onload="getStatus();">
<br>
<a href="http://www.google.de">testdiv1</a><br>
                <form method="post" action="#">
                  <p>
                    <b></b><br>
                    <input type="text" name="suchausdruck" id="suchausdruck" size="10" maxlength="50">
                    <input type="hidden" name="feld" value="alle">
                  </p>
                </form>
</body>
</html>

  1. Hallo,

    <body onclick="getClick(event);" onload="getStatus();">

    Du müsstest hier onclick="return getClick(event)" schreiben. Also den Rückgabewert von getClick »weitergeben«. Bei der Benutzung von den Event-Handler-Attributen ruft man eine Funktion ja nur auf, deren Rückgabewert muss aber nochmal »rückgegeben« bzw. durchgereicht werden.

    Wenn du stattdessen document.body.onclick = getClick; schreiben würde (beim onload), dann würde return false unmittelbar der Rückgabewert des Handlers sein.

    Mathias

    --
    »No nations, no borders.«
    SELFHTML Weblog
    1. Hallo Mathias,

      excellent, vielen Dank!
      In dieser Ecke hätte ich das Problem nicht vermutet.

      Tolle Hilfe, Schönen Abend noch!
      Marcus

  2. Moin moin allerseits,

    wenn ich das jetzt recht verstehe: Du willst, bevor dein Formular abgeschickt wird, eine Prüfung des Inhaltes durchführen? Falls du das willst und bei einer negativen Prüfung kein "Abschicken" erfolgen soll, musst du das leicht anders machen.

    Erster Ansatz: Als action für die Form wird irgendwas nach der Masche action="javascript:pruefen()" eingesetzt. Jene Routine pruefen() kannst du dann mit deiner schon geschriebenen Prüfung füllen. Am Ende kannst du dann *per Script*, also in der gleichen Routine, das "Abschicken" auslösen, etwa nach dem Muster
    document.forms[0].submit(); return true;
    Des sollte so alles in allem gehen.
    Vergleiche:
    http://de.selfhtml.org/html/formulare/definieren.htm#bereich
    http://de.selfhtml.org/javascript/objekte/forms.htm#submit

    So weit, MfGrüßen,
    Sebastian

    --
    Selfcode sh:( fo:| ch:? rl:( br:& br:] n4:# ie:| mo:} va:{ de:< zu:) fl:( ss:| ls:& js:)
    1. Hallo,

      Du willst, bevor dein Formular abgeschickt wird, eine Prüfung des Inhaltes durchführen?

      Nein, darum geht es anscheinend nicht.

      Der Anwender soll bestätigen, dass er über einen Link die Seite verlassen will, wenn er bereits Formulardaten eingegeben hat,

      action="javascript:pruefen()" ... Jene Routine pruefen() kannst du dann mit deiner schon geschriebenen Prüfung füllen. Am Ende kannst du dann *per Script*, also in der gleichen Routine, das "Abschicken" auslösen, etwa nach dem Muster
      document.forms[0].submit(); return true;

      Äh, das würde nicht funktionieren, denn was soll submit() auslösen, wenn action nicht sinnvoll, sondern mit einer javascript:-Pseudoadresse gefüllt ist? Das könnte höchstens eine Endlosschleife erzeugen. Es müsste ein normales action-Attribute und onsubmit="return pruefen()" sein.

      Mathias

      --
      »No nations, no borders.«
      SELFHTML Weblog
      1. Moin moin allerseits,

        hast recht. Des nächste mal beantworte ich Fragen nur noch ausgeschlafen. Angenehmes Wochenende - endlich pennen .... :-)

        So weit, MfGrüßen,
        Sebastian

        --
        Selfcode sh:( fo:| ch:? rl:( br:& br:] n4:# ie:| mo:} va:{ de:< zu:) fl:( ss:| ls:& js:)