Ralf Muschke: parent.frames["inhaltFrame"] nicht auf iframes anwendbar ?

Hallo,
folgendes Problem stellt sich mir derzeit:
ich möchte gerne mit der Funktion:

function displayScreen(index) {
    parent.frames["inhaltFrame"].goToScreen(index);
}

auf einen iframe zugreifen der folgendermaßen aussieht:

<iframe src="scroll.htm" name="inhaltFrame" width="495" height="321" marginheight="0" marginwidth="0" frameborder="0" ></iframe>

das ganze hängt mit der Funktion getXOffset und der Funktion gotoScreen zusammen, die folgendermaßen aussehen:

var isIE = -1 != navigator.appName.indexOf("Microsoft");
var isNN = -1 != navigator.appName.indexOf("Netscape");

function getXOffset() {
    return isIE ? document.body.scrollLeft : window.pageXOffset;
} // getXOffset

function goToScreen(index) {
    if (!isIE && !isNN) {
        return;
    }

//var finalLeft = (index - 1) * SCREEN_WIDTH;
    var finalLeft = POSITIONS[index-1]

var currentLeft = getXOffset();
    if (finalLeft == currentLeft) {
        return;
    }
    var stepIndex = Math.round(Math.abs(finalLeft - currentLeft) / SCREEN_WIDTH);
    slideStep = STEPS[stepIndex];
    slideScreen(index);
} // goToScreen

