Michael Klose: Immer noch Auslesen der Seitenhöhe / Scrollposition

Hallo miteinander,

Da ich jetzt sehr lange rumprobiert habe und leider, leider noch immer zu keinem Ergebnis gekommen und mein Thema auch schon etwas abgedriftet ist, so dass kaum einer mehr einen Blick hineinwerfen dürfte, möchte ich das Thema jetzt nochmal neu aufgreifen.

Die Korrektur von Struppi ergab bei der Ausgabe der Scrollposition immer den Wert 0, warum auch immer:

» function Scrollposition_ermitteln ()
» {
»   if (typeof window.pageYOffset != 'undefined')
»     return parent.AnzeigeSeite.pageYOffset;
»   else
»     if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat')
»       return document.parent.AnzeigeSeite.scrollTop;
»     else
»       if (typeof document.body != 'undefined')
»         return parent.AnzeigeSeite.document.body.scrollTop;
» }

» Nicht document.parent, sondern document.documentElement.
» Ich gehe davon aus, dass parent.AnzeigeSeite ein Frameseite ist?

Die neue Variante zur Ermittlung der Scrollposition sieht nun so aus:

function Scrollposition_ermitteln ()
{
  return (document.all) ? parent.AnzeigeSeite.document.body.scrollTop : parent.AnzeigeSeite.window.pageYOffset;
}

Hier wird mir auch immer der richtige Wert ausgegeben, zumindest vermute ich das, da der "Zähler" bei jeder Scrollaktion um 1 erhöht wird, wenn ich kontinuierlich scrolle.

Ich denke, dass mein Problem immer noch mit der nicht korrekten Methode zum Auslesen der Seitenhöhe zusammenhängt.

Mein neuer Ansatz sieht so aus:

function Seitenhoehe_ermitteln ()
{
  if (document.getElementById && navigator.userAgent.indexOf ("Opera 4") != -1)
  { // Opera 4
    var Objekt = parent.AnzeigeSeite.document.getElementById("Seite");
    return Objekt.style.pixelHeight;
  }
  else
    if (document.getElementById && navigator.userAgent.indexOf ("Opera 5") != -1)
    { // Opera 5
      var Objekt = parent.AnzeigeSeite.document.getElementById("Seite");
      return Objekt.style.pixelHeight;
    }
    else
      if (document.getElementById)
      { // W3Ccomp; evtl. mit Vorsatz "parseInt"
        var Objekt = parent.AnzeigeSeite.document.getElementById("Seite");
        return Objekt.style.height;
      }
      else
        if (document.all)
        { // IE4; evtl. mit Vorsatz "parseInt"
          var Objekt = parent.AnzeigeSeite.document.all["Seite"];
          return Objekt.style.pixelHeight;
        }
}

"parent.AnzeigeSeite" bezieht sich dabei auf den einzigen Frame meiner Homepage, einen eingebetteten Frame namens "AnzeigeSeite". Aufgrund eines Tips von Gernot Back, mit dem ich gestern einen intensiven Austausch hatte, habe ich nun alle Seiten in einen übergeordneten DIV "Seite" gepackt, so dass ich eigentlich die Höhe dieses DIVs einfach auslesen müssten KÖNNTE.

Mein obiger Ansatz zum Auslesen des DIVs "Seite" liefert mir aber nun wiederum keinen Wert :-(

Es kann doch nicht so schwierig sein, die Seitenhöhe und die aktuelle Scrollposition (falls letzteres bei mir doch noch falsch sein sollte) auszulesen.

Auf ein neues, werte Mitstreiter, die Spiele sind wiedermal eröffnet :o)

Vielen Dank (wiedermal *g*) für Eure Mithilfe.

