Alter berechnen nur mit JavaScript
1. Februar 2009 Roland
- Programmierung
- Variablenzuweisungen und Berechnungen
- Alter berechnen nur mit JavaScript
- Alter berechnen mit und ohne Javascript
- Code Optimierung
- Client Server Applikationsarchitektur
- Eigenschaften eines Webbrowsers
- Stylesheets
- Interaktive Webclients
- Mit HTML, oder SVG, interaktive Ein- Ausgaben erstellen
- Mit JavaScript aus einem Dokument Daten lesen
- Der Webserver
- Webserver-seitige Programmierung
- Datenbankanbindung
- Architekturprinzip Separation of Concerns
- Beschreibung von Anwendungsfällen
- Mit JavaScript einen wiederkehrenden Event erzeugen
- Kommunikationswege bei Einsatz von Java auf dem Webclient
- Einbinden der JavaScript Timer Klasse in eine Webseite
- AJAX Kommunikation ohne Fassaden Pattern
- JavaScript Klassen mit Object-Literal Syntax erstellen
- Knackpunkte bei der Klasse AsyncCommunication
- Speicherverbrauch in AJAX Applikationen
- Auch bei JavaScript immer die Variablen sauber deklarieren
- Eventhandler im JavaScript mit dem HTML Dokument verknüpfen
- Objekte in JavaScript mit JSON deklarieren
In Variablenzuweisungen und Berechnungen haben wir die Eingabefelder für das Geburtsdatum erstellt. Jetzt wollen wir eine Berechnung für das Alter in Tagen erstellen.
Modifikationen an der bestehenden Oberfläche
Die Eingabefelder (mit id=”day”, id=”month” und id=”year” im HTML Code gekennzeichnet) können uns die notwendigen Werte liefern. Im Variablen Übung Teil 2 seht ihr die modifizierte Eingabeoberfläche. Ich habe einen Paragraph mit der id=”dynamic_message” eingefügt. In diesem Paragraph werden wir dass Alter oder eventuell auftretende Fehlermeldungen ausgeben. Bei der Jahreseingabe habe ich noch ein onblur=”calculateAgeInDays()” Attribut und ein onchange=”calculateAgeInDays()” Attribut eingeführt. Das onblur Attribut sorgt dafür, dass beim Verlassen der Jahreseingabe die JavaScript Funktion calculateAgeInDays() aufgerufen wird. Das onchange Attribut startet die Berechnung sobald sich das Jahr verändert. Die Javascript Funktion habe ich in einer extra Datei “variablen_uebung_2.js” eingefügt. Und im Head der HTML Datei sorge ich mit <script type=”text/javascript” src=”variablen_uebung_2.js”></script> dafür, dass die JavaScript Datei geladen wird.
Die Javascript Datei
Hier habe ich zwei Funktionen geschrieben. Die Funktion calculateAgeInDays() liest aus der Oberfläche die Eingabevariablen aus, ruft die Funktion checkDate() auf und generiert die entsprechende Ausgabe. Die Funktion checkDate() kontrolliert, ob dass vom Anwender eingegebene Datum überhaupt einem korrekten Datum entspricht. Ein 30. Februar gibt es nie. Falls der Februar kein Schaltjahr ist und dennoch ein 29. Februar ausgewählt wurde, mögen wir das auch nicht. Somit können wir sicher stellen, dass die meisten Falscheingaben des Anwenders verhindert werden.
Hier der JavaScript Code:
-
/**
-
* Berechnet das Alter eines Menschen in Tagen.
-
* Diese Funktion ließt die Variablen day, month und year aus der Oberfläche
-
* aus.
-
*/
-
function calculateAgeInDays(){
-
var birthDay = parseInt(document.getElementById("day").value);
-
var birthMonth = parseInt(document.getElementById("month").value);
-
var birthYear = parseInt(document.getElementById("year").value);
-
if(checkDate(birthYear, birthMonth, birthDay) == false){
-
document.getElementById("dynamic_message").innerHTML
-
= "Dieses Datum ("
-
+birthDay
-
+"."
-
+birthMonth
-
+"."
-
+birthYear
-
+") gibt es nicht";
-
return;
-
}
-
// Das Datum scheint korrekt zu sein.
-
// Subtrahiere vom aktuellen Datum das übergebene Datum.
-
var currentDate = new Date();
-
var birthDate = new Date(birthYear, birthMonth-1, birthDay);
-
var delta = currentDate.getTime() – birthDate.getTime();
-
// Ein Tag ist 1000*60*60*24 Millisekunden.
-
var ageInDays = delta / (1000*60*60*24);
-
// Beim Runden wird der aktuelle Tag hinzugefügt. Also einen Tag weniger.
-
var ageInDays = Math.round(ageInDays)-1;
-
document.getElementById("dynamic_message").innerHTML
-
= "Du bist "+ageInDays+" Tage alt";
-
}
-
-
/**
-
* Kontrolliert, ob mit den übergebenen Variablen day, month, year ein
-
* vernünftiges Datum dargestellt werden kann. Beispielsweise kann Februar
-
* keine 31 Tage haben.
-
* @param year Der Integer Wert des Jahres.
-
* @param day Der Integer Wert des Tages.
-
* @param month Der Integer Wert des Monats.
-
* @return true Die Zahlen stellen ein korrektes Datum dar, ansonsten false.
-
*/
-
function checkDate(year, month, day){
-
// Beim Date Objekt werden Monate von 0 bis 11 gezählt.
-
month = month-1;
-
// Date generiert ein Datum auch mit falschen Zahlenwerten.
-
// So wird z.B. 2009, 11, 31 ein Datum 2009, 12, 1 erzeugen.
-
var checkDate = new Date(year, month, day);
-
if( (checkDate.getDate() == day)
-
&& (checkDate.getMonth() == month)
-
&& (checkDate.getFullYear() == year)
-
){
-
return true;
-
}
-
return false;
-
}
Frage an die Kursteilnehmer
Die hier vorgestellte Lösung hat zwar unseren Auftrag dass Alter eines Menschen in Jahren zu ermitteln, aber irgendwie ist es noch nicht rund. Könnt ihr mir bitte sagen was wir noch alles besser machen können? Fragestellungen sind unter Anderem:
- Was passiert, wenn kein JavaScript im Browser aktiviert ist?
- Wie können wir dass umbauen, wenn kein JavaScript vorhanden ist?
- Wie könnte die Eingabe und die Datenüberprüfung für den Anwender besser gestaltet werden? (Tipp: Die Reihenfolge der Auswahlboxen könnte eventuell verändert werden)
Der Beitrag wurde
am Sonntag, den 1. Februar 2009 um 00:57 Uhr veröffentlicht
und wurde unter Programmieren abgelegt.
Kurzlink: http://www.baldenhofer.eu/blog/?p=108
Dir gefiel der Artikel? Dann abonniere doch den RSS Feed![]()
Du kannst die Kommentare zu diesem Eintrag durch den RSS 2.0 Feed verfolgen. Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.









