Michael Segin: Wandeln von Objekt in Zahl

Hallo,
ich glaube, da fehlt was,

function AsyncResult()
      { if (requestobj.readyState == 4)
        { if (requestobj.status == 200)
          { var InputWord33 = requestobj.responseXML.getElementsByTagName('Data') [0];
            var InputWord34 = requestobj.responseXML.getElementsByTagName('Data') [1];
            var InputWord35 = requestobj.responseXML.getElementsByTagName('Data') [2];
            var InputWord36 = requestobj.responseXML.getElementsByTagName('Data') [3];

...

if ((1 & InputWord33) == 1) document.getElementById("K1").bgColor = '#00ff00';
            else                        document.getElementById("K1").bgColor = '#ff0000';
            if ((2 & InputWord33) == 2) document.getElementById("K2").bgColor = '#00ff00';
            else                        document.getElementById("K2").bgColor = '#ff0000';
            if ((4 & InputWord33) == 4) document.getElementById("K3").bgColor = '#00ff00';
            else                        document.getElementById("K3").bgColor = '#ff0000';
          }
        }
      }

Bin leider ein Anfänger in JavaScript und weiß nur das ein Objekt übergeben wird.
Aber wie ich daraus die Zahl bekomme, die in der XML-Datei steht, weiß ich nicht.
Vielleicht kann mir jemand helfen.

Im voraus vielen Dank

