Harlequin: getElementById

Yerf!

Ich brauch grad noch ein paar Augen, weil ich selber scheinbar Blind bin und den Fehler nicht sehe:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<title>Report</title>
<div id="mydiv">&nbsp;</div>
<script type="text/javascript">
var mydiv = document.getElementById('mydiv');
alert (mydiv);var dots = 0;var dotmax = 10;
function ShowWait(){var output; output = '';dots++;if(dots>=dotmax)dots=1;for(var x = 0;x < dots;x++){output += '.';}mydiv.innerHTML =  output;}
function StartShowWait(){mydiv.style.display = 'block'; window.setInterval('ShowWait()',500);}
function HideWait(){mydiv.style.display = 'none';window.clearInterval();}
StartShowWait();
</script>

Wieso gibt mir der Alert für mydiv "null" aus? Und wieso ging das Script gestern noch, hab doch fast nichts geändert (zumindest nichts, das ich jetzt mit dem fehler in Verbindung bringe)?

Gruß,

Harlequin

PS: an die Nörgler: This Page Is Valid HTML 4.01 Transitional!
(sagt zumindest der W3C-Valkidator). Der Minimalismus hat schon seinen Grund...

  1. Hallo Harlequin.

    Ich brauch grad noch ein paar Augen, weil ich selber scheinbar Blind bin und den Fehler nicht sehe:

    Nö, deine Augen sind sicher völlig in Ordnung, nur deine Codeformatierung ist für den Ort geeignet, wo keine Sonne scheint.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <title>Report</title>
    <div id="mydiv">&nbsp;</div>
    <script type="text/javascript">
    var mydiv = document.getElementById('mydiv');
    alert (mydiv);var dots = 0;var dotmax = 10;
    function ShowWait(){var output; output = '';dots++;if(dots>=dotmax)dots=1;for(var x = 0;x < dots;x++){output += '.';}mydiv.innerHTML =  output;}
    function StartShowWait(){mydiv.style.display = 'block'; window.setInterval('ShowWait()',500);}
    function HideWait(){mydiv.style.display = 'none';window.clearInterval();}
    StartShowWait();
    </script>

    Wieso gibt mir der Alert für mydiv "null" aus?

    Du wirst die Antwort sicher selbst herausfinden, wenn du deinen Code vernünftig formatierst und anfängst, zu debuggen. Erster Schritt hierbei sind Kontrollausgaben an den markanten Stellen.

    Der Minimalismus hat schon seinen Grund...

    Lass mich raten: er soll den Code unlesbar und nicht debugbar machen? Mission erfolgreich.

    Einen schönen Freitag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. Yerf!

      Nö, deine Augen sind sicher völlig in Ordnung, nur deine Codeformatierung ist für den Ort geeignet, wo keine Sonne scheint.

      Hm, gestern als es noch ging hatte ich alles in einer Zeile...

      ok, mal aufräumen:

      <div id="mydiv">&nbsp;</div>
      <script type="text/javascript">
      var mydiv = document.getElementById('mydiv');
      alert (mydiv);var dots = 0;var dotmax = 10;

      Wieso gibt mir der Alert für mydiv "null" aus?

      Du wirst die Antwort sicher selbst herausfinden, wenn du deinen Code vernünftig formatierst und anfängst, zu debuggen. Erster Schritt hierbei sind Kontrollausgaben an den markanten Stellen.

      Debuggen hab ich ja schon probiert: der Alert liefert direkt nach dem getElementById ein 'null'... Ich versteh nur einfach nicht wieso...

      Lass mich raten: er soll den Code unlesbar und nicht debugbar machen? Mission erfolgreich.

      Nein, das ist Beispielcode aus der MSDN, den ich auch auf dem FF zum laufen bringen wollte ;-)

      Gruß,

      Harlequin

      1. ok, mal aufräumen:

        <div id="mydiv">&nbsp;</div>
        <script type="text/javascript">
        var mydiv = document.getElementById('mydiv');
        alert (mydiv);var dots = 0;var dotmax = 10;

        Wieso gibt mir der Alert für mydiv "null" aus?

        Keine Ahnung, du hast nicht den code benutzt den du uns zeigst, der gibt bei mir [object HTMLDivElement] aus

        Debuggen hab ich ja schon probiert: der Alert liefert direkt nach dem getElementById ein 'null'... Ich versteh nur einfach nicht wieso...

        das stimmt nicht.

        Struppi.

        1. Yerf!

          Keine Ahnung, du hast nicht den code benutzt den du uns zeigst, der gibt bei mir [object HTMLDivElement] aus

          Der Code aus dem Ursprungsposting gibt bei mir (FF 2.0.0.4) 'null' aus. Die gekürzte Version war nur um zu zeigen, welche Stelle Probleme macht. (Bei einem Test gerade eben musste ich aber nur ein </script> anfügen, damit das gleiche Ergebnis auftritt. Ohne das Zeigt er das JavaScript als Text an.)

          Debuggen hab ich ja schon probiert: der Alert liefert direkt nach dem getElementById ein 'null'... Ich versteh nur einfach nicht wieso...

          das stimmt nicht.

          Bei mir schon. Halt Im FF, hatte ich das vergessen zu erwähnen? ...Moment, ok, ich hab im Ursprungsposting vergesen zu erwähnen, das nur der FF Probleme macht.

          Gruß,

          Harlequin

  2. Yerf!

    PS: an die Nörgler: This Page Is Valid HTML 4.01 Transitional!
    (sagt zumindest der W3C-Valkidator). Der Minimalismus hat schon seinen Grund...

    Hm, der Validator ist damit zufrieden, aber der Fux kriegts nicht gebacken... das <script> Element steht eigentlich nach dem <div> und damit im <body>. Der Firebug offenbart aber etwas anderes: Das <Script> Element wird in den <Head> gehängt und steht damit plötzlich *vor* dem <div>, womit der getElementById nichts mehr findet...

    Ein expliziter <body> um die 2 Elemente schafft Abhilfe. Jetzt stellt sich nur noch die Frage, wieso der Code gestern beim ersten Test schon einmal funktioniert hat?

    Gruß,

    Harlequin

    1. Hallo Harlequin.

      PS: an die Nörgler: This Page Is Valid HTML 4.01 Transitional!
      (sagt zumindest der W3C-Valkidator). Der Minimalismus hat schon seinen Grund...

      Hm, der Validator ist damit zufrieden, aber der Fux kriegts nicht gebacken... das <script> Element steht eigentlich nach dem <div> und damit im <body>. Der Firebug offenbart aber etwas anderes: Das <Script> Element wird in den <Head> gehängt und steht damit plötzlich *vor* dem <div>, womit der getElementById nichts mehr findet...

      Ein expliziter <body> um die 2 Elemente schafft Abhilfe. Jetzt stellt sich nur noch die Frage, wieso der Code gestern beim ersten Test schon einmal funktioniert hat?

      Das ist das schöne an chaotischem Code: es gibt immer etwas zum Lachen. Auch wenn der Code valide ist, heißt das noch lange nicht, dass er auch sinnvoll ist.

      Einen schönen Freitag noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. Yerf!

        Das ist das schöne an chaotischem Code: es gibt immer etwas zum Lachen. Auch wenn der Code valide ist, heißt das noch lange nicht, dass er auch sinnvoll ist.

        Wobe die Gründe für den FF, das Script in den Head einzufügen schon mal interessant wären.

        Der Code ist deshalb so minimal, weil ich vor der eigentlichen Ausgabe dem User möglichst schnell eine Nachricht geben möchte, dass tatsächlich noch was passiert (einige sind da recht ungeduldig...). Die Ausgabe wird also per response.write und response.flush[1] vor der eigentlichen Ausgabe gesendet. Die nachfolgende Verarbeitung kann dann schon mal ein paar Minuten dauern.

        Das Ergebnis ist dann zwar leider kein valides HTML mehr, da die nachfolgende Ausgabe nochmals ein komplettes HTML-Dokument ausgibt, aber so wie ich das sehe ist das mit ASP.NET nicht ohne weiters zu lösen und ich hab zu wenig Zeit...

        Gruß,

        Harlequin

        [1] ja ich weiß... flush ist genau das, was man mit diesem Code machen sollte ;-)

        1. Hi,

          Wobe die Gründe für den FF, das Script in den Head einzufügen schon mal interessant wären.

          weil valides HTML immer noch kaputter Code sein kann. HTML ist so _definiert_, nur durch Fehlerkorrekturen nutzbar zu sein: Der Browser muss sich raussuchen, wo die fehlenden Start- und End-Tags denn nun hingehören. Der Parsing-Algorithmus von Firefox baut dabei offenbar Mist, weil er die Fehler Deines validen Codes falsch interpretiert. Mit anderen Worten:

          Du hast gerade ein Beispiel dafür gefunden, warum man XHTML anstatt HTML einsetzen sollte.

          Der Code ist deshalb so minimal, weil ich vor der eigentlichen Ausgabe dem User möglichst schnell eine Nachricht geben möchte, dass tatsächlich noch was passiert (einige sind da recht ungeduldig...). Die Ausgabe wird also per response.write und response.flush[1] vor der eigentlichen Ausgabe gesendet. Die nachfolgende Verarbeitung kann dann schon mal ein paar Minuten dauern.

          Schön und gut, aber wieso sparst Du zwei, drei Dutzend Bytes (oder nur sechs), obwohl die Gesamtmasse schon allein aufgrund des HTTP-Headers in die Kilobyte geht, was nicht mal von Belang ist, weil der Roundtrip an sich die Zeit kostet?

          Das Ergebnis ist dann zwar leider kein valides HTML mehr, da die nachfolgende Ausgabe nochmals ein komplettes HTML-Dokument ausgibt,

          Was sich verhindern lässt, wenn dieses schnell ausgegebene Dokument das langsame anfordert.

          aber so wie ich das sehe ist das mit ASP.NET nicht ohne weiters zu lösen

          Mit HTTP. ASP.NET ist zwar von Microsoft, aber kann trotzdem nichts dafür.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Yerf!

            Schön und gut, aber wieso sparst Du zwei, drei Dutzend Bytes (oder nur sechs), obwohl die Gesamtmasse schon allein aufgrund des HTTP-Headers in die Kilobyte geht, was nicht mal von Belang ist, weil der Roundtrip an sich die Zeit kostet?

            Ich wollte halt auch den Programmcode möglichst kompakt halten. Direkte HTML-Ausgaben sind bei .NET auch eher unüblich...
            Naja, ich hab den <body> jetzt mit drinn.

            Was sich verhindern lässt, wenn dieses schnell ausgegebene Dokument das langsame anfordert.

            Hm, ne Zwischenseite? Wäre evtl. möglich, bedeutet aber mehr Aufwand (Änderung am Menü, durchreichen der Parameter...)

            aber so wie ich das sehe ist das mit ASP.NET nicht ohne weiters zu lösen

            Mit HTTP. ASP.NET ist zwar von Microsoft, aber kann trotzdem nichts dafür.

            Das bezog sich nur darauf, das der Übliche Weg eine Seite zu erzeugen bei .NET nicht vorsieht, die Seite auf Häppchen zu senden.

            Gruß,

            Harlequin

    2. Yerf!

      »»Jetzt stellt sich nur noch die Frage, wieso der Code gestern beim ersten Test schon einmal funktioniert hat?

      Ach nö... ich habs grad rausgefunden: Sobald ich im Script-Tag wieder <script language="javascript"> schreibe, so wie es im urprünglichen Code war, machts der FF richtig und hängt den Script-Block in den Body.

      Muss man das verstehen?

      Gruß,

      Harlequin