heinetz: array mit text und funktionien

Hallo,

ich bestel gerade an einem formchecker, der einigermassen universell
einsetzbar sein soll.

Zur Zeit definiere ich eine Liste, der zu überrpüfenden Eingabefelder
wie folgt:

var requiredFields = new Array(
"Firma",
"Position",
"Vorname",
"Name",
"Strasse",
"PLZ",
"Ort",
"Telefon",
"E-Mail",
"Betreff",
"Ihre_Nachricht");

... und Es wird pauschal geprüft, ob form.elements[fields[i]].value = ""
ist. Nun würde ich gerne zusätzliche Mechanismen einbauen. Z.B. eine
Validitätsprüfung für die Emailadresse und die Information über den
Mechanismus, der auf das Feld anzuwenden ist in dem Array definieren.
Das könnte ich mir so vorstellen:

var requiredFields = new Array(
"Firma",
"Position",
"Vorname",
"Name",
"Strasse",
"PLZ",
"Ort",
"Telefon",
"validmail('E-Mail')",
"Betreff",
"Ihre_Nachricht");

Mit eval(fields[i]) könnte ich die entsprechende Funktion ansteuern.
Ich habe nun nur das Problem der Unterscheidung, ob ein Wert im Array
ein Funktionsaufruf sein soll, oder ein String ist. Versucht habe ich
folgendes:

for (i=0; i<fields.length; i++)
   {
    if (eval(fields[i])!='true')

... usw. Das führt natürlich zu einem Fehler, weil eval("Firma") eine
Funktion bzw. ein Objekt erwartet. Gibt es eine Möglichkeit, abzufragen,
ob eine Funktion existiert ?

Z.B. alert(is_func("validmail('E-Mail')"));

danke für Tipps und

beste gruesse,
heinetz

  1. Hi,

    was es gibt, ist

    typeof validEmail == "function"

    aber das wirds wohl in deinem Konzept nicht tun.

    Du kannst auch ein try/catch Block um dein eval bauen.

    Aber schöner Stil ist das alles nicht.

    Mach lieber Objekte oder ein 2dimensionales Array, wo du noch eine Funktionsreferenz speicherst.

    Gruß!

  2. Hallo,

    Mit eval(fields[i]) könnte ich die entsprechende Funktion ansteuern.
    Ich habe nun nur das Problem der Unterscheidung, ob ein Wert im Array
    ein Funktionsaufruf sein soll

    Deshalb würde ich eine andere Datenstruktur verwenden als einen Array aus Strings.
    Zum Beispiel ein Object mit Namen-Werte-Zuordnung.

    var fields = {
       "Feldname1" : "optional",
       "Feldname3" : "required",
       "Feldname4" : funktion,
    };

    oder ähnlich. Das dann mit einer for-in-Schleife durchlaufen. Die Funktion kannst du dann direkt ausführen. Abfrage wie gesagt mit typeof.

    ... usw. Das führt natürlich zu einem Fehler, weil eval("Firma") eine
    Funktion bzw. ein Objekt erwartet. Gibt es eine Möglichkeit, abzufragen,
    ob eine Funktion existiert ?

    Ja, wenn du den String "validmail" hast, kannst du mit typeof window["validmail"] == "function" prüfen, ob eine globale Funktion mit diesem Namen existiert.

    Dazu musst du den Funktionsnamen natürlich aus dem String "validmail('E-Mail')" extrahieren, nämlich alle Zeichen bis zum ersten Vorkommen von validmail

    Mathias