Felix Riesterer: Javascript Fehlermeldungen

Beitrag lesen

Lieber Chester Copperpott,

oh je, wo soll ich anfangen?

Lass mich die in Deinem Beispiel nicht genutzten Dinge einmal ausblenden:

wmtt = null;
document.onmousemove = updateWMTT;
function updateWMTT(e) {
  if (wmtt != null && wmtt.style.display == 'block') {
    x = (e.pageX ? e.pageX : window.event.x) + wmtt.offsetParent.scrollLeft - wmtt.offsetParent.offsetLeft;
    y = (e.pageY ? e.pageY : window.event.y) + wmtt.offsetParent.scrollTop - wmtt.offsetParent.offsetTop;
    wmtt.style.left = (x + 3) + "px";
    wmtt.style.top   = (y + 3) + "px";
  }
}
function showWMTT(id) {
  wmtt = document.getElementById(id);
  wmtt.style.display = "block";
}
function hideWMTT() {
  wmtt.style.display = "none";
}

Diese wmtt-Sache kann bei Dir deshalb nicht funktionieren, da Du der Funktion showWMTT als ID den String '1' übergibst, der dann in der Funktion ein Element mit dieser ID finden will. Genau hier gibt es aber zwei Probleme:

1.) Ein Element mit id="1" gibt es in Deinem Code nicht.
2.) Eine simple Zahl ist als ID-Wert nicht erlaubt!

Wenn nun Deine showWMTT-Funktion mit getElementById() kein Element findet, dann erhält die Variablen wmtt den Wert null. Dieses Objekt kennt keine Eigenschaft namens "style", noch viel weniger ein Unterobjekt dieses Namens, das eine Eigenschaft "display" hätte. Daher sollte jedes Mal beim Überfahren mit der Maus eine entsprechende Fehlermeldung (so in etwa "wmtt.style has no property" oder "wmtt is null") ausgeben. Und bedenke: Wer mit JavaScript hantiert, der sollte zwingend in die Fehlerkonsole seines Browsers schauen!

warum der Tooltip nicht funktioniert ist mir auch schleierhaft...

Das hätten wir ja jetzt gelöst.

Nun zu den wirklich interessanten Teilen Deiner Programmiererei.

mit diesem code funktioniert jetzt die Fehlerabfrage,

Wie hast Du das überprüft? Doch nicht etwa nur durch die Tatsache, dass das Formular abgesandt wird?

allerdings wird jetzt nur die mail abgeschickt, wenn man zuerst alle Felder richtig ausgefüllt hat. Wenn man etwas falsch gemacht hat, kommt die Fehlermeldung, wenn man es dann korrigiert und abschickt geht nur eine leere Alertbox auf...

Dass da "nur eine leere Alertbox" aufgeht, liegt daran, dass Deine Funktion "Fehler" eine Variable namens "fehler" benutzt, die nicht unbedingt existieren muss. Auch hier könnte die Fehlerkonsole Deines Browsers wesentliche Hinweise liefern!

Es wäre viel sinnvoller, die Funktion "Fehler" so umzustricken, dass sie einen Wert entgegen nimmt, um diesen dann auszugeben. Noch sinnvoller erscheint mir, die alert-Ausgabe gleich in der checkmail-Funktion vorzunehmen. Denn wenn kein Fehler da ist, warum sollte der User dann überhaupt mit einem alert belästigt werden? Also ist in Deinem konkreten Beispiel das Auslagern der Fehlermeldung nicht sinnvoll.

<script language="JavaScript1.2" type="text/javascript">

Streiche das language-Attribut ersatzlos. Es ist seit vielen Jahren nicht mehr sinnvoll.

var a,b,c = 0;
    var fehler = "";

Globale Variablen mögen für Dich im Moment sinnvoll sein, aber je weiter Du in die Materie einsteigst, desto weniger sind sie zu empfehlen. Das geht auch anders.

function checkmail(mail)
[...]
        if(document.Formular.mail.value == "" || document.Formular.mail.value.indexOf("@") == -1)
[...]
    function checkall()
[...]
        if(document.Formular.mail.value == "" || document.Formular.mail.value.indexOf("@") == -1)

Ist da nicht etwas redundant? Wenn Du in checkall das Feld mit der Mailadresse prüfst, warum brauchst Du die Funktion checkmail überhaupt? Und wenn Du diese Funktion unabhängig von checkall verwenden möchtest, warum notierst Du dann den Code erneut, anstatt checkmail stattdessen aus checkall heraus aufzurufen?

Eine Kleinigkeit an dieser Stelle: Die Funktion checkmail erwartet einen Parameter, den sie in der (lokalen) Variablen "mail" ablegt. Diese nutzt Du nicht, sondern greifst in checkmail direkt auf die Werte in den Eingabefeldern zu. Damit hätte sich die Werteübergabe eigentlich erledigt! Es sei denn, Du möchtest diese Funktion prinzipiell immer wieder als Prüffunktion für Mailadressen nutzen und in andere Scripte einbinden. Dann sollte aber checkall umso mehr diese Prüfung checkmail überlassen, anstatt die Prüfung selbst vorzunehmen:

function checkall() {  
...  
    if (checkmail(document.Formular.mail.value)) {  
        // Adresse scheint OK  
    } else {  
        // Adresse offensichtlich nicht plausibel  
    }  
...  
}  
  
function checkmail(mail)  
    return (typeof(mail) == "string" && mail.indexOf("@") > 0);  
}

Dir ist hoffentlich klar, dass der Besucher JavaScript nicht zulassen muss, sodass Deine Prüfungen nur den Wert einer Hilfestellung haben können. Eine Überprüfung auf Gültigkeit und Plausibilität der Daten muss(!!) zwingend auf der Serverseite erfolgen.

<form name="Formular" method="post" action="mailto:marcel.laskus@gmail.com" enctype="text/plain" onsubmit="return checkall()">

Oh, Du sendest die Daten ja gar nicht an einen Server, sondern setzt darauf, dass der Besucher ein Mailprogramm installiert hat, welches durch das mailto-Pseudoprotokoll vom Browser aus aufgerufen werden soll. Tja, wer an einem fremden Rechner sitzt (Beruf, Internetcafé etc.) wird kaum eine Mail an Dich versenden. Da wäre ein echtes Kontaktformular, welches von einem serverseitigen Script beantwortet wird, das seinerseits eine echte Mail generiert und versendet, wesentlichst sinnvoller. Gerade Benutzer wie ich, die ihre Mails grundsätzlich über ein Webinterface verwalten, haben kein Mailprogramm in Benutzung, da sie ja im Browser auf der Website ihr Mailprogramm überall auf jedem System (PC, Smartphone, Tablet, Fremdrechner) gleich haben.

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)