![]() |
|
|
Themen-Optionen |
|
|
#1
|
|
Newbie
![]() Registriert seit: 19.07.2012
Beiträge: 4
|
horizontales Säulendiagramm JavascriptHallo zusammen,
ich komme bei folgendem Programm nicht weiter. Es soll anhand von Prüfungsdaten ein Diagramm erstellt werden. Für jeden Teilnehmer eine Säule. Die Höhe entspricht dem Verhältnis seiner erreichten Punkte zum Maximum. (also bei 5 von 15 Punkten, 1/3 der Höhe) Ich habe bisher folgenden Code zum Einlesen der Daten: Code:
function erfasseDaten() {
var name = "";
var erreichtePunkte = 0;
var maxPunkte = 0;
var namen = [];
var punktzahlen = [];
while (name = prompt("Geben Sie den Namen des Prüfungsteilnehmers ein!", " ")) {
name = name.replace(/^\s+/,"");
if (!isNaN(name) || name == "") {
alert("Sie müssen einen gültigen Namen eingeben!");
}
else {
namen.push(name);
while (erreichtePunktzahl = prompt("Geben Sie die erreichte Punktzahl des Teilnehmers ein!", " ")) {
erreichtePunktzahl = erreichtePunktzahl.replace(/^\s+/,"");
if (isNaN(erreichtePunktzahl) || erreichtePunktzahl == "") {
alert("Sie müssen eine gültige Zahl eingeben!");
}
else {
punktzahlen.push(erreichtePunktzahl);
break;
}
}
maxPunkte = prompt("Geben Sie die maximal erreichbare Punktzahl ein!");
maxPunkte = parseInt(punktzahlen / maxPunkte * 100);
}
}
}
Danke! Gruss |
|
|
|
#2
|
|
Posting-Frequenz: 14µHz
![]() ![]() ![]() ![]() ![]() Registriert seit: 03.02.2006
Ort: Dresden
Beiträge: 3.230
|
Ich nehme an, das ist eine Art Schulaufgabe o.ä., sonst könnte ich den Verbot von externen Bibliotheken nicht verstehen. Deshalb bin ich gezielt vage in meiner Antwort, schließlich sollst du ja etwas aus der Übung lernen:
Ein Säulendiagramm besteht aus mehreren Rechtecken, dessen jeweilige Ausmaße ihren Wert anzeigen. Ein Rechteck ist eine Fläche mit Höhe und Breite. Um ein Rechteck anzuzeigen, kannst (abgesehen von Bildern) einfach ein <div>-Element erzeugen und entsprechend farbig markieren. Diesem kannst du sehr einfach per CSS Höhe und Breite geben. Diese Parameter wiederum kannst du mit JavaScript beeinflussen/ändern. Kurz: erzeuge ein paar <div>s und gib ihnen per JS die korrekten Ausmaße. Duddle
__________________
»To a cosmologist, a hundred thousand light-years rounds down to zero.« - RobotRollCall |
|
|
|
#3
|
|
Photonensammler
![]() ![]() ![]() ![]() Registriert seit: 27.08.2006
Ort: D-68723
Beiträge: 1.899
Kamera: Canon EOS 500D, Tamron SP AF 17-50mm 2,8 XR Di II VC |
Vielleicht hilft Dir das weiter:
http://mawosoft.de/tips_js_chart.htm
__________________
Meine Bilder auf flickr und Panoramio Informationsfluss im Forum verbessern Wenn Dir Motive fehlen, geh' ohne Kamera auf die Straße und Du wirst 1.000 Motive finden. |
|
|
|
#4
|
|
Newbie
![]() Themenstarter
Registriert seit: 19.07.2012
Beiträge: 4
|
@Duddle:
Ich habe von einem Freund ein Lernheft bekommen, da ich privat Javascript lernen wollte. Aus der Schule bin ich schon eine Weile raus ...also ich habe nun folgenden Code. HTML HTML-Code:
<!DOCTYPE html> <html> <head> <title>Prüfungsauswertung</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="prüfungsauswertung.css"/> <script type="text/javascript" src="prüfungsauswertung.js"></script> </head> <body> <button onclick="erfasseDaten()">Teilnehmer hinzufügen</button> <h4>Diagramm</h4> <div id="diagram"> <div id="bar"></div> <div id="beschriftung"></div> </div> </body> </html> Code:
body {
font-family: verdana;
}
h4 {
color: #0000ff;
}
#diagram {
width: 600px;
border: 1px solid #000000;
padding: 5px;
}
#bar {
border: 1px solid #000000;
width: 20px;
background-color: green;
font-weight: bold;
color: #FFFFFF;
text-align: center;
display: block;
font-size: 8pt;
}
#beschriftung {
width: 100%;
display: block;
margin: 10px 0;
font-size: 9pt;
font-weight: bold;
color: #000000;
}
Code:
function erfasseDaten() {
var name = "";
var erreichtePunkte = 0;
var maxPunkte = 0;
var namen = [];
var punktzahlen = [];
while (name = prompt("Geben Sie den Namen des Prüfungsteilnehmers ein!", " ")) {
name = name.replace(/^\s+/,"");
if (!isNaN(name) || name == "") {
alert("Sie müssen einen gültigen Namen eingeben!");
}
else {
namen.push(name);
while (erreichtePunktzahl = prompt("Geben Sie die erreichte Punktzahl des Teilnehmers ein!", " ")) {
erreichtePunktzahl = erreichtePunktzahl.replace(/^\s+/,"");
if (isNaN(erreichtePunktzahl) || erreichtePunktzahl == "") {
alert("Sie müssen eine gültige Zahl eingeben!");
}
else {
punktzahlen.push(erreichtePunktzahl);
break;
}
}
maxPunkte = prompt("Geben Sie die maximal erreichbare Punktzahl ein!");
maxPunkte = parseInt(punktzahlen / maxPunkte * 100);
}
}
erstelleDiagramm(namen, punktzahlen, maxPunkte);
}
function erstelleDiagramm(beschr, wert, maxWert) {
document.getElementById("bar").style.height += wert / maxWert * 100;
document.getElementById("beschriftung").innerHTML += beschr;
}
|
|
|
|
#5
|
|
Posting-Frequenz: 14µHz
![]() ![]() ![]() ![]() ![]() Registriert seit: 03.02.2006
Ort: Dresden
Beiträge: 3.230
|
Dann lade dir erstmal FireBug für den Firefox runter, damit wird das debuggen deutlich einfacher. Darin kannst du dir u.a. die ganzen Objekte genau anschauen und ausgeben lassen, selektiv CSS-Eigenschaften de/aktivieren usw.
Du machst mehrere Dinge seltsam: erstens solltest du wohl solange die Ausgabe nicht stimmt mit statischen Testdaten arbeiten, damit du die nicht immer eingeben musst. Sobald die korrekt angezeigt werden, kannst du da Variablen und Nutzereingaben reinbringen. Zweitens übergibst du an erstelleDiagramm() drei Parameter: beschr ist ein String, wert ein Array von Strings, maxWert ist eine Zahl. Kritisch ist dabei das Array, besonders weil du damit rechnen willst. Entweder musst du über alle übergebenen Werte durchlaufen und für jeden Einzelwert etwas berechnen/tun, oder du nimmst vom Array den n-ten Eintrag (sinnvoll wäre n=0), oder du übergibst vorher schon den korrekten Wert statt dem Array an die Funktion. Drittens gibst du dem height-Attribut einen festen Wert (bzw. hast es vor), aber ohne Einheit. Ein Element mit "height:50;" ist nicht das gleiche wie "height:50px;" oder "height:50%;" und nur die letzten beiden Versionen funktionieren. Viertens: sowas wie Code:
maxPunkte = parseInt(punktzahlen / maxPunkte * 100); Zusammengefasst also: fang von der anderen Seite an. Konstruiere ein statisches Diagramm mit normalem HTML und CSS. Dann schreib eine Funktion zum Verändern dieser Werte. Dann zum Erzeugen / Verändern des HTML-Teils. Danach kannst du diese Funktion parametrisieren und mit Nutzereingaben füllen. Duddle
__________________
»To a cosmologist, a hundred thousand light-years rounds down to zero.« - RobotRollCall |
|
|
|
#6
|
|
Newbie
![]() Themenstarter
Registriert seit: 19.07.2012
Beiträge: 4
|
@Duddle
ich möchte dich nicht nerven mit dem Programm, aber ich komme da einfach nicht richtig weiter. Es wird zwar jetzt ein Balken richtig erzeugt, aber nur für den ersten eingegebenen Teilnehmer. Sobald ich weitere Teilnehmer erfasse, wird zwar der Name notiert aber kein Balken erzeugt. Es soll ja automatisch für jeden erfassten Teilnehmer ein Balken erzeugt werden. Insgesamt so viele Balken wie auch Teilnehmer eingetragen wurden. JavaScript Code: Code:
function erfasseDaten() {
var name;
var erreichtePunktzahl = 0;
var maxPunkte = 0;
var namen = [];
var punktzahlen = [];
while (name = prompt("Geben Sie den Namen des Prüfungsteilnehmers ein!", " ")) {
name = name.replace(/^\s+/,"");
if (!isNaN(name) || name == "") {
alert("Sie müssen einen gültigen Namen eingeben!");
}
else {
namen.push(name);
while (erreichtePunktzahl = prompt("Geben Sie die erreichte Punktzahl des Teilnehmers ein!", " ")) {
erreichtePunktzahl = erreichtePunktzahl.replace(/^\s+/,"");
if (isNaN(erreichtePunktzahl) || erreichtePunktzahl == "") {
alert("Sie müssen eine gültige Zahl eingeben!");
}
else {
punktzahlen.push(erreichtePunktzahl);
break;
}
}
maxPunkte = prompt("Geben Sie die maximal erreichbare Punktzahl ein!");
maxPunkte = parseInt(erreichtePunktzahl / maxPunkte * 100) + "px";
}
}
erstelleDiagramm(namen, maxPunkte);
}
function erstelleDiagramm(beschr, maxWert) {
document.getElementById("bar").style.height += maxWert;
document.getElementById("beschriftung").innerHTML += beschr;
}
Geändert von whitestar (22.07.2012 um 18:20 Uhr). |
|
|
|
#7
|
|
Posting-Frequenz: 14µHz
![]() ![]() ![]() ![]() ![]() Registriert seit: 03.02.2006
Ort: Dresden
Beiträge: 3.230
|
Wenn es mich nerven würde, würde ich nicht antworten.
Du scheinst aber meine Antwort nicht genau gelesen zu haben, da du immer noch wie wild Datentypen durcheinander wirfst und hoffst dass es irgendwie gut geht (bzw. erst garnicht verstehst, dass das ein Problem ergibt). namen ist ein Array. Du übergibst an erstelleDiagramm() also ein Array. In der Funktion selbst behandelst du den Parameter aber wie einen String. Das ist ein Fehler. maxPunkte ist nach dem prompt() ein String. In der direkt folgenden Zeile behandelst du es wie einen Zahlwert. Das ist ein Fehler. Oder zumindest eine Unsauberkeit. Das height-Attribut vom style-Objekt des Elementes mit ID "bar" ist ein String. Strings können nicht einfach addiert werden (bzw. der Additions-Operator bedeutet in dem Fall Konkatenation). Schau dir im FireBug an, welche Daten an erstelleDiagramm() übergeben werden. Dann simuliere die nächsten Schritte des Algorithmus von Hand mit statischem HTML. Du solltest dabei auf die große Hürde stoßen, auf die ich mehrmals hingewiesen habe. Duddle
__________________
»To a cosmologist, a hundred thousand light-years rounds down to zero.« - RobotRollCall |
|
|
|
#8
|
|
me[code].Java(Script)
![]() ![]() Registriert seit: 12.08.2007
Ort: Zuhause
Beiträge: 188
Verwendet: Adobe CS5 (PS/I/ID/Bridge/FL), Sublime Text 2, NetBeans, Blender, Pencil
|
hi
um dir den spaß an der sache nicht gänzlich zu verleiden, gebe ich mal mehr hilfestellung. außerdem gibt es menschen, die mehr durch "nachahmen" lernen als durch ausprobieren. allerdings solltest du dich hinsetzen und den code durcharbeiten, bis du wirklich verstehst was passiert! und, so wie Duddle schon sagte, solltest du dich wirklich hinsetzen und datentypen lernen. in deinem code sind (natürlich durch dein "stadium" bedingt) einige datentypenbasierte fehler bzw. recht unsinnige prüfungen (stichwort: isNaN()). falls du eher zu menschen gehörst die "nachahmen": PHP-Code:
wie gesagt, nur abtippen nützt dir nichts. allerdings vermute ich, dass du den code so oder so durchgehst und für dich ausarbeitest, wo denn grundsätzliche unterschiede sind, welche teile du nicht bedacht hast oder wo du dinge vielleicht anders machen würdest als ich. hoffe das hilft
__________________
Nichts ist so gerecht verteilt wie der Verstand. Jeder denkt, er hätte genug. |
|
|
|
#9
|
|
Newbie
![]() Themenstarter
Registriert seit: 19.07.2012
Beiträge: 4
|
das war schon sehr hilfreich, danke.
@mindraper der balken wird allerdings immer nur einmal erzeugt. Wo liegt denn da noch der Fehler? Eine letzte Frage habe ich noch. Wie kann man jeden Balken, der erzeugt wird (anzahl ist ja anfangs unbekannt), in einer anderen Farbe darstellen? |
|
|
|
#10
|
|
me[code].Java(Script)
![]() ![]() Registriert seit: 12.08.2007
Ort: Zuhause
Beiträge: 188
Verwendet: Adobe CS5 (PS/I/ID/Bridge/FL), Sublime Text 2, NetBeans, Blender, Pencil
|
hi
oh, sorry. das hab' ich übersehen in der function "erstelleDiagramm()" gibt es folgende stelle: PHP-Code:
nur noch ein tipp: am einfachsten geht das leeren mit innerHTML = ''; beim einfärben der balken kann ich dir helfen. zunächst einmal: farben können mit css entweder über hexadezimale werte, mit definierten schlüsselwörtern oder mit rgb-werten gesetzt werden. für das erzeugen von zufälligen farben ist letzteres das einfachste. um rgb-farbwerte in css zu setzen, wird "rgb(ROTANTEIL, GRÜNANTEIL, BLAUANTEIL)" geschrieben. jeder anteil eines farbkanals kann zwischen 0 und 255 liegen. den anteil mit javascript zu generieren ist eigentlich ganz einfach: PHP-Code:
für den geplanten ansatz ist es einfacher, das erzeugen der farbkanalanteile in eine function auszulagern, die jedesmal den kompletten css farbwert auf das balkenelement setzt, wenn dieses erzeugt wird: PHP-Code:
PHP-Code:
__________________
Nichts ist so gerecht verteilt wie der Verstand. Jeder denkt, er hätte genug. |
|
![]() |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Horizontales Dropdown | AxelM | (X)HTML & CSS | 4 | 28.02.2012 10:40 |
| Horizontales und vertikales Zentrieren von DIV's | Crackp0t | (X)HTML & CSS | 8 | 21.03.2010 15:16 |
| horizontales menü mit untermenü für ie6 | afr0kalypse | (X)HTML & CSS | 2 | 05.08.2009 16:13 |
| horizontales Menü | Can_nim | Trash | 2 | 30.07.2008 22:01 |
| Horizontales Menu | BillaB | (X)HTML & CSS | 3 | 21.10.2007 13:46 |
-
Reklame
-
-
- Ebenen verkleinern sich nicht
- Mit JavaScript geladenes Bild an Fenstergröße anpassen
- [DwCS6] Editor-Extensions/Plugins für SASS/LESS
- bilder beim draufklicken verlinken
- Hybrid Festplatte lohnt das?
- MySQL - Feldname aus anderer Tabelle
- mit pyrocluster wasser eigenschafften
- Bedienung Intuos 4
- Logo für Hobbyfotograf
- Nach Seitenaufbau eine Sekunde warten - dann Funktion aufrufen
- Joomla 2.5 - Animation in einen Beitrag einfügen
- Schriftart gesucht
- Vektor Bild halbieren
- Schrift an Rahmen (Oval Logo) anpassen
- Hallo oder wie es bei uns heißt SERWAS!!!
- Mein neues Hobby: Fotografieren
- Broschüre Erstelle
- gehen euch die Themen aus ?
- noch 81 Stunden bis zum neuen punktefreien Inhalt
- Beleuchtung VRAY
-
-
Aktuelles Commag
Anzeige
-
Anzeige










Social Media