harri: Scrollbuttons nur anzeigen, wenn notwendig

hallo.
ich habe ein eingebettetes frame und rechts davon zwei grafische buttons zum hinauf und hinunter scrollen definiert.
nun möchte ich, dass die scroll-buttons nur angezeigt werden, wenn sie auch wirklich notwendig sind (also in abhängigkeit der höhe der dargestellten html-seite im frame).

ist dies möglich?
gibt's dazu irgendwo ein beispiel? ich habe leider bisher nichts gefunden...

ich hab versucht, in der html-seite, die im frame geladen wird, eine variable auf true bzw. false zu setzen (je nachdem, ob die scroll-buttons angezeigt werden sollen oder nicht) und in der übergeordneten seite diese variable abzufragen. dies hat leider nicht funktioniert...

  1. Hallo,

    ich habe ein eingebettetes frame und rechts davon zwei grafische buttons zum hinauf und hinunter scrollen definiert.
    nun möchte ich, dass die scroll-buttons nur angezeigt werden, wenn sie auch wirklich notwendig sind (also in abhängigkeit der höhe der dargestellten html-seite im frame).

    ist dies möglich?
    gibt's dazu irgendwo ein beispiel? ich habe leider bisher nichts gefunden...

    Geckos interpretieren die Angabe document.body.offsetHeight. Laut http://de.selfhtml.org/javascript/objekte/all.htm#offset_height braucht der IE dafür das Objekt all.
    Es sollte also kein Problem darstellen eine Browserunterscheidung zu treffen und danach die Gesamthöhe von <body> zu analysieren.

    Gruß aus Berlin!
    eddi

    --
    Manchmal trifft es einen doch ganz unverhofft t86591:
    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    1. Geckos interpretieren die Angabe document.body.offsetHeight. Laut http://de.selfhtml.org/javascript/objekte/all.htm#offset_height braucht der IE dafür das Objekt all.
      Es sollte also kein Problem darstellen eine Browserunterscheidung zu treffen und danach die Gesamthöhe von <body> zu analysieren.

      das sagt mir, wenn ich ehrlich bin, gar nichts.
      was sind geckos?

      1. Hallo harri,

        das sagt mir, wenn ich ehrlich bin, gar nichts.
        was sind geckos?

        http://de.wikipedia.org/wiki/Gecko_(Rendering_Engine)

        Da die Abstände zur oberen Kante des Anzeigebereiches von der Rendering Engine abhängen, wollte ich damit auf alle Browser verweisen, die diese Engine nutzen.

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
        1. gibt's für diese problemstellung irgendwo ein beispiel zum ansehen? das würde mir sehr, sehr weiterhelfen!

          1. Guten Abend,

            gibt's für diese problemstellung irgendwo ein beispiel zum ansehen? das würde mir sehr, sehr weiterhelfen!

            Wird es sicherlich irgendwo auch geben goolge ist Dein Freund, aber so schwer ist der geschilderte Sachverhalt gar nicht. Du vergleichst einfach:

            if(parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight)
                 blende_scrollbuttons_ein();

            Für den IE baust Du das ganze dann noch mit all nach.

            Gruß aus Berlin!
            eddi

            1. Hallo Eddi,

              if(parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight)
                   blende_scrollbuttons_ein();

              Für den IE baust Du das ganze dann noch mit all nach.

              Das ist wahrscheinlich für neuere MSIE gar nicht nötig, zumindest mit document.getElementyId() statt document.all kann man dort offsetHeight durchaus auch ansprechen, warum sollte es dann nicht auch mit document.getElementsByName()[] möglich sein?

              Gruß Gernot

              --
              Wir haben alle mal klein angefangen,
              werden so alt wie ne Kuh und lernen immer noch dazu.
              1. Hallo Gernot,

                if(parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight)
                     blende_scrollbuttons_ein();

                Für den IE baust Du das ganze dann noch mit all nach.

                Das ist wahrscheinlich für neuere MSIE gar nicht nötig, zumindest mit document.getElementyId() statt document.all kann man dort offsetHeight durchaus auch ansprechen, warum sollte es dann nicht auch mit document.getElementsByName()[] möglich sein?

                Klingt logisch. Leider bin ich derzeit IE-Unterbelichtet :(
                (Komplettumstieg auf Linux und noch nicht mit den Windowsemulatoren rumprobiert)

                Gruß aus Berlin!
                eddi

              2. hallo.

                ich hab das jetzt alles versucht, funktioniert hat es leider nicht:

                zuerst nochmal kurz zur if-bedingung, die xarax vorgeschlagen hat:
                if (parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight) {...}
                was macht das "< document.body.offsetHeight" für einen sinn? ich will ja mit der höhe der seite, die im iframe dargestellt wird, vergleichen, und nicht mit der höhe der seite, in der das iframe definiert ist.

                ich hab trotzdem so einiges versucht, wie ich diese höhe herausfinden könnte und hab sie jeweils ausgeben lassen.

                [1. versuch]:
                (anm.: detail ist sowohl id als auch name des eingebetteten frames):
                alert(document.getElementById("detail").offsetHeight);
                Ausgabe: IE=0 OPERA=240
                240 ist die höhe des iframes, aber nicht der darin dargestellten seite.

                [2. versuch]
                ('dieseDat' ist eine id, die ich im body-tag der seite, die im frame dargestellt werden soll, definiert habe - in anlehnung an dieses beispiel: http://de.selfhtml.org/javascript/objekte/all.htm#offset_height ):
                alert(document.getElementById("dieseDat").offsetHeight);
                funktioniert weder bei ie noch opera --> javascript-fehler

                [3. versuch]
                alert(document.getElementsByName("detail").offsetHeight);
                sowohl bei ie als auch bei opera kommt im fenster: undefined

                [4. versuch]
                (so wie es xarax vorgeschlagen hat, zu versuchen)
                alert(parent.document.getElementsByName([detail])[0].offsetHeight);
                funktioniert weder bei ie noch opera --> javascript-fehler

                gibt's für dieses problem überhaupt eine lösung?
                wie kann man auf die im frame dargestellte seite zugreifen, um per javascript die höhe abzufragen? das ist die eigentlich problemstellung.
                ich bin für jeden hinweis dankbar!!

                zu "google ist dein bester freund": natürlich hab ich das versucht, bevor ich hier das erste mal gepostet habe, darum hab ich auch geschrieben: ich habe leider nichts gefunden...
                es ist allerdings auch nicht so leicht, nach welchen stichwörtern man suchen soll.

                grüße
                harri

                1. Hallo.

                  ich hab das jetzt alles versucht, funktioniert hat es leider nicht:

                  zuerst nochmal kurz zur if-bedingung, die xarax vorgeschlagen hat:
                  if (parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight) {...}

                  Frage an Dich: Wo (in welchem Dokument und in welchem Frame) muß dieses Script hin?

                  was macht das "< document.body.offsetHeight" für einen sinn? ich will ja mit der höhe der seite, die im iframe dargestellt wird, vergleichen, und nicht mit der höhe der seite, in der das iframe definiert ist.

                  ich hab trotzdem so einiges versucht, wie ich diese höhe herausfinden könnte und hab sie jeweils ausgeben lassen.

                  [1. versuch]:
                  (anm.: detail ist sowohl id als auch name des eingebetteten frames):
                  alert(document.getElementById("detail").offsetHeight);
                  Ausgabe: IE=0 OPERA=240
                  240 ist die höhe des iframes, aber nicht der darin dargestellten seite.

                  Womit Dir hoffentlich klargeworden ist, der IE braucht wie in http://de.selfhtml.org/javascript/objekte/all.htm#offset_height document.all.[Bezeichner].offsetHeight.
                  Warum hast Du es nicht mit dem in http://de.selfhtml.org/javascript/objekte/all.htm#offset_height aufgeführten Beispiel zumindes für den IE nochmal versucht?

                  [2. versuch]
                  ('dieseDat' ist eine id, die ich im body-tag der seite, die im frame dargestellt werden soll, definiert habe - in anlehnung an dieses beispiel: http://de.selfhtml.org/javascript/objekte/all.htm#offset_height ):
                  alert(document.getElementById("dieseDat").offsetHeight);
                  funktioniert weder bei ie noch opera --> javascript-fehler

                  Warum hast Du es nicht mit dem in http://de.selfhtml.org/javascript/objekte/all.htm#offset_height aufgeführten Beispiel zumindes für den IE nochmal versucht?
                  Hast Du diesen Codeschnipsel überhaupt im Dokument des iframes ausgeführt?

                  [3. versuch]
                  alert(document.getElementsByName("detail").offsetHeight);
                  sowohl bei ie als auch bei opera kommt im fenster: undefined

                  Die Erklärung des Versuchs ist mit dem Versuch 1. sinngleich. Erstaunlich nur, daß es ein komplett anderes Ergibnis ist. Wer soll denn bei so einer Erklärung noch wissen, wie er Dir weiterhelfen kann?

                  [4. versuch]
                  (so wie es xarax vorgeschlagen hat, zu versuchen)
                  alert(parent.document.getElementsByName([detail])[0].offsetHeight);

                  Vergleiche doch mal bitte Versuch zwei mit diesem hier! [FrameName] war nicht so zu verstehen, daß Du hier eckige Klammern nutzen sollst, sondern in Anführungsstriche gesetzt den FrameName einfügen sollst. Es tut mir leid, wenn ich auf ein gewisses Grundverständnis der Materie gebaut habe.
                  Hast Du diesen Codeschnipsel überhaupt im Dokument des iframes ausgeführt?

                  funktioniert weder bei ie noch opera --> javascript-fehler

                  Logisch, oder?

                  gibt's für dieses problem überhaupt eine lösung?

                  Ja. Also bitte denke auch mal selber mit, vieles ist nur eine Vereinfachung in den Hilfestellungen, die hier gegeben werden. Es wird Dich also keiner davon befreien, selbst aktiv zu werden, nachzuschlagen (bsw.: http://de.selfhtml.org/javascript/objekte/all.htm#ansprechen) und nachzudenken.

                  wie kann man auf die im frame dargestellte seite zugreifen, um per javascript die höhe abzufragen? das ist die eigentlich problemstellung.

                  Das solltest Du gerade nicht tun, denn es ist relativ schwer vom parent aus sauber festzustellen, ob das Dokument im iframe komplett geladen wurde. Daher geht mein Beispiel, was die Lösung bereits koplett beinhaltet, NICHT vom parent aus, sondern vom Dokument im iframe selbst; was damit die oben an Dich gestellte Frage auflöst.

                  Gruß aus Berlin!
                  eddi

                  1. ich hab das script dort ausgeführt, wo dann die scrollbuttons angezeigt werden sollen, also nicht im iframe, sondern rechts daneben.

                    wie ist dies dann vom konzept her anzulegen, damit es funktioniert?
                    wenn ich in der seite die höhe abfrage und feststelle, ob ich die scrollbuttons anzeige oder nicht, was mache ich dann?
                    wie schaffe ich es, dass in der anderen datei dann etwas geändert wird?

                    1. Hallo

                      ich hab das script dort ausgeführt, wo dann die scrollbuttons angezeigt werden sollen, also nicht im iframe, sondern rechts daneben.

                      Das war dann genau dein Fehler!

                      Aber was meinst du mit rechts daneben, den Mutterframe, dann sprich den Iframe mit seinem Namen dort über

                      alert(IFRAME.document.body.offsetHeight) an

                      oder für Mozilla & Co. mit

                      alert(IFRAME.innerHeight)

                      und dann vergleichst du mit den von dir selbst gesetzten Höhenwerten für den Iframe über

                      parseInt(document.getElementById('IFRAME').style.height.substring(0,document.getElementById('IFRAME').style.height.length-2))

                      Gruß Gernot

                    2. Hallo harri,

                      ich hab das script dort ausgeführt, wo dann die scrollbuttons angezeigt werden sollen, also nicht im iframe, sondern rechts daneben.

                      wie ist dies dann vom konzept her anzulegen, damit es funktioniert?
                      wenn ich in der seite die höhe abfrage und feststelle, ob ich die scrollbuttons anzeige oder nicht, was mache ich dann?
                      wie schaffe ich es, dass in der anderen datei dann etwas geändert wird?

                      Ich bin für ein striktes Ende des Frage-Antwortspielchens - bitte gib den Link an, wo man sich Dein Frameset ansehen kann; ersatzweise poste bitte den Quelltext des Framesets, des Frames MITTE und des Iframes SNnews.

                      Gruß aus Berlin!
                      eddi

                      1. Hallo Eddi,

                        Ich bin für ein striktes Ende des Frage-Antwortspielchens - bitte gib den Link an, wo man sich Dein Frameset ansehen kann; ersatzweise poste bitte den Quelltext des Framesets, des Frames MITTE und des Iframes SNnews.

                        dem schließe ich mich an, sonst fabulieren wir ins Blaue und niemand sonst, der diesen Thread liest, hat was davon.

                        Harri, bitte poste deinen Code als Antwort auf deine eigene Ausgangsfrage, damit er weit oben im Thread steht und wir ihn alle sehen können ohne uns erst durch einen ellenlangen Thread durchlesen zu müssen.

                        Gruß Gernot

                2. Hallo Harri,

                  zuerst nochmal kurz zur if-bedingung, die xarax vorgeschlagen hat:
                  if (parent.document.getElementsByName([FrameName])[0].offsetHeight < document.body.offsetHeight) {...}
                  was macht das "< document.body.offsetHeight" für einen sinn? ich will ja mit der höhe der seite, die im iframe dargestellt wird, vergleichen, und nicht mit der höhe der seite, in der das iframe definiert ist.

                  Du hast Recht: vergleiche es mal mit FrameName.document.body.offsetHeight (MSIE und OPERA)
                  oder
                  FrameName.innerHeight(Mozilla und OPERA)

                  ich hab trotzdem so einiges versucht, wie ich diese höhe herausfinden könnte und hab sie jeweils ausgeben lassen.

                  [1. versuch]:
                  (anm.: detail ist sowohl id als auch name des eingebetteten frames):
                  alert(document.getElementById("detail").offsetHeight);
                  Ausgabe: IE=0 OPERA=240
                  240 ist die höhe des iframes, aber nicht der darin dargestellten seite.

                  Nun du gibst doch diesem IFRAME mit CSS eine Höhe, die kennst du doch, du kannst sie dir natürlich auch mit
                  document.getElementById("detail").style.height auch wieder ausgeben lassen, wenn du mit Pixelwerten gearbeitet hast, schneidest du mit substring() die beiden letzten Buchstaben wieder ab und machst ein parseInt(). Dann solltest du auch vergleichen können

                  [2. versuch]
                  ('dieseDat' ist eine id, die ich im body-tag der seite, die im frame dargestellt werden soll, definiert habe - in anlehnung an dieses beispiel: http://de.selfhtml.org/javascript/objekte/all.htm#offset_height ):
                  alert(document.getElementById("dieseDat").offsetHeight);
                  funktioniert weder bei ie noch opera --> javascript-fehler

                  Das müsste aber gehen, wenn du es von 'dieseDat' selbst aus und nicht von der Muttersete aus aufrufst.

                  [3. versuch]
                  alert(document.getElementsByName("detail").offsetHeight);

                  Da fehlt die [0] für das erste Array-lement_^

                  sowohl bei ie als auch bei opera kommt im fenster: undefined

                  [4. versuch]
                  (so wie es xarax vorgeschlagen hat, zu versuchen)
                  alert(parent.document.getElementsByName([detail])[0].offsetHeight);
                  funktioniert weder bei ie noch opera --> javascript-fehler

                  Wahrscheinlich hat XaraX das wie Versuch 3 gemeint.

                  gibt's für dieses problem überhaupt eine lösung?

                  Nicht verzweifeln, wir sind ja da, ich denke es gibt eine Lösung!

                  zu "google ist dein bester freund": natürlich hab ich das versucht, bevor ich hier das erste mal gepostet habe, darum hab ich auch geschrieben: ich habe leider nichts gefunden...
                  es ist allerdings auch nicht so leicht, nach welchen stichwörtern man suchen soll.

                  Ich glaube dir das!

                  Gruß Gernot

  2. hallo.
    ich habe ein eingebettetes frame und rechts davon zwei grafische buttons zum hinauf und hinunter scrollen definiert.
    nun möchte ich, dass die scroll-buttons nur angezeigt werden, wenn sie auch wirklich notwendig sind (also in abhängigkeit der höhe der dargestellten html-seite im frame).

    gibt's für diese problemstellung irgendwo ein beispiel zum ansehen? das würde mir sehr, sehr weiterhelfen!

  3. hi.

    das ist also der quellcode zu diesem thema, ich kann die dateien leider noch nirgendwo online stellen...

    zur wiederholung: ich habe ein eingebettetes frame und rechts davon zwei grafische buttons zum hinauf und hinunter scrollen definiert [index.html].
    nun möchte ich, dass die scroll-buttons nur angezeigt werden, wenn sie auch wirklich notwendig sind (also in abhängigkeit der höhe der dargestellten html-seite [page1.html] im frame).

    ist dies möglich?

    -----------------------------------------------------------
    [index.html]:
    ...
    <script language="JavaScript" src="../scripts/scripts.js" type="text/JavaScript">
    </script>
    ...
    <iframe src="page1.html" id="detail" name="detail" width="290" height="240">
      <p>can't show frames...</p>
    </iframe>
    ...
    <a href="javascript:scrollTop()">
      <img src="up_normal.jpg" name="up" border="0">
    </a>
    ...
    <a href="javascript:scrollBottom()">
      <img src="down_normal.jpg" name="down" border="0">
    </a>

    -----------------------------------------------------------
    [page1.html]:
    ...
    <script language="JavaScript" src="../scripts/scripts.js" type="text/JavaScript">
    </script>
    ...

    -----------------------------------------------------------
    [scripts.js]:

    function scrollTop() {
      var i;
      for (i = 0; i < scrollSize; i++) {
        frames['detail'].window.scrollBy(0, -1);
      }
    }

    function scrollBottom() {
      var i;
      for (i = 0; i < scrollSize; i++) {
        frames['detail'].window.scrollBy(0, 1);
      }
    }

    1. Hallo Harri,

      ich schau mir das morgen mal an, mittlerweile bin ich nämlich selbst zu müde. Für alle anderen, die vielleicht "zuvorkommend" sind: Anregungen gibt es auch an anderen Stellen hier im Thread.

      Gruß Gernot

      1. Hallo Harri,

        ich schau mir das morgen mal an, mittlerweile bin ich nämlich selbst zu müde. Für alle anderen, die vielleicht "zuvorkommend" sind: Anregungen gibt es auch an anderen Stellen hier im Thread.

        Gruß Gernot

        besten dank vorerst mal! :-)
        viele grüße,
        harri

    2. Gute Nacht,


      <script language="JavaScript" src="../scripts/scripts.js" type="text/JavaScript">
      </script>
      ...

      <iframe src="page1.html" name="detail" width="290" height="240">

      <p>can't show frames...</p>
      </iframe>
      ...

      <div id='link'></div>


      <script type="text/JavaScript">
      function pruefe()
         {
         if(document.all && document.all.tags('body')[0].offsetHeight)
              var a=document.all.tags('body')[0].offsetHeight;
         else var a=document.body.offsetHeight;

      var b=parent.document;

      if(b.getElementsByName("detail")[0].height<a)
            {
            var c=b.getElementById('link');
            var d=document.createElement('img');
            d.src='up_normal.jpg'
            d.onmouseover=function(){scrollTop();}
            c.appentChild(d);
            var d=document.createElement('img');
            d.src='down_normal.jpg'
            d.onmouseover=function(){scrollBottom();}
            c.appentChild(d);
            }
         }

      </script>

      ...

      <body onLoad='pruefe()'>


      [scripts.js]:

      function scrollTop() {
        var i;
        for (i = 0; i < scrollSize; i++) {
          frames['detail'].window.scrollBy(0, -1);
        }
      }

      function scrollBottom() {
        var i;
        for (i = 0; i < scrollSize; i++) {
          frames['detail'].window.scrollBy(0, 1);
        }
      }

      Da ich leider (wie schon in https://forum.selfhtml.org/?t=88464&m=527650 angekündigt) betriebs(system)blind bin, bitte ich nochmal einen IE-Nutzer den Code zu validieren. Danke!

      Gruß aus Berlin!
      eddi

      1. Hallo Eddi und Harri (Harald und Eddi?),

        ich habe an dem Code einiges umgestellt, weil das bei mir unter Windows 98 trotz Korrectur des Rechtschreibfehlers (appendChild) gar nicht funktionierte. Aber danke für die guten Anregungen Eddi, alleine hätte ich wahrscheinlich eher was mit visibility gefummelt, so war's mal was anderes.

        http://www.sprachlernspiele.de/scroll

        Die Inhalte der eingebetteten Dokumente müssen in einem alles umschließenden Div-Element (quasi Einzelkind des Body-Element) stehen, da das Body-Element selbst ansonsten immer den gleichen Wert bei offsetHeight hat wie die Höhe des Iframes auf der Mutterseite, in den er als Source geladen wird. Das taugt folglich nicht als Bedingung zum Hinzufügen bzw. Entfernen der Scrollbuttons.

        Die folgende Seite läuft bei mir im MSIE 6.0, Mozilla 1.6 und Netscape 7.1. Opera 7.11 generiert zwar die Buttons, je nachdem, ob zuerst die Seite 'voll.html' oder 'leer.html' geladen wird dynamisch, hat aber aufgrund irgendwelcher Umstände Probleme mit meiner Funktion 'change()'. Vielleicht packt das aber eine neuere Version von Opera.

        Für sachdienliche Tipps, wie man das Opera-Problem beheben könnte und in welchen Versionen es überhaut nur auftritt, wäre ich dankbar.

        Gruß Gernot

        1. vielen dank an eddi und gernot!!!

          grüße
          harri

        2. Hallo Gernot,

          ich habe an dem Code einiges umgestellt, weil das bei mir unter Windows 98 trotz Korrectur des Rechtschreibfehlers (appendChild) gar nicht funktionierte.

          Das bin typisch ich: Erst im Textarea des Forums etwas zusammenzuschustern, dann die Änderungen, die bei der Probe auf dem PC entstehen, nicht zu übernehmen. Danke für die Korrektur.

          Aber danke für die guten Anregungen Eddi, alleine hätte ich wahrscheinlich eher was mit visibility gefummelt, so war's mal was anderes.

          http://www.sprachlernspiele.de/scroll

          Im allgemeinen ärgere ich mich schon wieder über meinen Ansatz. Er arbeitet völlig gegen jetwede Vernunft. Im Eigentlichen sollte der iframe immer einen Scrollbalken haben, der im Falle aktiviertem JavaScripts erst entfernt wird und dann eine JS-Lösung bereit hält.

          Die Inhalte der eingebetteten Dokumente müssen in einem alles umschließenden Div-Element (quasi Einzelkind des Body-Element) stehen, da das Body-Element selbst ansonsten immer den gleichen Wert bei offsetHeight hat wie die Höhe des Iframes auf der Mutterseite, in den er als Source geladen wird. Das taugt folglich nicht als Bedingung zum Hinzufügen bzw. Entfernen der Scrollbuttons.

          Doch doch...
          Bei der index.html hast Du wenigstens noch den Doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> vergeben, jedoch nicht mehr bei der voll.html.
          Wenn ich mich recht erinnere, so wird auch beim IE 6 mit der exakten Angabe (<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">) jedenfalls jedoch in der Variante strict der body nicht auf die gesamte Anzeigefläche ausgedehnt.

          Was dennoch rechtkurzsichtig ist, da Deine Methode prinzipiell auch ältere Browser mitmachen.

          Die folgende Seite läuft bei mir im MSIE 6.0, Mozilla 1.6 und Netscape 7.1. Opera 7.11 generiert zwar die Buttons, je nachdem, ob zuerst die Seite 'voll.html' oder 'leer.html' geladen wird dynamisch, hat aber aufgrund irgendwelcher Umstände Probleme mit meiner Funktion 'change()'. Vielleicht packt das aber eine neuere Version von Opera.

          Für sachdienliche Tipps, wie man das Opera-Problem beheben könnte und in welchen Versionen es überhaut nur auftritt, wäre ich dankbar.

          Möglicherweise braucht Opera die Extraeinladung:

          detail.location.href='voll.html';

          Dann könnte man überlegen, ob man while() nicht einfach unter den Tisch fallen läßt. Sollte es an indexOf() liegen, währe auch substr() / substring() eine Alternative:

          var x=detail.location.href
          x=x.substr(x.length-9,9)

          Das ganze ist schon super, simpel gelöst; keine Frage. Notfalls bleibt dann nur noch die Voll-HTML-Keule mit einem reellen Link, der zwei unterschiedliche Dokumente in parent läd, die ihrerseits den iframe mit einer unterschiedlichen src versorgen.

          Gruß aus Berlin!
          eddi

          1. Hallo Eddi,

            Im allgemeinen ärgere ich mich schon wieder über meinen Ansatz. Er arbeitet völlig gegen jetwede Vernunft. Im Eigentlichen sollte der iframe immer einen Scrollbalken haben, der im Falle aktiviertem JavaScripts erst entfernt wird und dann eine JS-Lösung bereit hält.

            Das könnte man ja, wenn man im IFRAME erst einmal scrolling="auto" schreibt, in der Funktion pruefe() machen mit der Zeile

            a.setAttribute('scrolling', 'no' , 'false');
            vielleicht geht auch einfach:
            a.scrolling='no';

            Die Inhalte der eingebetteten Dokumente müssen in einem alles umschließenden Div-Element (quasi Einzelkind des Body-Element) stehen, da das Body-Element selbst ansonsten immer den gleichen Wert bei offsetHeight hat wie die Höhe des Iframes auf der Mutterseite, in den er als Source geladen wird. Das taugt folglich nicht als Bedingung zum Hinzufügen bzw. Entfernen der Scrollbuttons.

            Doch doch...
            Bei der index.html hast Du wenigstens noch den Doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> vergeben, jedoch nicht mehr bei der voll.html.

            Wenn ich mich recht erinnere, so wird auch beim IE 6 mit der exakten Angabe (<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">) jedenfalls jedoch in der Variante strict der body nicht auf die gesamte Anzeigefläche ausgedehnt.

            Was dennoch rechtkurzsichtig ist, da Deine Methode prinzipiell auch ältere Browser mitmachen.

            Da war ich eben quick and dirty, aber wenn dabei sogar allgemeingültigere Lösungen herauskommen, ist es ja sogar gut.
            Deshalb fand ich auch deinen Schnellschuss gar nicht so verkehrt. Ich finde, wir sollten uns alle hier im Forum auch mal mehr trauen Fehler zu machen, daran lernen wir ja dann alle was.

            http://www.sprachlernspiele.de/scroll

            Opera 7.11 generiert zwar die Buttons, je nachdem, ob zuerst die Seite 'voll.html' oder 'leer.html' geladen wird dynamisch, hat aber aufgrund irgendwelcher Umstände Probleme mit meiner Funktion 'change()'. Vielleicht packt das aber eine neuere Version von Opera.

            Ich habe gestern auf Opera 7.54 geupdatet. Jetzt läuft es auch da ohne Veränderung am Code, wie ich vermutet habe. Opera 7.11 zickt nämlich, wie ich an einem anderen Projekt feststellen musste, auch bei setAtrribute(), rendert die geänderten Werte am Bildschirm nicht, gibt sie aber über alert() als geändert aus. Da war ich es leid.

            Gruß aus Köln

            Gernot

          2. Hallo Eddi,

            ich habe noch einmal ein bisschen herumgebastelt und deine Anregungen aufgegriffen. Jetzt müsste die Seite auch bei deaktiviertem JS laufen, dann halt mit Scrollbalken im IFRAME.

            Zum Ausblenden des Scrollbalkens braucht der IE wieder mal eine andere Syntax als die übrigen Browser. NetScape 7.1 blendet den Scrollbalken mit keiner der beiden Syntaxen aus. Ob es da überhaupt eine Möglichkeit gibt, weiß ich nicht. Das Komische dabei: Mozilla 1.6 blendet den Scrollbalken brav per JS aus.

            Auch das Opera-7.11-Problem dürfte dank der direkten Links mit Target auf das IFRAME-Window eliminiert sein. Das lag wahrscheinlich an dem # im href und dem fehlenden "return false" im onClick-Eventhandler nach dem Aufruf der Funktion "change()", derer es ja nun jetzt ohnehin nicht mehr bedarf.

            http://www.sprachlernspiele.de/scroll

            Ich würde mal meinen, die Seite ist jetzt optimal "tiefergelegt"!

            http://forum.de.selfhtml.org/archiv/2004/8/87344/#m519480

            Gruß Gernot