timex: function uebergeben bei zweidimensionalem array funzt nicht

tach zusammen,

ich sitze immer noch an meinem coding, bald ist es geschafft. vielen dank schon mal fuer alle biherigen und weitere ideen.

ueber ein zweidimensionales array lasse ich ein formular ueberpruefen, wobei der erste eintrag der name des elements ist, das ueberprueft werden soll. der zweite eintrag ist der name der zugehoerigen function.

hier der code:

<script language="JavaScript" type="text/javascript">
<!--

function checkForm() {

var ok = true;

elm2Check = new Array(
 new Array("vorname", "checkText"),
 new Array("nachname", "checkText"),
 new Array("plz", "checkPostalCode"),
 new Array("ort", "checkText"),
 new Array("telefon", "checkPhoneNumber"),
 new Array("mail", "checkMail")
);

for(i=0;i<elm2Check.length;i++) {

alert(elm2Check[i][1]); <<< hier funzt es, die functions werden korrekt angezeigt.

if (elm2Check[i][1]) { <<< hier meldet der browser "Funktion erwartet"?!
  ok = false;
  fokusItem([elm2Check[i][0]]);
  switchItem([elm2Check[i][0]],1,1);
  } else {
  switchItem([elm2Check[i][0]],0,0);
 }
}

if (!ok)
 return ok;

}

// -->
</script>

jemand eine idee?!

