DerNordBerliner: Wo liegt der Fehler

Hallöchen,

ich habe von einem Bekannten ein Script erhalten, welches Eingaben in einem Formular überprüft. Leider erreiche ich ihn nicht und finde einfach den Fehler nicht. vielleicht hat einer von euch ja eine Idee.

Ich habe das Formular mal bis auf ein Feld gekürzt aber das gedamt Script ist mit drin:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <script type="text/javascript" src="http://www.markus-melich.de/ios/mmtype.js"> <script type="text/javascript"> // MERKVARIABLEN ganzzahlen_felder = new Array("_1.3_PLZ", "_1.6_VWSchule1", "_1.6_TelSchule", "_1.6_VWSchule2", "_1.6_FaxSchule", "_1.3a_KoopPLZ", "_1.6a_KoopVWTel", "_1.6a_KoopTelefon", "_1.6a_KoopVWFax", "_1.6a_KoopFax", "_2.3_LeisPLZ", "_2.6_LeisVWTel", "_2.6_LeisTelefon", "_2.6_LeisVWFax", "_2.6_LeisFax", "_3.2_Leis1PLZ", "_3.5_Leis1VWTel", "_3.5_Leis1Telefon", "_3.5_Leis1VWFax", "_3.5_Leis1Fax", "_3.7_BLZ", "3.7_Konto", "_6.1_TNLehrer", "_6.1_FrauenLehrer", "_6.1_MaennerLehrer", "_6.2_TNSchueler", "_6.2_Maedchen", "_6.2_Jungen", "_6.2_Migration", "_6.2_Klasse7", "_6.2_Klasse8", "_6.2_Klasse9", "_6.2_Klasse10"); waehrungs_felder = new Array("_9.0_ESF1", "_9.0_BA1","_9.0_KO1", "_9.0_ESF2", "_9.0_BA2", "_9.0_KO2"); datums_felder = new Array("_10_Datum10", "_11_Datum11"); radio_felder = new Array("_gelesen"); checkbox_felder = new Array("p"); menue_felder = new Array("_1.3_Schulamtsbezirk", "_1.8_Anrede1", "_1.8_Titel1", "_1a_Koop", "1.3a_KoopBezirk", "1.8a_KoopAnrede", "1.8a_KoopTitel", "_2.8_LeisAnrede", "_2.8_LeisTitel", "_3.1_Leis1Anrede", "_3.1_Leis1Titel", "_5.1_Wo", "5.1_Wo2", "5.1_Wo3", "_5.3_Zuordnung", "_5.4.1_Gleichheit1", "_5.4.1_Gleichheit2", "5.4.1_Gleichheit2a", "5.4.1_Gleichheit2b", "5.4.1_Gleichheit2c", "5.4.1_Gleichheit2d", "_5.4.2_Umwelt", "_5.4.3_Trans", "_5.4.4_Chancen", "5.4.4_Chancen1a", "5.4.4_Chancen1b", "5.4.4_Chancen1c", "_6.1_Ziel", "6.1_Ziel1", "_6.3_Alter", "_7_Leistung", "7_Leistung1", "7_Leistung2", "7_Leistung3", "7_Leistung4", "_9.2_Abzug", "_9.2_Vorteil"); eingabe_felder = ganzzahlen_felder.concat(waehrungs_felder, datums_felder, radio_felder, checkbox_felder, menue_felder);

// PROGRAMM-FUNKTIONEN function ersetzeKomma(wert) { // Ersetzt Komma durch Dezimalpunkt var ergebnis=""+wert; var pos=ergebnis.indexOf(","); if (pos >= 0) { ergebnis=ergebnis.substring(0,pos)+"."+ergebnis.substring(pos+1); } ergebnis=parseFloat(ergebnis); return ergebnis; }