Fügt man z.B. einen Button ein, welcher calculateAgeInDays() ausführt, ist dieser bei deaktiviertem JavaScript zwar noch vorhanden allerdings führt er nicht mehr die Berechnung aus.
Es gibt Möglichkeiten zu prüfen ob im BrowserJavaScript aktiviert ist, und je nachdem kann man alternativ PHP anzeigen bzw. auf eine Seite verweisen wo diese Funktionen dann wieder mit Hilfe von PHP verfügbar sind…dadurch entsteht aber doppelter Code.
Man kann natürlich auch Meldungen ausgeben in denen der Benutzer die Info erhält JavaScript zu aktivieren…was aber auch nicht sehr Benutzerfreundlich ist…
Ich wäre dafür diese Funktion mit Hilfe von PHP zu lösen.
Ist zwar von der Geschwindigkeit langsamer, aber man ist auf der sicheren Seite. oder?
Man könnte doch zu jedem Monat nur die passenden Tage anzeigen lassen. Man wählt z.B. zuerst Februar und erhält dann auch nur 28 Tage zur Auswahl.
Habe den Code getestet und verbessert. So wie er oben steht, funktioniert er bei mir.
Änderungen waren: Selectfelder in eine <form id="identifier"></form> stecken und über die ID des form und dann über die id des select Feldes anzusprechen, statt eine parseint Abfrage zu starten, wie Roland es vorgeschlagen hat. Parseint funktioniert für Edit und andere Felder, aber nicht für Select. HTML Code gekennzeichnet) können uns die notwendigen Werte liefern.
Außerdem habe ich eine Zeile in der Funktion hinzugefügt, die das eingegebene Alter überprüft, weil die getYear function bei mir für 19XX Jahre jeweils nur XX zurückgegeben hat. Also habe ich eine OR Bedingung eingefügt, die überprüft ob alle vier oder wenigstens die letzten zwei Zeichen übereinstimmen.
Viel Spaß!
Hallo Joscha,
ich habe mir deinen Kommentar nun mehrmals durchgelesen und glaube allmählich verstanden zu haben, was du mir eigentlich sagen willst.
Mir ist klar geworden, dass der Unterschied zwischen HTML und JavaScript Komponenten nicht klar ist. Aus diesem Grund werde ich nach der dritten Übung verstärkt auf die Grundlagen eingehen.
Pareint ist eine JavaScript Funktion die aus einem String den entsprechenden Zahlenwert, falls vorhanden, ausliest. Das klappt bei allen nur denkbaren Elementen die im HTML-Dokument vorhanden sind. Pareint gibt es annähernd bei allen Programmiersprachen. Wenn du einen String hast ist das nicht zwingend notwendigerweise eine Zahl. Mit Funktionen, wie Parseint, werden Strings in Zahlen umgewandelt. Ich werde auf alle Fälle auf Typsicherheit und so weiter eingehen.
Bis denne
Roland
Hallole!
Ute hat gestern den Joscha Text so angepasst, dass man den Inhalt lesen kann. Vielen Dank dafür.
Joscha und Jozo:
Wenn ihr irgend etwas ändert, dann schreibt bitte einen neuen Blogeintrag und hängt ihn an. Oder kommentiert eure Änderungen nur.
Im Original Blogeintrag solltet ihr keine allzugroßen Änderungen vornehmen.
Beispielsweise war in diesem Blogeintrag im Einbinden von Javascript ein nicht valider Aufbau vorhanden. Vorher war hier Weiterhin waren ein paar defekte &Amp; Sonderzeichen vorhanden. So etwas kann auch weg.
Das Beispiel darf jedoch nicht verändert werden. Selbst wenn es falsch ist.
Wenn das Beispiel verändert wird, also neuer Code geschrieben wird, dann weiss man ja gar nicht mehr was da vorher drin gestanden ist.
Dann ist es schwierig die Änderungen zu erkennen
Also das geht dann nicht mehr.
Ich werde einen Blogeintrag über meine ersten Erkenntnisse mit dem Lehren und dem vollen Zugriff der “Schüler” schreiben. Bitte lest den dann mal durch gelle?