fragt freundlich,
timex

  1. Moin Moin !

    Definiere "funzt".

    if (elm2Check[i][1]) { <<< hier meldet der browser "Funktion erwartet"?!

    Der Code sieht aus wie ein Funktionsaufruf, aber elm2Check[i][1] ist keine Funktion, sondern ein String.

    Möchtest Du einen Operator zwischen die beiden Elemente setzen?

    Möchtest Du ein assoziatives Array benutzen?

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Moin Moin !

      Möchtest Du ein assoziatives Array benutzen?

      Möchtest Du die Funktion in der Definiton von elm2Check korrekt angeben?

      Alexander

      --
      Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    2. hi,

      Definiere "funzt".

      "funktioniert"

      if (elm2Check[i][1]) { <<< hier meldet der browser "Funktion erwartet"?!

      Der Code sieht aus wie ein Funktionsaufruf, aber elm2Check[i][1] ist keine Funktion, sondern ein String.

      ja, ich gehe davon aus, dass der string dann als function interpretiert wird. sehe ich das falsch?!

      Möchtest Du einen Operator zwischen die beiden Elemente setzen?

      nein

      Möchtest Du ein assoziatives Array benutzen?

      sagt mir (leider) nichts.

      1. Moin Moin !

        Der Code sieht aus wie ein Funktionsaufruf, aber elm2Check[i][1] ist keine Funktion, sondern ein String.

        ja, ich gehe davon aus, dass der string dann als function interpretiert wird. sehe ich das falsch?!

        Ja.

        Lasse in der Definition von elm2Check die unnötigen Quotes um den Funktionsnamen weg, dann hast Du eine Referenz auf die Funktion. (Mit Klammern hinter dem Funktionsnamen würdest Du die Funktion aufrufen - ohne bekommst Du die Referenz.)

        Möchtest Du ein assoziatives Array benutzen?

        sagt mir (leider) nichts.

        Das würde Dir die Schleife sparen, weil die Suche in wesentlich schnellerem Native-Code läuft und außerdem ein effizienterer Suchalgorithmus läuft.

        Assoziative Arrays kennst Du z.B. von document.forms['name'] - document.forms ist ein assoziatives Array (mit einigen "special effects"). Im Prinzip ist der einzige Unterschied zu einem normalen Array, daß Du mit Strings statt Indexpositionen arbeitest.

        var demo=new Array();
        demo['eins']=1;
        demo['zwei']=22;
        demo['drei']=333;
        alert(demo['zwei']); // 22
        // und bei in Javascript legalen Bezeichnern geht auch:
        alert(demo.drei); // 333

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. hi alexander,

          danke erst mal fuer die hinweise. ich muss jetzt (leider) weg. mit den infos komme ich bestimmt zu einem ergebnis.

          vielen dank noch einmal
          gruss, timex

  2. Hallo timex.

    alert(elm2Check[i][1]); <<< hier funzt es, die functions werden korrekt angezeigt.

    Falsch. du siehst, was du sehen willst. Es wird ein string ausgegeben.

    if (elm2Check[i][1]) { <<< hier meldet der browser "Funktion

    seit wann ist ein string eine funktion?! Auch wenn javascript automatische Typumwandlung hat, heißt da nicht, dass er jeden string erstmal in alles Mögliche konvertiert... es gibt die Möglichkeit mit eval einen string zu interpretieren http://selfhtml.teamone.de/javascript/objekte/unabhaengig.htm#eval . Du könntest aber auch die verschiedenen Funktionen in ein array packen (sowas ist soweit ich informiert bin dank objektorientierung möglich, wenn auch in deinem Fall wahrscheinlich übertrieben.)

    Ich weiß jedoch nicht, warum du die sache nicht mit ein paar einfachen if abfragen regelst. die sind auf jedenfall schneller und einfacher. Dagegen spricht nur etwa, wenn sich der Aufbau deines Formulars ändert.

    Grüsse,
      Christian

    --
    Erfahrung ist die Summe der Dummheiten, die man im Bedarfsfall wieder anwendet. (Dieter Hildebrand, Kabarettist)
    1. hallo christian,

      alert(elm2Check[i][1]); <<< hier funzt es, die functions werden korrekt angezeigt.
      Falsch. du siehst, was du sehen willst. Es wird ein string ausgegeben.

      ok, da lag der fehler!

      if (elm2Check[i][1]) { <<< hier meldet der browser "Funktion
      seit wann ist ein string eine funktion?! Auch wenn javascript automatische Typumwandlung hat, heißt da nicht, dass er jeden string erstmal in alles Mögliche konvertiert... es gibt die Möglichkeit mit eval einen string zu interpretieren http://selfhtml.teamone.de/javascript/objekte/unabhaengig.htm#eval .

      da sehe ich mal nach...

      Ich weiß jedoch nicht, warum du die sache nicht mit ein paar einfachen if abfragen regelst. die sind auf jedenfall schneller und einfacher. Dagegen spricht nur etwa, wenn sich der Aufbau deines Formulars ändert.

      die vorliegende function ist dann so etwas wie die eierlegende wollmilchsau. ich moechte sie dann konsequent fuer alle formulare bei verschiedenen projekten nutzen koennen. deswegen auch der aufbau ueber das array. die einzelnen if abfragen habe ich ja schon vorliegen...

      gruss, timex

      1. Moin Moin !

        es gibt die Möglichkeit mit eval einen string zu interpretieren http://selfhtml.teamone.de/javascript/objekte/unabhaengig.htm#eval .

        da sehe ich mal nach...

        Laß gut sein, eval() ist langsam, gefährlich und hier völlig unnötig.

        Die einzige Stelle, an der eval() Sinn macht, ist das Taschenrechner-Beispielprogramm. Und selbst das kann man mit Javascript-OOP ohne eval() schreiben. Im "real life" ist eval() absolut überflüssig und immer ein Zeichen, daß jemand mit Javascript nicht umgehen kann. Siehe auch http://aktuell.de.selfhtml.org/artikel/javascript/oomodell/index.htm.

        die vorliegende function ist dann so etwas wie die eierlegende wollmilchsau. ich moechte sie dann konsequent fuer alle formulare bei verschiedenen projekten nutzen koennen. deswegen auch der aufbau ueber das array. die einzelnen if abfragen habe ich ja schon vorliegen...

        Interessantes Problem (damit werde ich mich diesen Monat auch noch befassen müssen), aber dieser Lösungsansatz ist mindestens merkwürdig.

        Nimm ein assoziatives Array, in dem Du zu jedem Formularelementnamen die Prüffunktion ablegst. Dann ist die gesamte "große" Prüfroutine nur eine Schleife über alle Formularelemente, die für jedes Element isOkelementname aufruft (f ist das aktuelle Formular, isOk ist elm2Check als assoziatives Array, elementname der Name des aktuellen Elements). Nebenbei übergibst Du so das Elementobjekt statt nur seinen Namen, so kommt der Code auch mit gleich benannten Elementen in mehreren Formularen in einer HTML-Seite klar.

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".