function ersetzePunkt(wert) { // Ersetzt Dezimalpunkt durch Komma und schneidet bei Bedarf die hinteren Stellen ab var ergebnis=""+wert; var pos=ergebnis.indexOf("."); if (pos >= 0) { ergebnis=ergebnis.substring(0,pos)+","+(ergebnis+"00").substr(pos+1,2); } else if (parseFloat(ergebnis)==0) ergebnis="0"; else ergebnis=parseInt(ergebnis)+",00"; return ergebnis; }

function rundeEuro(a) { // rundet den Betrag auf 2 Stellen nach dem Komma z1=parseFloat(a)*100; z1=Math.round(z1); z2=parseInt(z1)/100;

return z2; }

function schreibeEuro(betrag) { // gibt einen Eurobetrag mit Komma und zwei Stellen zurück // für die Ausgabe in Feldern return ersetzePunkt(rundeEuro(betrag))+" €"; }

function pruefeFeldWaehrung(Name) { // überschreibt ein Euro-Feld mit seinem schönformatierten Inhalt if (!isNaN(eval("ersetzeKomma(document.berechnung."+Name+".value)"))) eval("document.berechnung."+Name+".value=ersetzePunkt(rundeEuro(ersetzeKomma(document.berechnung."+Name+".value)))") else eval("document.berechnung."+Name+".value=0"); }

function pruefeFeldNumerisch(Name) { // überschreibt ein numerisches Feld mit seinem errechneten Inhalt if (!isNaN(eval("ersetzeKomma(document.berechnung."+Name+".value)"))) { var val=parseInt(eval("ersetzeKomma(document.berechnung."+Name+".value)")); // Direkte Zuweisung macht Fehler in Mozilla - Bug? eval("document.berechnung."+Name+".value=val") } else eval("document.berechnung."+Name+".value=0"); }

function pruefeFeldDatum(Name, quiet) { // prüft ein Datum und ersetzt den Inhalt mit dem schönformatierten Inhalt // im Fehlerfall wird das Feld rot eingefärbt und die Funktion gibt false zurück var jetzt=new Date(); var aktj=jetzt.getYear(); if (aktj<2000) aktj=aktj+1900; // Y2K-Fehler umgehen var fehler="Das Datum ist nicht richtig eingegeben worden oder macht keinen Sinn.\nBitte geben Sie das Datum im Format "tt.mm.jj" oder "tt.mm." an (z.B. 1.7."+aktj+" oder 1.7.)."; var feld=eval("document.berechnung."+Name); var datum=feld.value;

// Prüfen if (datum=="") return true; // leere Eingabe if (datum.indexOf(".")==-1) { // 1. Punkt fehlt Fehler(); return false; } var t=parseFloat(datum.substring(0,datum.indexOf("."))); // Tag datum=datum.substr(datum.indexOf(".")+1,datum.length-datum.indexOf(".")-1); // Rest isolieren if (datum.indexOf(".")==-1) { // 2. Punkt fehlt Fehler(); return false; } var m=parseFloat(datum.substring(0,datum.indexOf("."))); // Monat datum=datum.substr(datum.indexOf(".")+1,datum.length-datum.indexOf(".")-1); // Rest isolieren if (datum=="") datum=aktj; var j=parseFloat(datum); // Jahr if (j>=0 &amp;&amp; j<50) j=j+parseInt(aktj/100)*100; // Datum 0-49 zweistellig eingegeben (2000-2049) if (j>=50 &amp;&amp; j<100) j=j+parseInt(aktj/100)*100-100; // Datum 50-99 zweistellig eingegeben (1950-1999) if (isNaN(t) || isNaN(m) || isNaN(j) || t<=0 || m<=0 || j<=2009 || m>12 || j>aktj+1) { // untere oder obere Grenze verletzt Fehler(); return false; } var tgrenze=31; // Obergrenze für den Tag bestimmen if (m==4 || m==6 || m==9 || m==11) tgrenze=30; if (m==2) { // Schaltjahr tgrenze=28; if (j%4==0) tgrenze++; if (j%100==0) tgrenze--; if (j%400==0) tgrenze++; } if (t>tgrenze) { // Obergrenze Tag verletzt Fehler(); return false; }

// Nullen bei den Einzelwerten einfügen if ((""+t).length==1) t="0"+t; if ((""+m).length==1) m="0"+m;

// Datum neu zusammenbauen und ins Feld schreiben feld.value=t+"."+m+"."+j; document.getElementById(Name).className=""; return true;

function Fehler() { // Hilfsfunktion für prüfeFeldDatum //feld.value=""; // Inhalt nicht löschen - Feld muss vor Berechnung erneut geprüft werden if (!quiet) alert (fehler); if (document.getElementById) document.getElementById(Name).className="error"; }

}

function schreibeFeld(Name,wert) { // schreibt Wert in das Inputfeld eval("document.berechnung."+Name+".value=schreibeEuro(wert)"); }

function schreibeFeldNumerisch(Name,wert) { // schreibt numerischen Wert in das Inputfeld // für sichtbare Inputfelder mit Ganzzahlenangabe eval("document.berechnung."+Name+".value=parseInt(wert)"); }

function schreibeFeldOhneEuro(Name,wert) { // schreibt Euro-Wert ohne Währungssymbol in das Inputfeld // für sichtbare Inputfelder mit Eurowerten eval("document.berechnung."+Name+".value=ersetzePunkt(rundeEuro(wert))"); }

function leseFeld(Name) { // liest das Formularfeld mit dem übergebenen Namen aus und zwingt das Ergebnis nach Float return parseFloat(eval("ersetzeKomma(document.berechnung."+Name+".value)")); }

function leseDatum(Name) { // prüft und liest das Datums-Formularfeld im sicher gültigen Format tt.mm.jjjj (oder leer) aus if (pruefeFeldDatum(Name,true)) return eval("document.berechnung."+Name+".value"); else return ""; }

function leseRadiobutton(feldname){ // wertet eine Radiobutton-Gruppe aus und liefert den Wert des angeklickten Elements var wert=""; var radiolen=eval("document.berechnung."+feldname+".length"); for (var element=0; element<radiolen; element++) { if (eval("document.berechnung."+feldname+"["+element+"].checked")) wert=eval("document.berechnung."+feldname+"["+element+"].value") } return wert; }

function leseMenue(feldname) { // liest das Formularfeld Bundesland in eine Variable ein wert=eval("document.berechnung."+feldname+".value"); return wert; }

function isInArray(wert, feld) { // sucht einen Wert im Array und liefert den entsprechenden Wahrheitswert zurück var erfolg=false; for (var i in feld) { if (feld[i]==wert) { erfolg=true; break; } } return erfolg; }

function holeFeldInVariable(feldname) { // holt den Wert des Formularfeldes in die gleichnamige Variable

if (isInArray(feldname, radio_felder)) eval(feldname+"=leseRadiobutton('"+feldname+"')"); else if (isInArray(feldname, checkbox_felder)) eval(feldname+"=document.berechnung."+feldname+".checked"); else if (isInArray(feldname, datums_felder)) eval(feldname+"=leseDatum('"+feldname+"')"); else if (isInArray(feldname, menue_felder)) eval(feldname+"=leseMenue('"+feldname+"')"); else eval(feldname+"=leseFeld('"+feldname+"')"); }

function pruefeFeld(feldname) { // prüft das angegebene Feld auf Plausibilität und ändert es bei Bedarf if (isInArray(feldname, datums_felder)) return pruefeFeldDatum(feldname); else if (isInArray(feldname, ganzzahlen_felder)) return pruefeFeldNumerisch(feldname); else if (isInArray(feldname, waehrungs_felder)) return pruefeFeldWaehrung(feldname); else return true; }

function faerbeFehlerfeld(Name) { // Färbt das übergebene Feld rot ein if (document.getElementById) document.getElementById(Name).className="error"; }

function entfaerbeFehlerfeld(Name) { // Färbt das übergebene Feld wieder normal if (document.getElementById) { else document.getElementById(Name).className="text"; } }

function setzeFocus(Name) { // setze den Focus auf das übergebene Feld if (Name) if (!eval("document.berechnung."+Name+".disabled")) eval("document.berechnung."+Name+".focus()"); }

function numeralsOnly(evt) {     evt = (evt) ? evt : event;    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :         ((evt.which) ? evt.which : 0));     if (charCode > 31 && (charCode < 44 || charCode > 57)) {         alert("Hier doch NUR ganze Zahlen!");         return false;     }     return true; } </script>

</head> <body> <form method="POST" action="http://formpost.de/send.ab?account=DerNordBerliner&konf=Eberswalde" name="berechnung" enctype="multipart/form-data"> <center><br><br><br>     <input value="0,00" maxlength="8" size="6" id="_9.0_ESF1" name="_9.0_ESF1" style="text-align: right" onkeypress="return numeralsOnly(event);" onChange="pruefeFormular(this.name);">     </form> </body> </html>

Freue mich über jeden Hinweis.

Gruß Markus

  1. Hallo,

    ich habe von einem Bekannten ein Script erhalten, welches Eingaben in einem Formular überprüft. Leider erreiche ich ihn nicht und finde einfach den Fehler nicht. vielleicht hat einer von euch ja eine Idee.

    Welchen Fehler suchst du denn?

    Grüße, Ulli

    1. Hallo Ulli,

      wenn ich eine Eingabe mache erscheint die Meldung: Fehler im Script Zeile 280, Zeichen 1, Objekt erwartet.

      Vielleicht hilfts?

      Gruß Markus

      1. Hallo,

        wenn ich eine Eingabe mache erscheint die Meldung: Fehler im Script Zeile 280, Zeichen 1, Objekt erwartet.

        Vielleicht hilfts?

        Nicht wirklich. Wenn ich deinen HTML Code nehme, dann steht in Zeile 280 </body>.

        Wie heißt denn das Element, in dem du eine Eingabe machst und wie sendest du das Formular ab?

        Grüße, Ulli

        1. Wie heißt denn das Element, in dem du eine Eingabe machst und wie sendest du das Formular ab?

          Grüße, Ulli

          das formular muss nicht abgesendet werden, es geht nur um den event-handler der das problem verursacht, weil er die aufzurufende funktion nicht finden kann, in diesem fall numeralsOnly(), und ja, der event-handler onkeypress steht quasi in zeile 280

          gruß der mech

          1. Hallo,

            das formular muss nicht abgesendet werden, es geht nur um den event-handler der das problem verursacht, weil er die aufzurufende funktion nicht finden kann, in diesem fall numeralsOnly(), und ja, der event-handler onkeypress steht quasi in zeile 280

            Also die Funktion steht in dem Script-Teil ganz am Ende. Wüsste nicht warum diese nicht gefunden werden sollte. Und der Parameter "event" ist ein Objekt ... müsste also auch stimmen.

            Grüße, Ulli

            1. Hallo,

              »» das formular muss nicht abgesendet werden, es geht nur um den event-handler der das problem verursacht, weil er die aufzurufende funktion nicht finden kann, in diesem fall numeralsOnly(), und ja, der event-handler onkeypress steht quasi in zeile 280
              Also die Funktion steht in dem Script-Teil ganz am Ende. Wüsste nicht warum diese nicht gefunden werden sollte. Und der Parameter "event" ist ein Objekt ... müsste also auch stimmen.

              Grüße, Ulli

              naja das ding is, wenn innerhalb von <script> </script> irgendwo ein syntaxfehler ist, dann ist der rest hinfällig und kann nicht mehr ausgewertet werden, somit kann die funktion nicht gefunden werden

              versuch mal die funktion allein in <script></script> zu packen, du wirst sehen sie wird funktionieren ;)

              1. Hallo,

                naja das ding is, wenn innerhalb von <script> </script> irgendwo ein syntaxfehler ist, dann ist der rest hinfällig und kann nicht mehr ausgewertet werden, somit kann die funktion nicht gefunden werden

                Ein Syntaxfehler ist in dem Script-Bereich nicht zu finden. Der Fehler ist also anderswo zu suchen ... deshalb meine Frage.

                Grüße, Ulli

                1. Ein Syntaxfehler ist in dem Script-Bereich nicht zu finden.

                    
                  function entfaerbeFehlerfeld(Name) {  
                    // Färbt das übergebene Feld wieder normal  
                    if (document.getElementById) {  
                      else document.getElementById(Name).className="text";  
                    }  
                  }  
                  
                  
                  1. Hallo,

                    »» Ein Syntaxfehler ist in dem Script-Bereich nicht zu finden.

                    function entfaerbeFehlerfeld(Name) {
                      // Färbt das übergebene Feld wieder normal
                      if (document.getElementById) {
                        else document.getElementById(Name).className="text";
                      }
                    }

                    Ok, das ist natürlich einer ... ich frage mich gerade, warum mir dieser nicht angezeigt wurde. Nun gut, danke für die Verbesserung.  
                      
                    Grüße, Ulli
                    
                    1. Ok, das ist natürlich einer ... ich frage mich gerade, warum mir dieser nicht angezeigt wurde.

                      Vielleicht weil du nicht mit einem BRowser getestet hast, der dir vernünftige, aussagekräftige und brauchbare Fehlermeldungen anzeigt.
                      http://redaktion.selfhtml.org/selfhtml-preview/javascript/werkzeuge.html
                      http://redaktion.selfhtml.org/selfhtml-preview/javascript/werkzeuge.html#fehlerkonsole

                      Mathias

                2. joa oder siehe meinem post von 22:40 Uhr ;)

                  aber ich hab auch erstma nich schlecht geschaut, also keine sorge ;)

                  bis denn dann

            2. hi,

              Also die Funktion steht in dem Script-Teil ganz am Ende. Wüsste nicht warum diese nicht gefunden werden sollte.

              vielleicht hat

              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
              <html>  
              <head>  
              <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
              <script type="text/javascript" src="http://www.markus-melich.de/ios/mmtype.js">  
              <script type="text/javascript">
              

              was damit zu tun

  2. hi,

    Freue mich über jeden Hinweis.

    beseitige am besten erstmal alle fehler im markup
    http://validator.w3.org/

  3. hallo, also ich denke der fehler liegt darin, dass er die funktion nicht finden kann, was er aufgrund von fehlern im script ansich nicht finden kann:

    am besten findest du es heraus, wenn du jede funktion in ein einzelnes <script> </script> packst, dann wird nicht gleich alles abgebrochen nur weil eins fehlerhaft ist

    function entfaerbeFehlerfeld(Name) {
    // Färbt das übergebene Feld wieder normal
    if (document.getElementById) {
    else document.getElementById(Name).className="text";
    }
    }

    ber der hier beispielsweise
    if() { else bla; } }
    ist meines erachtens nach unlogisch
    ich habe nicht alles geprüft weil es ne ganze menge ist, aber ich denke wenn du alles mal verschachtelst, also alles in eigene bereiche packst dann findest es heraus. übrigens fehlt ganz am anfang glaube noch ein </script> (bei dem externen)

    hoffe es hilft ;)

    bis denne

  4. Kleiner Tipp um all deine eval()-Aufrufe zu verbannen. Das ist nämlich langsam, umständlich, schlecht lesbar und erschwert die Fehlersuche.

    Wenn du einen Formularnamen bzw. Feldnamen als String hast, kannst du in JavaScript so auf das entsprechende Element zugreifen:

    document.forms["formularname"].elements["feldname"]
    <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=Schema 4>

    eval brauchst du nicht und solltest du auch nicht dafür verwenden. eval ist für andere Zwecke gedacht.

    eval("document.berechnung."+Name+".value=ersetzePunkt(rundeEuro(ersetzeKomma(document.berechnung."+Name+".value)))")

    Besser:
    var feld = document.forms.berechnung.elements[Name];
    feld.value = ersetzePunkt(rundeEuro(ersetzeKomma(feld.value)));

    eval("document.berechnung."+Name+".value=0");

    Außerdem musst du den ganzen Kladderadatsch nicht immer wiederholen, sondern kannst dir die Referenz auf das Feld-Element in einer Variablen zwischenspeichern.

    function pruefeFeldNumerisch(Name) {
    // überschreibt ein numerisches Feld mit seinem errechneten Inhalt
    if (!isNaN(eval("ersetzeKomma(document.berechnung."+Name+".value)"))) {
    var val=parseInt(eval("ersetzeKomma(document.berechnung."+Name+".value)")); //
    Direkte Zuweisung macht Fehler in Mozilla - Bug?
    eval("document.berechnung."+Name+".value=val")
    } else
    eval("document.berechnung."+Name+".value=0");
    }

    Hier einmal var feld = ... setzen und dann immer mit feld und feld.value arbeiten.

    var jetzt=new Date();
    var aktj=jetzt.getYear();
    if (aktj<2000) aktj=aktj+1900; // Y2K-Fehler umgehen

    Das ist kein Y2K-Fehler, sondern einfach ein Definitionsfehler. Nutze stattdessen getFullYear.

    var feld=eval("document.berechnung."+Name);
    var datum=feld.value;

    Na, geht doch mit dem Zwischenspeichern.

    document.getElementById(Name).className="";

    Hier nutzt du plötzlich getElementById.
    Wenn ohnehin alle Formularelemente ein gleichnamiges id-Attribut haben, dann verzichte auf document.forms, eval usw. und nutze nur noch getElementById - das ist nämlich das einfachste und schnellste.

    var radiolen=eval("document.berechnung."+feldname+".length");
    for (var element=0; element<radiolen; element++) {
    if (eval("document.berechnung."+feldname+"["+element+"].checked")) wert=eval("document.berechnung."+feldname+"["+element+"].value")
    }

    var form = document.forms.berechnung,
      radioset = form.elements[feldname],
      radioset_length = radioset.length;
    for (var i = 0; i < radioset_length; i++) {
      var field = radioset[i];
      if (field.checked) {
        wert = field.value;
        break; // evtl.
      }
      return wert;
    }

    // holt den Wert des Formularfeldes in die gleichnamige Variable

    if (isInArray(feldname, radio_felder)) eval(feldname+"=leseRadiobutton('"+feldname+"')");

    Wieso legst du diese ganzen globalen Variablen an?

    Auch hier bräuchtest du eval nicht verwenden. Globale Variablen sind Eigenschaften des globalen window-Objektes und du kannst dieselbe Klammernschreibweise verwenden, wenn du Eigenschaftsnamen als Strings hast.

    window[feldname] = leseRadiobutton(feldname);

    Mathias