Maja: Abfragen, ob eval() einen Fehler erzeugt

Hallo,

ich habe ein Textfeld, in welches man Formeln in der Form 16*(2+5.6) eingeben kann. Bei onBlur wird der Wert mittels "eval()" berechnet. Das ganze sieht im Prinzip wie folgt aus.

<input name="fld1" type="text" id="fld1" onBlur="this.value = eval(this.value)">

Nun möchte ich aber auch überprüfen, ob der eingegebene Wert auch ein berechenbarer Ausdruck ist. Dafür habe ich aber überhaupt noch keine Idee und wäre dankbar, wenn mir jemand mit einem Lösungsansatz auf die Sprünge helfen könnte.

Außerdem habe ich hier im Forum des öfteren gelesen "eval() ist böse" und läßt sich zu 99.9% vermeiden. Bezieht sich das auch auf meine Art der Verwendung von "eval()"? Und wenn ja, welche Alternativen habe ich?

Vieln Dank im Voraus
Maja

  1. Hallo,

    Mach Dir ein kleines Funktiönchen, dass Deine Berechnungen übernimmt unter den entsprechenden Bedingungen, vielleicht schaust Du Dir mal http://selfhtml.teamone.de/javascript/beispiele/taschenrechner.htm an. Ob eval wirkilch evil ist, weiss ich leider nicht.

    Dieter

    1. Hallo,

      Mach Dir ein kleines Funktiönchen, dass Deine Berechnungen übernimmt unter den entsprechenden Bedingungen, vielleicht schaust Du Dir mal http://selfhtml.teamone.de/javascript/beispiele/taschenrechner.htm an. Ob eval wirkilch evil ist, weiss ich leider nicht.

      das ist ein schönes Beispiel von unnötigen eval.

      x = eval(window.document.Rechner.Display.value);
      window.document.Rechner.Display.value = x;

      Da wird es benutzt um auf Formularelemente zuzugreifen, was in diesem Kontext einfach durch weglassen von eval genauso funktioniert.

      selfhtml ist nicht perfekt.

      Struppi.

      1. Hallo Struppi,

        Da muss ich Dir recht geben.

        Dieter

    2. Hallo,

      Mach Dir ein kleines Funktiönchen, dass Deine Berechnungen übernimmt unter den entsprechenden Bedingungen, vielleicht schaust Du Dir mal http://selfhtml.teamone.de/javascript/beispiele/taschenrechner.htm an. Ob eval wirkilch evil ist, weiss ich leider nicht.

      Das Taschenrechnerbeispiel hilft mir nicht wirklich weiter, weil ich zwar auf ungültige Zeichen Prüfen kann, nicht aber auf ungültige Formeln.

      Aber trotzdem vielen Dank. :)

      Maja

  2. Hallo,

    ich habe ein Textfeld, in welches man Formeln in der Form 16*(2+5.6) eingeben kann. Bei onBlur wird der Wert mittels "eval()" berechnet. Das ganze sieht im Prinzip wie folgt aus.

    <input name="fld1" type="text" id="fld1" onBlur="this.value = eval(this.value)">

    Nun möchte ich aber auch überprüfen, ob der eingegebene Wert auch ein berechenbarer Ausdruck ist. Dafür habe ich aber überhaupt noch keine Idee und wäre dankbar, wenn mir jemand mit einem Lösungsansatz auf die Sprünge helfen könnte.

    Außerdem habe ich hier im Forum des öfteren gelesen "eval() ist böse" und läßt sich zu 99.9% vermeiden. Bezieht sich das auch auf meine Art der Verwendung von "eval()"? Und wenn ja, welche Alternativen habe ich?

    eval ist zu 99.99999999% unnötig und eval ist evil.

    weil es
    a.) langsamer ist
    b.) zu unvorhersehbaren Ergebnissen führen kann
    und
    c.) schwerer zu debuggen ist.

    und du hast genau einen Fall in dem eval unvermeindbar ist. eval ist dafür gedacht zur Laufzeit dynamischen JS code auszuführen und das ist genau das was du willst.

    Deine Möglichkeit wäre (evtl.) den Fehler abzufangen.

    window.onerror = errHandler;
    funtion errHandler(msg, file, zeile)
    {
        return true;
    }

    Das return true; verhindert, das der normale Error handler ausgeführt wird.

    Struppi.

    1. Hallo Struppi

      »»
      und du hast genau einen Fall in dem eval unvermeindbar ist. eval ist dafür gedacht zur Laufzeit dynamischen JS code auszuführen und das ist genau das was du willst.
      »»

      Da fällt mir ein Stein vom Herzen. :)

      Deine Möglichkeit wäre (evtl.) den Fehler abzufangen.

      window.onerror = errHandler;
      funtion errHandler(msg, file, zeile)
      {
          return true;
      }

      Der Fluch der "Strg + C / Strg + V" Programmierung hat mal wieder zugeschlagen. Aber wenn man aus "funtion" "function" macht, funktioniert es auch. Danke nochmals. Ich hatte zwar eher was in der Richtung

      if(eval(wert) == false) alert('huch');

      gesucht, aber das scheint wohl nicht möglich zu sein.

      Also besten Dank nochmals und liebe Grüße.
      Maja

  3. Moin Moin !

    Vielleicht kannst Du das ja auch noch brauchen (ab Javascript 1.3):

    var panne=false;
    var ergebnis;
    try {
      /* Berechnung (zuweisung an ergebnis) hier */
    } catch(error) {
      panne=true;
    } finally {
      /* nix */
    }
    if (panne) {
      alert('Panne! Das war unverdaulich.');
    } else {
      alert('Ergebnis: '+ergebnis);
    }

    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!"
    Für eine bessere Übersichtsdarstellung des Forums: http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2