Claus Peter: onchange liefert keinen Rückgabewert

Hallo,

aufgrund eines Tips aus dem Forum prüfe ich nun beim Absenden eines Formulars alle Felder.

Weil ich eine faule Sau bin, habe ich mir eine Funktion geschrieben, die nacheinander alle INPUTS eines Formulars anspricht (Listen sind in dem Form nicht vorhanden).

function CheckAllInputs()
{
  var pInput;

for(i=0; pInput=document.getElementsByTagName("input")[i]; i++)
  {
    if(null != pInput.onchange && "" != pInput.name)
    {
      if(false == pInput.onchange()) return false;
    }
  }
  return true;
}

Wie Ihr erkennen könnt, erfolgt der Aufruf der Testroutinen mit pInput.onchange(). Das funktioniert auch mit allen von mir getesteten Browsern (Opera, IE, Mozilla) soweit ganz gut. Nur, den Rückgabewert der Testfunktion (onchange()) kriege ich nicht zurück. Wenn ich den Funktionsausfruf in ein alert

alert(pInput.onchange());

einbaue, dann erhalte ich 'undefined'.

Aus dem INPUT direkt heraus funktionierts.

Weiss jemand eine Lösung (außer das Ergebnis der Testfunktion in einer globalen Variable speichern, das habe ich als work around erst einmal schon eingebaut)?

Liebe Grüße

