webo: variables Objekt? VBScript

Hallo Forum,

Ich habe eine Frage zu Objekten. Ich arbeite auf einer HTA Seite mit VBScript. Ich erstelle eine Tabelle mit Spans folgendermaßen:

for i=1 to 100

document.write "<TR bgcolor =""FFCC00""><TD width =""13%"" align = ""center""><p><span id=a"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=b"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=c"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=d"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=e"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=f"&(i)&"></span></p></TD>"
 document.write "<TD width =""13%"" align = ""center""><p><span id=g"&(i)&"></span></p></TD>"
 document.write "<TD width =""9%"" align = ""center""><p><span id=h"&(i)&"></span></p></TD></TR>"

next

Wie kann ich jetz eine Schleife machen, in der ich auf die Spans zugreifen kann? Also, es soll ungefähr wie folgt funktionieren:

x = 0
while not x=20
x=x+1
x=cStr(x)
strAAA = "a"+x
x=cint(x)
strAAA.InnerHTML = "<p>text, der dann da rein soll</p>"

Nur so funktioniert es leider nicht, es kommt die Fehlermeldung "Objekt erforderlich "strAAA" - wie kann ich denn ein variables Objekt erstellen?
Hat da vielleicht jemand eine Idee, wie ich das machen kann?

  1. Hi,

    mit deinem document.write gibst du lediglich Text aus. Dieser Text sind lediglich aneinandergereihte Zeichen ohne jegliche Semantik.

    [strAAA = "a"+x] ist eine simple Wertzuweisung von einer Zeichenkette zu einer Variablen strAAA. Von einem "Objekt" ist da weit und breit nichts in Sicht, nicht mal von der Tabelle selbst.

    Möglichkeit 1)

    Warum gibst du nicht "<p>text, der dann da rein soll</p>" einfach mit in der ersten Schleife aus?

    Möglichkeit 2)

    Statt document.write zu benutzen, schreibst du deine ganzen Tabellendinger erstmal in einen Puffer (Array, Scripting.Dictionary, simpler Text ... ), versiehst die Inhalte mit Platzhaltern à la  $replace1$    (also eine kombination von zeichen die relativ eindeutig und unverwechselbar in dem ganzen Text ist und ersetzt diese Platzhalter dann zu gegebener Zeit mit dem was du willst und gibst dann die janze Chose mit document.write einmalig aus.

    Möglicheit 3)

    Du verwendest das DOM deines Dokuments, da gibt es dann u.a. so nette Funktionen wie getElementById(...) usw.

    Speziell zu Möglichkeit 3) kannst du dich im Internet recht gut belesen.

    Ciao, Frank

    1. Hi Frank. Danke erstmal für deine Hilfe.

      mit deinem document.write gibst du lediglich Text aus. Dieser Text sind lediglich aneinandergereihte Zeichen ohne jegliche Semantik.

      Wie meinst du das? Ich habe document.write immer benutzt um zwischen meinen VBScriptbefehlen html Befehle auszuführen.

      [strAAA = "a"+x] ist eine simple Wertzuweisung von einer Zeichenkette zu einer Variablen strAAA. Von einem "Objekt" ist da weit und breit nichts in Sicht, nicht mal von der Tabelle selbst.

      Das weis ich, ich hätte gerne den inhalt dieses Strings als Objekt. Mit a1.innerHTML könnte ich ja die Spawns füllen. Irgendwie muss es doch möglich sein, dieses a1, a2, a3 usw in einer Schleife zu erzeugen (wie bei dem string als Beispiel) und dann dafür zu verwenden oder?

      Möglichkeit 1)

      Warum gibst du nicht "<p>text, der dann da rein soll</p>" einfach mit in der ersten Schleife aus?

      Das mit dem Text ist nur ein Beispiel. Die Tabelle soll später mit Werten, die aus dem Active Directory abgerufen werden gefüllt werden. Dies passiert in einer Schleife. Desshalb brauch ich auch das Variable Objekt. :)

      Möglichkeit 2)

      Statt document.write zu benutzen, schreibst du deine ganzen Tabellendinger erstmal in einen Puffer (Array, Scripting.Dictionary, simpler Text ... ), versiehst die Inhalte mit Platzhaltern à la  $replace1$    (also eine kombination von zeichen die relativ eindeutig und unverwechselbar in dem ganzen Text ist und ersetzt diese Platzhalter dann zu gegebener Zeit mit dem was du willst und gibst dann die janze Chose mit document.write einmalig aus.

      Kannst du mir da bitte ein simples Beispiel zeigen, wie die Syntax dazu aussieht? Ich habe leider noch nicht so viel Erfahrung mit VBScript.

      Also vielen Dank nochmal,
      MfG webo

      1. mit deinem document.write gibst du lediglich Text aus. Dieser Text sind lediglich aneinandergereihte Zeichen ohne jegliche Semantik.
        Wie meinst du das?

        So wie ich es geschrieben habe, document.write schreibt einfach irgendwelche Zeichen (die du dahinter angibst) in das aktuelle Dokument. (Punkt) Das kann HTML sein oder auch irgendwelcher Murks. Fakt bleibt, dass es einfach nur aneinandergereihte Zeichen sind, ohne Semantik eben.

        Ich habe document.write immer benutzt um zwischen meinen VBScriptbefehlen html Befehle auszuführen.

        Es gibt keine HTML Befehle!
        Ausserdem habe ich auch nicht geschrieben, dass document.write falsch ist. Du solltest dir vielleicht aber mal die Dokumentation dazu durchlesen um zu erkennen, was document.write genau macht.

        [strAAA = "a"+x] ist eine simple Wertzuweisung von einer Zeichenkette zu einer Variablen strAAA. Von einem "Objekt" ist da weit und breit nichts in Sicht, nicht mal von der Tabelle selbst.
        Das weis ich, ich hätte gerne den inhalt dieses Strings als Objekt.

        Ja, schön, toll! Und als was für ein Objekt? Und warum sollte ein String plötzlich zu einem (nicht-String)Objekt werden?

        Mit a1.innerHTML könnte ich ja die Spawns füllen.

        Dann enthältst du uns/mir Code vor, wie kommst du an "a1" als Objekt. Von [strAAA = "a"+x]  selbst kommt es jedenfalls nicht.

        Irgendwie muss es doch möglich sein, dieses a1, a2, a3 usw in einer Schleife zu erzeugen (wie bei dem string als Beispiel) und dann dafür zu verwenden oder?

        Irgendwie schon, ja. Wenn du an a1 herankommst Wo hast du den Code dafür?), kommst du sicher auch an dessen "parent" heran und an dessen "parent" wiederum auch. Ausserdem kannst du ja nicht nur die Spans mit Ids versehen sondern auch deren Elternobjekte (welches Knoten in einem Dokumentenbaum sind -> DOM).

        Möglichkeit 2)
        Kannst du mir da bitte ein simples Beispiel zeigen, wie die Syntax dazu aussieht? Ich habe leider noch nicht so viel Erfahrung mit VBScript.

        Sorry, das (Vorkauen) lässt meine Zeit leider nicht zu. Ausserdem bräuchte ich einiges mehr an Hintergrundinfos, und eine Hellseher-Glaskugel habe ich leider nicht. Stichpunkte wie Dom und Scripting.Dictionary und Array hatte ich dir ja schon gegeben. Schaust du halt mal mit diesen Begriffen bei Google nach und baust dir die Sachen von den Tutorials und was du sonst noch so findest zusammen. Hab gehört, sowas bringt auch mega Lerneffekt.

        Ciao, Frank

        1. Dann enthältst du uns/mir Code vor, wie kommst du an "a1" als Objekt. Von [strAAA = "a"+x]  selbst kommt es jedenfalls nicht.

          Nein, du hast nur nicht genau gelesen. Hier habe ich a1, a2 usw fest definiert. ( <span id=a"&(i)&"></span> )

          for i=1 to 100

          document.write "<TR bgcolor =""FFCC00""><TD width =""13%"" align = ""center""><p><span id=a"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=b"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=c"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=d"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=e"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=f"&(i)&"></span></p></TD>"
           document.write "<TD width =""13%"" align = ""center""><p><span id=g"&(i)&"></span></p></TD>"
           document.write "<TD width =""9%"" align = ""center""><p><span id=h"&(i)&"></span></p></TD></TR>"

          next

          Gut, ich werde dann mal versuchen noch weiter vorzustoßen.
          MfG webo

          1. Nein, du hast nur nicht genau gelesen. Hier habe ich a1, a2 usw fest definiert. ( <span id=a"&(i)&"></span> )

            Als was definiert?

            document.write "<TR bgcolor =""FFCC00""><TD width =""13%"" align = ""center""><p><span id=a"&(i)&"></span></p></TD>"

            Ich sehe nur eine Zeichenkette, die es bitzeli mit & und deiner Schleifenvariable verbastelt wird und als Argument an document.write gegeben wird. Da ist nichts von einer Definition von a1 oder a2.  Wenn du a1 oder a2 in der Form [a1.InnerHtml = "<p>irgendwas</p>"] verwenden willst in deinem Scriptzeugs, dann wirst du sicher auch irgendwo mal [a1 = ...] stehen haben?!

            Wie wär's mal mit was neuem: document.getElementById("a"&(i)).InnerHtml = "<b>So funktionuckelt es vielleicht</b>" .... rein spekulativ ...

            strAAA im Vergleich zu document.getElementById("a"&(i)) nur ne doofe Zeichenkette, nicht mehr nicht weniger.

            Ciao, Frank

            1. Da ist nichts von einer Definition von a1 oder a2.

              Also ich würde schon sagen, dass es in der Zeile richtig steht.

              for i=1 to 100
              document.write "<p><span id=a"&(i)&"></span></p>"
              next

              Damit werden 100 Spans mit den ID's a1 bis a100 untereinander geschrieben.
              Wenn ich jetzt ... a1.innerHTML = "text im ersten spawn" ... a5.innerHTML = "text im fuenften spawn" ... schreibe funktioniert das auch.

              Aber trotzdem vielen Dank für deine Hilfe. Ich habe gerade auch mal ein bisschen mit dem getElementById herumprobiert in einer Testumgebung. Stoße aber auf ein Problem. Mein Quellcode:

              [CODE]
              document.write "<span id=""abc"">hier is das span</span>"
              strID = "abc"
              elem = document.getElementById(abc)

              sub RunScript
              elem.innterhtml = "neuer Text im span"
              end sub
              [/CODE]

              Ich erhalte folgende Fehlermeldung: "Objektvariable nicht gesetzt 'elem'" in der zeile nach dem sub RunScript. Das ist bestimmt ein totaler Anfängerfehler von mir. Ich hoffe du kannst mir helfen.

              MfG webo

              1. Wenn ich jetzt ... a1.innerHTML = "text im ersten spawn" ... a5.innerHTML = "text im fuenften spawn" ... schreibe funktioniert das auch.

                Also schön, die Mysterien von VB sind unergründlich. Es scheint lustigerweise automatisch alle ids von Tags als Referenzen bereitzustellen.

                Aber abcd != "abcd"
                Das eine ist die Referenz auf das Objekt, das andere eine dumme Zeichenkette.

                ... mit dem getElementById herumprobiert in einer Testumgebung. Stoße aber auf ein Problem.

                Das genaue Problem (bzw. Fehlermeldung) zu nennen, ist der Hilfebereitschaft anderer durchaus zuträglich, da jene u.U. nicht erst deinen Code ausprobieren müssen.

                strID = "abc"
                elem = document.getElementById(abc)

                Wie wäre es denn so:

                strID = "abc"
                elem = document.getElementById(strID)

                Ciao, Frank

                1. Yerf!

                  Also schön, die Mysterien von VB sind unergründlich. Es scheint lustigerweise automatisch alle ids von Tags als Referenzen bereitzustellen.

                  Eher die Mysterien des IE. Das ganze funktioniert dort auch mit JS (scheint eine Nebenwirkung des document.all-Modells zu sein).

                  Gruß,

                  Harlequin

                  --
                  <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                2. Wenn ich jetzt ... a1.innerHTML = "text im ersten spawn" ... a5.innerHTML = "text im fuenften spawn" ... schreibe funktioniert das auch.

                  Also schön, die Mysterien von VB sind unergründlich. Es scheint lustigerweise automatisch alle ids von Tags als Referenzen bereitzustellen.

                  Ich habe doch eine for-Schleife gemacht, die bis 100 zählt. Von dieser bekommt es den Zähler 1,5,99 usw. falls du das nicht gesehen hast. Da ist nichts seltsam daran.

                  Das genaue Problem (bzw. Fehlermeldung) zu nennen, ist der Hilfebereitschaft anderer durchaus zuträglich, da jene u.U. nicht erst deinen Code ausprobieren müssen.

                  Das habe ich doch gemacht ... ich habe geschrieben: "Ich erhalte folgende Fehlermeldung: "Objektvariable nicht gesetzt 'elem'" in der zeile nach dem sub RunScript. Das ist bestimmt ein totaler Anfängerfehler von mir. Ich hoffe du kannst mir helfen."

                  strID = "abc"
                  elem = document.getElementById(abc)

                  Wie wäre es denn so:

                  strID = "abc"
                  elem = document.getElementById(strID)

                  Ah, sorry da hatte ich mich verschrieben. So war es auch gedacht. Ich bekomme aber trotzdem noch die Fehlermeldung.

                  MfG webo

                  1. Habe jetzt endlich die Lösung gefunden.
                    So, für alle, die das selbe Problem haben wie ich, so muss es aussehen (Anhand von meinem Beispiel mit der Tabelle):

                    [CODE]

                    <input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">

                    <script language="vbscript" type="text/vbscript">

                    for i=1 to 100
                    <!-- Die Tabelle wird mit 100 Zeilen geschrieben, jede der einzelnen Zellen kann man mit a1, b5, e99, usw ansprechen -->

                    document.write "<TR bgcolor =""FFCC00""><TD width =""13%"" align = ""center""><p><span id=a"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=b"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=c"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=d"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=e"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=f"&(i)&"></span></p></TD>"
                     document.write "<TD width =""13%"" align = ""center""><p><span id=g"&(i)&"></span></p></TD>"
                     document.write "<TD width =""9%"" align = ""center""><p><span id=h"&(i)&"></span></p></TD></TR>"

                    next

                    <!-- In alle Zellen von a1 bis a20 (erste Spalte) wird geschrieben -->
                    sub RunScript

                    x = 0
                    while not x=20
                    x=x+1
                    x=cStr(x)
                    strAusgabeBereich = "a"+x
                    x=cint(x)

                    document.getElementById(strAusgabeBereich).innerHTML = "text"

                    wend

                    end sub

                    </script>

                    [/CODE]

                    Nochmal danke an Frank für seine Hilfe.
                    MfG WeBO

                  2. Moin

                    Ich habe doch eine for-Schleife gemacht, die bis 100 zählt. Von dieser bekommt es den Zähler 1,5,99 usw. falls du das nicht gesehen hast. Da ist nichts seltsam daran.

                    Webo, ja, ich sehe eine for-Schleife und ein bisschen String-Frickelei, aber das war es auch schon. Dass dir danach a75 als Objekt zur Verfügung steht im Kontext des Dokumentes, hast du VB bzw. dem Internet Exploder zu verdanken. Das ist dein persönliches Quentchen Glück.

                    Deinen Hinweis "Objektvariable nicht gesetzt" hatte ich irgendwie überlesen, sorry.

                    <!-- In alle Zellen von a1 bis a20 (erste Spalte) wird geschrieben -->
                    sub RunScript
                     x = 0
                     while not x=20
                      x=x+1
                      x=cStr(x)
                      strAusgabeBereich = "a"+x
                      x=cint(x)
                      document.getElementById(strAusgabeBereich).innerHTML = "text"
                     wend
                    end sub

                    warum wechselst du zu while ... wend? mittels for x = 1 to 19 sparst du dir x=x+1

                    x=cStr(x)
                      strAusgabeBereich = "a"+x
                      x=cint(x)

                    kannst du verkürzen auf strAusgabeBereich = "a" & x , hab es gerade extra ausprobiert. Damit kannst du einfach folgenden Ein/Dreizeiler machen:

                    for x = 1 to 19
                      document.getElementById("a" & x).innerHTML = "text"
                    next

                    Ciao, Frank