Gruss, Michael

  1. Hallo Michael,

    Da ich jetzt sehr lange rumprobiert habe und leider, leider noch immer zu keinem Ergebnis gekommen und mein Thema auch schon etwas abgedriftet ist, so dass kaum einer mehr einen Blick hineinwerfen dürfte,

    natürlich werden die Beiträge da unten noch gelesen, bleib also bitte in deinem Thread (->https://forum.selfhtml.org/?t=90939&m=545954) - bzw. Threads (https://forum.selfhtml.org/?t=90843&m=545297 ist ja wohl auch von dir)

    Grüße aus Nürnberg
    Tobias

  2. Hallo,

    erklärst du mir, wieso du den dritten Thread zu deinem Problem eröffnen musst? Solltest du einen vierten zum selben Thema starten, wird er gelöscht.

    Die Korrektur von Struppi ergab bei der Ausgabe der Scrollposition immer den Wert 0, warum auch immer:

    Dann finde heraus, warum. Wieso postest du den alten und nicht den korrigieren Code (und davon die relevante Zeile)?
    Statt document.parent.AnzeigeSeite.scrollTop musst du wie gesagt parent.AnzeigeSeite.document.documentElement.scrollTop notieren.

    Die neue Variante zur Ermittlung der Scrollposition sieht nun so aus:

    function Scrollposition_ermitteln ()
    {
      return (document.all) ? parent.AnzeigeSeite.document.body.scrollTop : parent.AnzeigeSeite.window.pageYOffset;
    }

    Versuche, zu verstehen, warum Struppis Code so aufgebaut ist, wie er aufgebaut ist. document.all hat nichts mit der Ermittlung der Scrollposition zu tun und ist auch kein brauchbarer Indikator! Es wurden dir genug Hinweise im zweiten Thread gegeben.

    Ich denke, dass mein Problem immer noch mit der nicht korrekten Methode zum Auslesen der Seitenhöhe zusammenhängt.

    Was ist gegen ein einfaches document.body.scrollHeight einzuwenden?

    Selbst für das Auslesen der Höhe eines div-Elements ist deine Funktion wenig effektiv. Verwerfe sie einfach, scrollHeight sollte ausreichen, wenn ich deine Anforderungen verstanden habe. Aber du warst ja so freundlich, auf Nachfragen diesbezüglich nicht zu antworten. Warum du eine sowieso wenig sinnvolle JavaScript-Scrollfunktion auch im Opera 4 und Netscape 4 nachbauen willst, ist mir rätselhaft. Vielleicht lässt du dir einfach mal durch den Kopf gehen, was dir bereits in zwei Threads gesagt wurde.

    Mathias

    1. Hallo Mathias,

      Was ist gegen ein einfaches document.body.scrollHeight einzuwenden?

      Also diese Seite:

      http://www.sprachlernspiele.de/scroll/leer.html

      liefert mir bei Abfrage von javascript:alert(document.body.scrollHeight) über die Adresszeile

      unterschiedliche Werte in den unterschiedlichen Browsern:

      MSIE 6.0   : immer 48
      Mozilla&Co : je nach Fenstergröße
      Opera 7.54 : immer 27

      Das mag aber auch an einem falsch gewählten DOCTYPE liegen.
      So hat mich jedenfalls mal Eddi (XaraX) mal unterrichtet, der dann aber auch meinte, mit dieser Lösung würde es dann ja auch in älteren Browsern funktionieren.

      Deshalb behelfe ich mir gerne mit diesem Container-Div.

      Zum Vergleich:

      javascript:alert(document.getlementById('cont').offsetHeight)

      auf derselben Seite liefert ähnlichere Werte.

      Gruß Gernot

      1. http://www.sprachlernspiele.de/scroll/leer.html

        liefert mir bei Abfrage von javascript:alert(document.body.scrollHeight) über die Adresszeile

        unterschiedliche Werte in den unterschiedlichen Browsern:

        MSIE 6.0   : immer 48

        Der IE unterscheidet je nach DOCTYPE.

        Quirks: window.document.body.scrollHeight
        Standard: window.document.documentElement.scrollHeight

        Mozilla&Co : je nach Fenstergröße

        und Netscape 4:

        window.pageYOffset

        Opera 7.54 : immer 27

        Hab ich grad nicht da, aber wenn du aus den obigen Informationen (inkl. dass MZ zwar document.... kennt, aber anscheinend nicht die Werte einsetzt die du wünscht) ein Funktion baust, sollte eigentlich (zumindest tut's bei mir) das gewünschte rauskommen.

        Bei mir sieht sie Funktion so aus:

        ////////////////////////////////////////////////////////////
        // offset(window)
        function pageOffset(win)
        {
            if(!win) win = window;
            var pos = {left:0,top:0};

        if(typeof win.pageXOffset != 'undefined')
            {
                 // Mozilla/Netscape
                 pos.left = win.pageXOffset;
                 pos.top = win.pageYOffset;
            }
            else
            {
                 var obj = getBody(win);
                 pos.left = obj.scrollLeft;
                 pos.top = obj.scrollTop;
            }
            return pos;
        }

        ////////////////////////////////////////////////////////////
        // Der IE hat 2 verschiedene Objekte für den strict und quirks Mode.
        function getBody(w)
        {
            return w.document.documentElement ? w.document.documentElement : w.document.body || null;
        }

        Struppi.

        1. Hallo,

          MSIE 6.0   : immer 48

          Der IE unterscheidet je nach DOCTYPE.

          Quirks: window.document.body.scrollHeight
          Standard: window.document.documentElement.scrollHeight

          Das ist im besagten Fall nicht wichtig, man kann in beiden Fällen mit document.body.scrollHeight arbeiten, der Wert sollte gleich sein.

          ////////////////////////////////////////////////////////////
          // offset(window)
          function pageOffset(win)

          Gernot und mir ging es um die Bestimmung der Seitenhöhe.

          // Der IE hat 2 verschiedene Objekte für den strict und quirks Mode.
          function getBody(w)
          {
              return w.document.documentElement ? w.document.documentElement : w.document.body || null;
          }

          document.documentElement ist immer gesetzt, auch wenn der Quirks-Mode aktiv ist. Die Funktion getBody in https://forum.selfhtml.org/?t=90939&m=545954 fragt auch ab, ob der Strict-Modus tatsächlich aktiv ist.

          Mathias

      2. Hallo,

        liefert mir bei Abfrage von javascript:alert(document.body.scrollHeight) über die Adresszeile>
        unterschiedliche Werte in den unterschiedlichen Browsern:

        MSIE 6.0   : immer 48
        Mozilla&Co : je nach Fenstergröße
        Opera 7.54 : immer 27

        Das ist nicht schlimm bzw. das ist richtig so. Durch den Vergleich von scrollHeight und scrollTop zusammen mit der iframe-Höhe will Michael abfragen, ob seine JavaScript-Scrollmöglichkeiten angezeigt werden sollen oder nicht. Dazu kann mit scrollHeight problemlos gearbeitet werden. Der Hochscrollen-Knopf erscheint bei einer Scrollposition von 0 nicht. Der Runterscrollen-Knopf wird ausgeblendet, wenn (Scrollposition + iframe-Höehe) >= Seitenhöhe zutrifft. Das wäre z.B. (0 + 300) >= 48. Also würden korrekterweise erst gar keine Scroll-Buttons angezeigt.

        Eine gute Seite dazu: http://www.quirksmode.org/viewport/compatibility.html
        Dort ist auch eine Variante vorgestellt, die MSIE für Macintosh unterstützt.

        Mathias

  3. Die Korrektur von Struppi ergab bei der Ausgabe der Scrollposition immer den Wert 0, warum auch immer:

    Du hast nirgendwo meinen Vorschlag eingebaut auch meine Frage, ob parent.AnzeigeSeite eine Frameseite ist, hast du nicht beantwortet.
    Ich weiß nicht wie man dir helfen soll, wenn du immer nur quellcode zeigst, aus dem nicht klar hervorgeht, warum etwas, was anderswo funktioniert, bei dir nicht funktioniert. Und du die vorschläge nicht entsprechend einbaust.

    Ich hab dir in dem alten Thread auch eine Seite gezeigt, wo die Funktionen die du suchst sind.

    Struppi.