Mein Problem derzeit das der Effekt im Firefox und auf dem Safari(MAC) wunderbar funktioniert...
jedoch gibt der IE mal wieder kein Muks von sich...
bei meinen recherchen auf selfhtml ist mir aufgefallen das bei pageXOffset nur die rede von zugriff auf frames die Rede war, aber nicht von zugriff auf Iframes...
Entschuldigt mir bitte meine Unwissenheit, aber könnte es damit zusammenhängen? Hat der IE evtl. damit Probleme?

  1. Hallo Ralf,

    function displayScreen(index) {
        parent.frames["inhaltFrame"].goToScreen(index);
    }

    auf einen iframe zugreifen der folgendermaßen aussieht:

    Das müsste in allen Browsern gleichermaßen funktionieren, die Iframes kennen.

    var isIE = -1 != navigator.appName.indexOf("Microsoft");
    var isNN = -1 != navigator.appName.indexOf("Netscape");

    Ist als Unterscheidung vollkommen ungeeignet, frag lieber die Methoden und Eigenschaften ab, die du benutzen willst.

    statt:

    function getXOffset() {
        return isIE ? document.body.scrollLeft : window.pageXOffset;
    } // getXOffset

    also z.B.:

      
    function getXOffset() {  
      if(window.window.pageXOffset)  
        return window.pageXOffset;  
      else if(document.body.scrollLeft)  
        return document.body.scrollLeft;  
      else return false;  
    }  
    
    

    Dabei musst du aber beachten, dass document.body.scrollLeft erst zur Verfügung steht, wenn das Dokument vollständig geladen ist. Das solltest du also erst über den onload-Eventhandler des entsprechenden Elements initiieren.

    Da liegt wahrscheinlich der Hase im Pfeffer.

    Gruß Gernot

    1. Jetzt hab ich einen interessanten Effekt! Wenn ich auf einen Link klicke fährt beim IE der iframe komplett nach rechts und wenn man ihn mit der Maus verschieben möchte, fährt er immer wieder nach rechts wenn man die Maus los lässt.

      Also die js datei die für das alles verantwortlich ist, sieht folgendermaßen aus:

      // This is configurable
      var SCREEN_WIDTH = 200;

      var STEPS = new Array(0, 40, 40, 50, 50, 60, 60, 100, 150, 200, 300);
      var POSITIONS = new Array(0, 200,400,600,800,1000,1200);

      var slideSteps = 100;

      // This is fixed
      var slideTimer = 0;
      var slideStep = 60;
      var isIE = -1 != navigator.appName.indexOf("Microsoft");
      var isNN = -1 != navigator.appName.indexOf("Netscape");

      function getXOffset() {
        if(window.window.pageXOffset)
          return window.pageXOffset;
        else if(document.body.scrollLeft)
          return document.body.scrollLeft;
        else return false;
      }

      function slideScreen(index) {
          // Clear slide timer
          if (0 != slideTimer) {
              clearTimeout(slideTimer);
              slideTimer = 0;
          }
          // Check if scroll is to an end
          // var finalLeft = (index - 1) * SCREEN_WIDTH;
          var finalLeft = POSITIONS[index-1]
          var currentLeft = getXOffset();
          if (currentLeft == finalLeft) {
              return;
          }
          // Scroll
          var isForward = currentLeft < finalLeft;
          // This adjustment is required for NN, whose scrollTo() is not reliable.
          if (slideStep > Math.abs(finalLeft - currentLeft)) {
              slideStep = Math.abs(finalLeft - currentLeft);
          }
          var scrollStep = isForward ? slideStep : -slideStep;
          scrollBy(scrollStep, 0);
          // Set next slide timer
          slideTimer = setTimeout("slideScreen(" + index + ")", 1000 / slideSteps);
      } // slideScreen

      function goToScreen(index) {
          if (!isIE && !isNN) {
              return;
          }

      //var finalLeft = (index - 1) * SCREEN_WIDTH;
          var finalLeft = POSITIONS[index-1]

      var currentLeft = getXOffset();
          if (finalLeft == currentLeft) {
              return;
          }
          var stepIndex = Math.round(Math.abs(finalLeft - currentLeft) / SCREEN_WIDTH);
          slideStep = STEPS[stepIndex];
          slideScreen(index);
      } // goToScreen

      function MM_openBrWindow(theURL,winName,features) { //v2.0
        window.open(theURL,winName,features);
      }
      //-->

      Leider bin ich in Javascript nicht so bewandert könntest du mir zeigen wie ich die Browserunterscheidung korrekt anwende ?

      1. Hallo Ralf,

        Leider bin ich in Javascript nicht so bewandert könntest du mir zeigen wie ich die Browserunterscheidung korrekt anwende ?

        Du solltest -wie gesagt- keine Browserunterscheidung machen, sondern eine Unterscheidung der Methoden und Eigenschaften, die sie beherrschen.

        Viel wichtiger als dein JS-Quellcode wäre mir, zu sehen, wo in deinem HTML-Quellcode bestimmte Funktionen aufgerufen werden.

        Stell es am besten mal online, damit ich in Firefox sehen kann, was du haben möchtest und dir Tipps geben kann, wie du das für IE anpasst. Sprechen wir eigentlich über den IE am Mac, da du Safari erwähntest? Da kann ich dir dann vielleicht gar nicht helfen, sellbst wenn es im IE6 am PC funktioniert.

        Gruß Gernot

        1. Wir Sprechen über den IE am PC ich hatte nur die Möglichkeit bei einem Freund es auf dem Safari auszuprobieren.

          die Seite kann man unter http://www.cworx.org/Website/UC_Weblayout.htm

          Die Ladezeiten sind etwas lang, da die Seite noch nicht optimiert ist.

          1. Hallo Ralf,

            die Seite kann man unter http://www.cworx.org/Website/UC_Weblayout.htm

            Das Scrollen mit dem Balken funktioniert bei mir im IE6 unter Win98 genauso wie in Firefox 1.0.4 und Opera 8. Wenn es dir um Sprungmarken in dem Bild geht (bestimmte Stellen zu denen bei Klick auf die Links darunter gescrollt werden soll), dann würde ich auch mit solchen Ankern arbeiten, damit es auch ohne JS funktioniert. Für ein "sanftes Dorthinscrollen" brauchst du dann allerdings JS. das müsste dann allerdings alles ganz anders aussehen als bisher.

            Wenn du das jetzige Teil reparieren möchtest, dann folge bitte Molilys Hinweis und modifiziere die von mir bereits angefangene Modifikation weiter in seinem Sinne mit

            document.documentElement.scrollLeft

            Wir schauen dann noch mal drüber, ob du auch alles richtig gemacht hast.

            Gruß Gernot

            1. Also mir geht mir um die Sprungmarken also wenn ich einen Link anklicke das er auch dahin scrollt! Und das Funktioniert bei mir mit Firefox wunderbar.. nur mit dem IE eben nicht.

              1. Hallo Ralf,

                Also mir geht mir um die Sprungmarken also wenn ich einen Link anklicke das er auch dahin scrollt! Und das Funktioniert bei mir mit Firefox wunderbar.. nur mit dem IE eben nicht.

                Wenn dir ein sanftes Dahinscrollen nicht wichtig ist, dann lass doch diesen ganzen JS-Kram weg und mach es mit reinem HTML über das id- oder das name-Attribut im A-Element.

                Gruß Gernot

                1. Das Problem ist, das mir das sanfte dahinscrollen eben sehr wichtig ist.
                  Ich wäre für Hilfe sehr sehr dankbar.

                  1. Hallo Ralf,

                    Das Problem ist, das mir das sanfte dahinscrollen eben sehr wichtig ist.
                    Ich wäre für Hilfe sehr sehr dankbar.

                    Abgesehen von deiner ersten Zeile und den überflüssigen Y-Werten

                      
                     return isIE ? document.body.scrollLeft : window.pageXOffset;  
                    
                    

                    sieht deine Funktion getXOffset() aber jetzt schon gar nicht so schlecht aus.

                    view-source:http://www.cworx.org/Website/zisch.js

                    Ich komm aber heute nicht weiter dazu, mir das anzuschauen. Schöner wäre es sowieso, wenn man das mit Sprungmarken kombinieren könnte, sodass es auch ohne JS -dann halt sprunghaft- läuft. Viellecht versuchst du einfach mal was. Ich werde das dann im Auge behalten und die Entwicklung beobachten.

                    Gruß Gernot

                    1. Interessant ist, das sobald ich die Zeile

                      return isIE ? document.body.scrollLeft : window.pageXOffset;

                      herausnehme.. garnichts mehr funktioniert.... also ich stehe hier echt vor ner mittelschweren Kriese.

                      1. Die Lösung war sehr einfach und so "rotzbekloppt" da keiner hätte darauf kommen können...
                        Ich musste in der frame datei also der scroll.htm das Bild einfach in eine Table legen und schwups gings im IE...

    2. Hallo nochmal,

      function getXOffset() {
        if(window.window.pageXOffset)
          return window.pageXOffset;
      //else if(document.body.scrollLeft)

      //        ^^^^^^^^^^^^^^^^^^^^^^^^ als Abfrage ungeeignet,
         // da es 0 sein könnte, was ein gültiger Wert wäre, deshalb besser:
           else if(typeof(document.body.scrollLeft)!='undefined')

      return document.body.scrollLeft;
        else return false;
      }

        
      Gruß Gernot
      
      1. Hallo,

        [code lang=javascript]
        function getXOffset() {
          if(window.window.pageXOffset)
            return window.pageXOffset;
        //else if(document.body.scrollLeft)
           //        ^^^^^^^^^^^^^^^^^^^^^^^^ als Abfrage ungeeignet,
           // da es 0 sein könnte, was ein gültiger Wert wäre, deshalb besser:
             else if(typeof(document.body.scrollLeft)!='undefined')

        Nein, typeof ist nicht besser.
        Im MSIE 6 standardkonformer Modus ist document.body.scrollLeft gesetzt (typeof ergibt wahrscheinlich Number), aber hat immer den Wert 0.
        Der korrekte Wert (> 0) liegt dann unter document.documentElement.scrollLeft.
        Diese Funktion würde also immer 0 im standardkonformen Modus zurückgeben.

        Mathias

  2. Hallo,

    parent.frames["inhaltFrame"].goToScreen(index);

    Das sollte prinzipiell im IE funktionieren.
    Wobei parent.frames andere Resultate als window.frames liefern, wenn das Dokument wiederum in einem Frameset steckt.

    das ganze hängt mit der Funktion getXOffset und der Funktion gotoScreen zusammen, die folgendermaßen aussehen:

    var isIE = -1 != navigator.appName.indexOf("Microsoft");
    var isNN = -1 != navigator.appName.indexOf("Netscape");

    Es kommen falsche Ergebnisse heraus, wenn du Browserweichen mit unbeteiligten Objekten vornimmst. Vor allem, wenn es sich dabei um das willkürliche navigator-Objekt handelt. Im Übrigen gibt es mehr Browser als IE und Netscape.

    function getXOffset() {
        return isIE ? document.body.scrollLeft : window.pageXOffset;
    } // getXOffset

    Das ist unzuverlässig, nimm dieses Script:
    http://www.quirksmode.org/viewport/compatibility.html (Scrolling offset)
    Das funktioniert auch im standardkonformen Modus in MSIE 6.

    function goToScreen(index) {
        if (!isIE && !isNN) {
            return;
        }

    //var finalLeft = (index - 1) * SCREEN_WIDTH;
        var finalLeft = POSITIONS[index-1]

    var currentLeft = getXOffset();
        if (finalLeft == currentLeft) {
            return;
        }
        var stepIndex = Math.round(Math.abs(finalLeft - currentLeft) / SCREEN_WIDTH);
        slideStep = STEPS[stepIndex];
        slideScreen(index);
    } // goToScreen

    Aha. In der Funktion scheint kein oberflächlicher Fehler zu sein, dennoch kann ich anhand dieses codes nicht beurteilen, warum MSIE nicht das tut, was er soll.
    Wie sieht denn die Funktion slideScreen aus? Es wäre am sinnvollsten, wenn du den relevanten Code online stelltest.

    bei meinen recherchen auf selfhtml ist mir aufgefallen das bei pageXOffset nur die rede von zugriff auf frames die Rede war, aber nicht von zugriff auf Iframes...

    Jedes window-Element mit einem body hat auch ein pageXOffset. Man kann darauf zugreifen, egal, ob es sich um einen Frame eines Framesets oder einen iframe in einem regulären Dokument handelt.

    Mathias