Forum: PC-Programmierung Javascript Problem


von Kilian K. (kellermaaan)


Lesenswert?

Hallo zusammen,

da ich noch nicht so wirklich mit Javascript gearbeitet habe, komme ich 
bei einem möglichen einfachen Problem nicht weiter und hoffe hier könnte 
mir jemand helfen!
1
<script language="JavaScript">
2
    <!--
3
        var mylabels = new Array();
4
        var myvalues = new Array();
5
        function getMeasureVal() {
6
        var request = false;
7
        function measureComplete() {
8
            if (request.readyState == 4) {
9
                if (request.status == 200) {
10
                    alert(request.responseText);
11
                }
12
            }
13
        }
14
        if (window.XMLHttpRequest) {
15
            request = new XMLHttpRequest();
16
        }
17
        else if (window.ActiveXObject) {
18
            request = new ActiveXObject("Microsoft.XMLHTTP");
19
        }
20
        if (request) {
21
            request.open("GET", "/measuervaluesget?id=" + Math.random(), true);
22
            request.onreadystatechange = measureComplete;
23
            request.send(null);
24
        }
25
    }
26
    
27
    var lineChartData = {
28
        labels : mylabels,
29
        datasets : [
30
            {
31
                label: "My Second dataset",
32
        fillColor : "rgba(151,187,205,0.2)",
33
        strokeColor : "rgba(151,187,205,1)",
34
        pointColor : "rgba(151,187,205,1)",
35
        pointStrokeColor : "#fff",
36
        pointHighlightFill : "#fff",
37
        pointHighlightStroke : "rgba(151,187,205,1)",
38
        data : myvalues
39
            }
40
        ]
41
42
    }
43
    
44
    window.onload = function {
45
        var ctx = document.getElementById("diagrammMessung").getContext("2d");
46
        window.myLine = new Chart(ctx).Line(lineChartData, {
47
            responsive: true
48
        });
49
    }
50
    //-->
51
    </script>
Die Daten die ich haben möchte bekomme ich auch, da ich diese oben mit 
alert() auch ausgeben kann. Jetzt weiß ich nur nicht wie ich die Daten 
in die beiden Arrays myvalues und mylabels bekommen soll... Habs mit 
push etc. probiert aber es wollte nicht so wie ich es wollte! Hoffe 
jemand könnte mir helfen. :-)

Gruß KK

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

Kilian K. schrieb:
> Jetzt weiß ich nur nicht wie ich die Daten
> in die beiden Arrays myvalues und mylabels bekommen soll... Habs mit
> push etc. probiert aber es wollte nicht so wie ich es wollte! Hoffe
> jemand könnte mir helfen. :-)

dafür müssen man wissen was in responseText drin steht.

von Kilian K. (kellermaaan)


Lesenswert?

Also in dem String ist einmal eine Zeit und der Messwert zu der Zeit.
1
[[zeit, messwert], [zeit,messwert],...]
Dies könnte allerdings noch verändert oder angepasst werden wenn es 
besser geht!

von Peter II (Gast)


Lesenswert?

Kilian K. schrieb:
> Dies könnte allerdings noch verändert oder angepasst werden wenn es
> besser geht!

dann würde ich vorschlagen, mache ein json daraus.

https://de.wikipedia.org/wiki/JavaScript_Object_Notation

Darauf kann dann javasscript besser zugreifen.

von Kilian K. (kellermaaan)


Lesenswert?

Peter II schrieb:
> dann würde ich vorschlagen, mache ein json daraus.

Wie stelle ich das denn am besten an?
Zur Info: das Projekt läuft auf einem Arduino Taijiuino mit dem lwIP 
Stack und einem Webserver. Und die Programmiersprache ist C.

von Peter II (Gast)


Lesenswert?

Kilian K. schrieb:
> Wie stelle ich das denn am besten an?

seht doch im link wie der String dann aussehen soll.

von Daniel A. (daniel-a)


Lesenswert?