Michael
``

  1. Hi,

    { var InputWord33 = requestobj.responseXML.getElementsByTagName('Data') [0];
                var InputWord34 = requestobj.responseXML.getElementsByTagName('Data') [1];
                var InputWord35 = requestobj.responseXML.getElementsByTagName('Data') [2];
                var InputWord36 = requestobj.responseXML.getElementsByTagName('Data') [3];

    Was soll das?
    So gut wie immer, wenn jemand anfängt, Variablennamen "durchzunummerieren", möchte er eigentlich Arrays verwenden - bzw. hier in diesem Falle, dabei "bleiben".
    Du erreichst doch jeden der Werte über requestobj.responseXML.getElementsByTagName('Data') - wozu also diese Umkopiererei?
    (Ja, wenn es um Ergebnisse von Methoden wie getElementsByXY geht, die nach der Ermittlung vielfach gebraucht werden sollen, dann sollte man das Ergebnis des Aufrufes zwischenspeichern, weil auch der Aufruf jedes Mal ein bisschen "kostet" - aber das ist hier, wenn man die folgenden Abfragen etwas vereinfacht, vermutlich gar nicht unbedingt nötig.)

    if ((1 & InputWord33) == 1) document.getElementById("K1").bgColor = '#00ff00';
                else                        document.getElementById("K1").bgColor = '#ff0000';
                if ((2 & InputWord33) == 2) document.getElementById("K2").bgColor = '#00ff00';

    Was willst du denn hier *eigentlich* abfragen? Willst du wirklich den Bitoperator & verwenden, um den Inhalt des Data-Elements aus deinem XML mit einer Zahl zu verknüpfen ...? Dann kann es schon sein, dass du das erst mal in eine "richtige" Zahl umwandeln musst - dafür gibt es parseInt (bzw. parseFloat).
    Aber ob das wirklich nötig ist, kommt darauf an, was genau du hier ermitteln willst - und das hast du nicht mal ansatzweise beschrieben. (Beschreiben, was du *erreichen* willst, solltest du immer - statt einfach nur unkommentierten Code abzuladen, der möglicherweise schon einen komplett in eine falsche Richtung gedachten Ansatz verfolgt. Denn dann kann man dir eventuell auch sinnvollere Alternativen vorschlagen.)

    Und "kürzen" oder vereinfachen lässt sich der Code vermutlich auch noch.
    Statt zig solcher if-Abfragen hintereinander zu notieren, könnte man z.B. *eine* Bedingung formulieren, die in einer Schleife durchlaufen wird - und deren Ergebniswert, also das, was du zuweisen willst, dann in einem Array hinterlegt ist, dessen nummerischer Index einfach mit der gerade abgeprüften Zahl korrespondiert.
    Und da du hier requestobj.responseXML.getElementsByTagName('Data')[xy] mehrfach verwendest, wäre es dann hier angebracht, diesen Wert vor der Prüf-Schleife in einer lokalen Variablen zwischenzuspeichern, damit diese Ermittlung an dieser Stelle nicht mehrfach durchgeführt werden muss. Lokale Variable deshalb, weil der Wert nachher nicht mehr gebraucht wird (zumindest nach dem Code, den du gezeigt hast), so dass es nicht nötig ist, ihn länger aufzubewahren, oder gar vorher die Inhalte *aller* Data-Elemente in ein Array zu legen.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. OK. Also ganz von vorn.
      Ich versuche Daten einer SPS (Speicherprogrammierbare Steuerung) in eine Webseite zu bekommen. Die SPS, eine WAGO 750-841, hat einen eigenen Webserver und stellt mir die Daten in Form von SSI (Server Side Includes) zu Verfügung. Nachdem ich festgestellt habe, dass die HTML-Seite die Endung .ssi haben muss und auch im FTP-Server in einem selbst erstellten Verzeichnis abgelegt werden muss. Sonst wird sie zwar angezeigt aber die SSI-Anweisungen nicht interpretiert. Dazu kommt das Problem das die Daten ständig aktualisiert werden müssen. Anfangs habe ich die ganze Seite mit einer META-Anweisung jede Sekunde zweimal aufrufen lassen, was nicht sehr schön war. Also habe ich mich das erste Mal ans Forum gewand und als Antwort „Stichwort XMLHttpRequest/AJAX“ bekommen. Erst dachte ich, dass ich das nicht nutzen kann, da in den meisten Beispielen Programmcode auf dem Server abgearbeitet wird. Habe aber dann ein sehr gutes Beispiel von Bernd Ott gefunden, in dem nur eine XML-Datei vom Server nachgeladen wird. Nun habe ich die SSI-Anweisungen in die XML-Datei geschrieben und die Funktion alle 0,5 Sekunden aufgerufen (Funktioniert einwandfrei).

      So. Die Zahlen die die SPS liefert sind 16Bit Werte. Also zwischen 0 und 65535. Die IF Anweisung filtert ein einzelnes Bit heraus und ändert die Hintergrundfarbe eines Elements mit der ID z.B. „K1“. Es ist mir schon bewusst, dass ich den Programmcode mit ein paar FOR-Schleife optimieren kann. Aber das kommt später. Ich würde gern erst einmal wissen, was die Funktionen da eigentlich zurück liefern und was passieren muss dass die IF Anweisung den Wert als Zahl sieht und richtig ausführt.

      Gruß Michael

      1. Ich würde gern erst einmal wissen, was die Funktionen da eigentlich zurück liefern

        Welche Funktionen meinst du?
        Wenn du wissen willst, welcher Wert in einer Variable bzw. Objekteigenschaft steht, solltest du dir diese ausgeben lassen.

        und was passieren muss dass die IF Anweisung den Wert als Zahl sieht und richtig ausführt.

        Das haben wir dir doch gesagt.
        Greife auf den Textknoten zu und wandle ihn mit parseInt in eine Zahl um.
        Hast du das bereits probiert?

        Mathias

  2. Aber wie ich daraus die Zahl bekomme, die in der XML-Datei steht, weiß ich nicht.

    Was für eine Zahl steht denn in der XML-Datei?

    In deinen InputWord-Variablen stehen übrigens Elementknoten-Objekte. Wenn du deren Textinhalt willst, musst du dessen Kind-Textknoten ansprechen. Üblicherweise über .firstChild.nodeValue. Da kommt ein String heraus. Die müsstest du direkt mit Zahlen vergleichen können, da JavaScript den (ganzzahligen) String automatisch ist eine Zahl umwandelt.

    Mathias

  3. @@Michael Segin:

    nuqneH

    if ((1 & InputWord33) == 1) document.getElementById("K1").bgColor = '#00ff00';
                else                        document.getElementById("K1").bgColor = '#ff0000';

    (1) Wenn du alle Bits bis auf das LSB nullst, kann nur 0 oder 1 herauskommen. Da 0 als false und jeder andere Zahlenwert als true gewertet wird, kannst du den Vergleich sparen, also einfach:
        if (1 & InputWord33)

    (2) Das Ganze noch http://de.selfhtml.org/javascript/sprache/bedingt.htm#entweder_oder@title=einfacher:
        document.getElementById("K1").bgColor = (1 & InputWord33 ? #00ff00' : '#ff0000');

    (3) Du solltest nicht missbilligte HTML-Attribute (bzw. deren Repräsentation) zur Darstellung nutzen, sondern CSS-Eigenschaften (bzw. deren http://de.selfhtml.org/javascript/objekte/style.htm@title=Repräsentation):
        document.getElementById("K1").style.backgroundColor = (1 & InputWord33 ? #00ff00' : '#ff0000');

    (4) Noch besser wäre es freilich, mit JavaScript gar keine Styles zu ändern, sondern Klassenzugehörigkeiten. Die Style-Regeln für jede Klasse stehen im CSS. (Trennung von Präsentation und Verhalten, s.a. Der sinnvolle Einsatz von JavaScript)

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)