Claus Peter

  1. Moin!

    Weil ich eine faule Sau bin, habe ich mir eine Funktion geschrieben, die nacheinander alle INPUTS eines Formulars anspricht (Listen sind in dem Form nicht vorhanden).

    "Ansprechen" ist eine sehr allgemeine Umschreibung für "macht irgendwas, aber was genau, das hab ich mir noch nicht genau überlegt".

    Das wird jedenfalls an deinem Code deutlich.

      
    
    > function CheckAllInputs()  
    > {  
    >   var pInput;  
    
    // Hier fehlt dringend die Definition der Schleifenvariablen:  
         var i;  
      
    
    >   for(i=0; pInput=document.getElementsByTagName("input")[i]; i++)  
    
    // Trickreich, aber unperformant! getElementsByTagName ist eine sehr zeitaufwendige Funktion, die man, wo immer möglich, nur einmal aufrufen sollte. Also das zurückgegebene Array lieber zwischenspeichern und dann durchgehen.  
      
    
    >   {  
    >     if(null != pInput.onchange && "" != pInput.name)  
    >     {  
    >       if(false == pInput.onchange()) return false;  
    
    // Hier rufst du die Methode "onchange" des Inputfeldes auf. Warum dieses? Hast du dem Formularfeld denn eine Methode definiert? Was versuchst du damit zu erreichen/testen? Wo ist der Code dieser Methode? Verwechselst du da evtl. was mit dem Eventhandler gleichen Namens?  
    
    >     }  
    >   }  
    >   return true;  
    > }  
    
    

    Wie Ihr erkennen könnt, erfolgt der Aufruf der Testroutinen mit pInput.onchange(). Das funktioniert auch mit allen von mir getesteten Browsern (Opera, IE, Mozilla) soweit ganz gut. Nur, den Rückgabewert der Testfunktion (onchange()) kriege ich nicht zurück. Wenn ich den Funktionsausfruf in ein alert

    alert(pInput.onchange());

    einbaue, dann erhalte ich 'undefined'.

    Aus dem INPUT direkt heraus funktionierts.

    Wie ist das zu interpretieren? Insbesondere was ist "aus dem INPUT direkt"?

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hi,

      for(i=0; pInput=document.getElementsByTagName("input")[i]; i++)
      // Trickreich, aber unperformant! getElementsByTagName ist eine sehr zeitaufwendige Funktion, die man, wo immer möglich, nur einmal aufrufen sollte. Also das zurückgegebene Array lieber zwischenspeichern und dann durchgehen.

      Ooops, so hatte ich das noch gar nicht gesehen. Danke für die Info.

      if(false == pInput.onchange()) return false;
      // Hier rufst du die Methode "onchange" des Inputfeldes auf.
      Warum dieses? Hast du dem Formularfeld denn eine Methode definiert?

      Ja, latürnich. pInput.onchange() führt dazu, daß die zugeordnete Funktion zum Testen des Inputs aufgerufen wird. Sogar mit dem im Funktionsaufruf deklarierten Parametern (in diesem Fall this - zur Übergabe eines Zeigers auf das Element).

      Also <input type="text" name="hase" onChange="return TestFkt(this)">
      Hmm, ich glaube, ich weiss jetzt, warum es nicht geht. Ich hatte im Funktionsaufruf das return weggelassen.;-((((

      Mit null!=pInput.onchange wird lediglich geprüft, ob ein onChange-Handler überhaupt definiert ist. So weit, so gut. Nur mit der Rückgabe des Resultates der aufgerufenen Funktion klappt es leider nicht.

      was ist "aus dem INPUT direkt"?

      Eingabe/Änderung im INPUT Feld, so daß der onChange-Handler feuert.

      Grüsse

      Claus Peter

      1. Moin!

        Ja, latürnich. pInput.onchange() führt dazu, daß die zugeordnete Funktion zum Testen des Inputs aufgerufen wird. Sogar mit dem im Funktionsaufruf deklarierten Parametern (in diesem Fall this - zur Übergabe eines Zeigers auf das Element).

        Den Ansatz finde ich irgendwie ungewöhnlich. Üblicherweise vermutet man in dem durch den Event "onchange" aufgerufenen Code etwas, was darauf reagiert, dass _eben gerade_ der Inhalt des Formularfeldes verändert wurde.

        Dass man genau den gleichen Code nochmal beim Abschicken des Formulars benutzt, und das auch noch funktioniert wie gewünscht, liegt dann wohl eindeutig am aufgerufenen Code. :)

        Ich persönlich wäre nicht auf solche seltsamen Ideen gekommen, sondern hätte die onchange aufgerufene TestFkt einfach mit dem passenden Formularelementobjekt aufgerufen - das würde genauso gut funktionieren.

        Abgesehen davon hänge ich persönlich ja sehr an den altbekannten Collections für Formulare und Elemente. Die sind bestens erprobt, im DOM-Standard verankert und durchaus performanter ansprechbar, als getElement(s)By*().

        Mit null!=pInput.onchange wird lediglich geprüft, ob ein onChange-Handler überhaupt definiert ist. So weit, so gut. Nur mit der Rückgabe des Resultates der aufgerufenen Funktion klappt es leider nicht.

        Was ja wiederum bedeutet, dass die Prüfung des Formularfeldes ausfällt, wenn kein Eventhandler definiert ist.

        Andererseits kann man statt einer Einheitsfunktion für alle Felder so natürlich jedes Formularfeld mit seiner individuellen Checkfunktion versehen.

        Aber trotzdem: Sowas würde ich nicht über das manuelle Abfeuern eines tatsächlich nicht stattgefundenen Events regeln, so nach dem Motto "tun wir mal so, als wäre das Formularfeld geändert worden - was wäre denn dann zu tun?" :)

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Moin moin,

          Ich persönlich wäre nicht auf solche seltsamen Ideen gekommen, sondern hätte die onchange aufgerufene TestFkt einfach mit dem passenden Formularelementobjekt aufgerufen - das würde genauso gut funktionieren.

          Im Prinzip ja. Dann müsste ich mir ein Script schreiben, welches alle Testroutinen aufruft. Bei jeder Änderung der Seite oder Änderung der Funktionsaufrufe müsste dieses Script angepasst werden (was aus Gründen menschlicher Unzulänglichkeit schon mal vergessen wird). Ändert sich die Anzahl der Formularfelder zur Laufzeit, muß auch die Testfunktion entsprechend flexibel reagieren.

          Abgesehen davon hänge ich persönlich ja sehr an den altbekannten Collections für Formulare und Elemente. Die sind bestens erprobt, im DOM-Standard verankert und durchaus performanter ansprechbar, als getElement(s)By*().

          Äh, was meinst Du damit? document.forms[0].element_name?

          Was ja wiederum bedeutet, dass die Prüfung des Formularfeldes ausfällt, wenn kein Eventhandler definiert ist.

          Richtig! Das ist auch so beabsichtigt. Ich werde die Funktion noch so weit erweitern, daß der onchange-Handler nur aufgerufen wird, wenn er 1.) definiert ist und 2.) der Name des Inputs mit m_ (für mandatory) beginnt. Ich liebe generische Funktionen :-)

          Die Abfrage des Resultats ändere ich dann noch in

          if(true != pInput.onchange()) return false;

          Dann habe ich auch die Fälle abgefangen, bei denen im Aufruf des onChange-Handlers im INPUT das Zauberwort "return" fehlt. Schusseligkeit meinerseits fällt dann sofort auf.

          Aber trotzdem: Sowas würde ich nicht über das manuelle Abfeuern eines tatsächlich nicht stattgefundenen Events regeln, so nach dem Motto "tun wir mal so, als wäre das Formularfeld geändert worden - was wäre denn dann zu tun?" :)

          Warum nicht? Alles, was nicht verboten ist, ist erlaubt! ;-)

          Grüsse

          Claus Peter