Kilian K. schrieb:
> window.onload = function {

Syntaxfehler. Korrekt wäre:
window.onload = function(){

Kilian K. schrieb:
> [[zeit, messwert], [zeit,messwert],...]

Sieht nach gültigen json arrays aus. Welche lib wird für die charts 
Verwendet?

Ich würde volgendes Versuchen:
1
var chart,myLine,myLine2;
2
       function measureComplete() {
3
            if (request.readyState == 4) {
4
                if (request.status == 200) {
5
                    myLine2 = chart.Line(JSON.parse(request.responseText), {
6
                      responsive: true
7
                    });
8
                }
9
            }
10
        }
11
12
// ....
13
14
    window.onload = function {
15
        var ctx = document.getElementById("diagrammMessung").getContext("2d");
16
        chart = new Chart(ctx);
17
        myLine = chart.Line(lineChartData, {
18
            responsive: true
19
        });
20
    }

von Daniel A. (daniel-a)


Lesenswert?

PS: Das Codedesign ist ausbaufähig. Das ganze könnte in OOP verpackt 
werden, es gibt ünnötige verwendungen von Globalen und window. Der 
compatiblity code beim XMLHttpRequest ist nutzlos, weil das verwendete 
canvas mit den alten briwsern sowisonicht geht, un window.onload kann 
durch addEventListener("load"  ersetzt werden.

von Kilian K. (kellermaaan)


Lesenswert?

Für die Charts verwende ich die chart.js lib.
Aber danke schon mal für deine Hilfe. Werde deine Verbesserungen mal 
ausprobieren!

von Kilian K. (kellermaaan)


Lesenswert?

Also die Werte schicke ich jetzt z.B. so weg
1
{ 
2
"Zeit": [ 6.00,24.00,40.00,58.00,76.00,92.00,110.00,128.00,144.00,162.00],
3
 "Messwert": [ 992.00,991.00,991.00,991.00,992.00,992.00,991.00,991.00,992.00,992.00]
4
}
Wie bekomme ich jetzt in Javascript meine Werte daraus gefiltert damit 
ich sie in meine Arrays schreiben kann?
1
<script language="JavaScript">
2
    <!--
3
        function getMeasureVal(){
4
            var request = false;
5
            function measureComplete() {
6
                if (request.readyState == 4) {
7
                    if (request.status == 200) {
8
                       alert(request.responseText);
9
                    }
10
                }
11
            }
12
            request = new XMLHttpRequest();
13
        
14
            if (request) {
15
                request.open("GET", "/measurevaluesget?id=" + Math.random(), true);
16
                request.onreadystatechange = measureComplete;
17
                request.send(null);
18
            }
19
            else{
20
                alert("no request");
21
            }
22
        }
23
        
24
25
        var lineChartData = {
26
            labels : [1,2,3,4,5,6,7,8,9],
27
            datasets : [
28
                {
29
                    label: "My Second dataset",
30
                    fillColor : "rgba(151,187,205,0.2)",
31
                    strokeColor : "rgba(151,187,205,1)",
32
                    pointColor : "rgba(151,187,205,1)",
33
                    pointStrokeColor : "#fff",
34
                    pointHighlightFill : "#fff",
35
                    pointHighlightStroke : "rgba(151,187,205,1)",
36
                    data : [0.6,5,3,8,9,5,0.6,10,7,1]
37
                }
38
            ]
39
        }
40
            
41
        window.onload = function() {
42
            var ctx = document.getElementById("diagrammMessung").getContext("2d");
43
            window.myLine = new Chart(ctx).Line(lineChartData, {
44
                responsive: true
45
            });
46
        }
47
    //-->
48
    </script>

von Daniel A. (daniel-a)


Lesenswert?

Ich halte die chart.js lib hier für ungeeignet. Du hast Zeitpunkte 
(X-Achse) und Messwerte (Y-Achse) dazu. charts.js erwartet bei line 
charts jedoch nur die werte für die Y-Achse, wobei alle Punkte auf der 
X-Achse gleichweit entfernt sind. Einen geeigneten Charttyp gibt es in 
chart.js noch nicht (wobei man einen erstellen könnte, aber das wird zu 
aufwendig).

von Kilian K. (kellermaaan)


Lesenswert?

Mein Problem momentan ist, wenn ich das so mache wie in meinem Post 
darüber, bekomme ich immer das ausgegeben:
1
婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚婚
Woran könnte das liegen?

von Kilian K. (kellermaaan)


Lesenswert?

So, momentan bin ich soweit, dass ich diesen Text
1
{ 
2
"Zeit": [ 42.00,60.00,77.00,95.00,112.00,129.00,147.00,164.00,181.00,199.00],
3
"Messwert": [ 995.00,995.00,995.00,995.00,994.00,995.00,995.00,995.00,995.00,995.00]
4
}
 mit alert() ausgeben kann.

Da ich aber noch nicht viel mit JavaScript gearbeitet habe, weiß ich 
jetzt nicht wie ich jeweils die Zeitwerte und die Messwerte in zwei 
Arrays schreiben aufteilen kann. Vielleicht hat das jemand schon mal 
gemacht und könnte mir helfen? :-D

von Bastler (Gast)


Lesenswert?

das Geheimnis ist:
1
var Data = JSON.parse( json_string );
Die Funktion liefert ein JavaScript Objekt mit 2 Attributen, die beide 
Arrays sind.

von Kilian K. (kellermaaan)


Lesenswert?

Bastler schrieb:
> das Geheimnis ist:var Data = JSON.parse( json_string );Die Funktion
> liefert ein JavaScript Objekt mit 2 Attributen, die beide
> Arrays sind.

Ich danke Dir! Hab es hinbekommen. :-D

von Kilian K. (kellermaaan)


Lesenswert?

Hallo, ich habe leider noch ein weiteres Problem entdeckt!

Hier erst nochmal ein Teil meines Codes:
1
function getValues() {
2
  "use strict";
3
    var request = false,
4
    mylabels = [],
5
    myvalues = [];
6
  
7
    function measureComplete() {
8
        if (request.readyState === 4) {
9
            if (request.status === 200) {
10
        var data = JSON.parse(request.responseText),
11
          i = 0,
12
          anzahlWerte = 0;
13
        
14
        anzahlWerte = data.Anzahl;
15
        
16
        for (i = 0; i < anzahlWerte; i += 1) {
17
          mylabels.push(data.Zeit[i]);
18
          myvalues.push(data.Messwert[i]);
19
        }
20
        
21
        drawDiagramm(mylabels, myvalues);
22
        
23
        document.getElementById("DruckMittelwert").firstChild.nodeValue = data.Mittelwert;
24
        document.getElementById("DruckFlaeche").firstChild.nodeValue = data.Flaeche;
25
        document.getElementById("DruckMax").firstChild.nodeValue = data.Max;
26
        document.getElementById("DruckZeit").firstChild.nodeValue = data.ZeitGesamt;
27
        document.getElementById("DruckStoesselZeit").firstChild.nodeValue = data.StoesselZeit;
28
            }
29
        }
30
    }
31
    request = new XMLHttpRequest();
32
        
33
    if (request) {
34
        request.open("GET", "/getvalues?id=" + Math.random(), true);
35
        request.onreadystatechange = measureComplete;
36
        request.send(null);
37
    }
38
}
39
40
function startMeasure() {
41
  "use strict";
42
  var request = false;
43
  
44
  window.myLine.destroy();
45
  
46
  request = new XMLHttpRequest();
47
  
48
  if (request) {
49
    request.open("GET", "/startmeasure?id=" + Math.random(), true);
50
    request.send(null);
51
    
52
    getValues();
53
  }
54
}

Also "startMeasure()" soll nur ausgeführt werden wenn ich einen Button 
betätige und "getValues()" wird einmal beim laden der Seite und von 
"startMeasure()" ausgeführt.

Allerdings tritt manchmal der Fall ein, dass wenn ich auf den Button 
klicke, "startMeasure()" aufgerufen wird, danach dann "getValues()" und 
danach dann "startMeasure()" ein weiteres mal. Dies sollte eigentlich 
nicht passieren. Es ist auch nicht jedesmal. Ich finde aber auch nicht 
den Fehler, deshalb hoffe ich, dass hier vielleicht jemand den Fehler 
findet.

MfG Kilian

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

anhand des gezeigten Codes ist dieses Verhalten nicht erklärbar. Wie 
sieht die HTML aus?

Sascha

von Kilian K. (kellermaaan)


Angehängte Dateien:

Lesenswert?

Hier ist der HTML-Code. Da ist mir aber auch nichts aufgefallen woran es 
liegen könnte...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.