Enrico: Mehrere Probleme mit Javascript & Frames

Hallo,

Ich habe mich an Sie gewendet, weil ich Schwierigkeiten mit der Bereinigung von einigen Fehlern bzw. Missständen meiner Homepage habe. Mir geht es nicht um die Erstellung einer kompletten Homepage.

Hoffentlich können Sie mir weiterhelfen.

Damit Sie sich einen Überblick verschaffen können, nachfolgend zunächst die Beschreibung meiner Homepage:

=======
INHALT:

Meine Homepage wird ein Geschenk für meine Verlobte. Inhaltlich wird sie zum Grossteil umfangreiche Fotogalerien enthalten. Selbstverständlich wird der Inhalt KEINEN pornografischen, anzüglichen, radikalen oder diskriminierenden Charakter aufweisen. Es handelt es sich um eine private Homepage.

==========================
BESCHREIBUNG DER HOMEPAGE:

Meine Homepage besteht aus folgendem Container-Frameset:
"frm_variablen" [1]
"frm_container" [2]

Zu [1]
In diesem unsichtbaren Frame der Grösse 0px wird eine js-Datei mit allen benötigten Variablen geladen, so dass ich diese quasi global verwenden kann.

Zu [2]
In diesen Frame wird das Layout unserer Homepage angezeigt, das aus einer verschachtelten Tabelle und folgenden vier eingebetteten Frames besteht:
"N_register" [2.1]
"haupt"      [2.2]
"N_seite"    [2.3]
"N_browser"  [2.4]

Zu [2.1]
In diesem Frame wird meine Seiten-Navigation über Imagemaps dargestellt (Darstellung über Registerreiter; anwählbare Seiten sind als Links dargestellt, der ausgewählte Seitentitel als hervorgehobener, grafischer Registerreiter ohne Linkfunktion). Wird ein inaktiver Registerreiter angewählt, dann wird die Imagemap gewechselt.

Zu [2.2]
In diesem Frame werden meine Seiten angezeigt.

Zu [2.3]
Dieser Frame zeigt, in Abhängigkeit der Position der aktuellen Seite zum Frame (Seitenanfang, beliebige Position innerhalb der Seite oder Seitenende), verschiedene Imagemaps zur Steuerung der in Frame [2.2] angezeigten Seite an. D.h. dass die Imagemaps, je nach Position der aktuellen Seite zum Frame, gewechselt werden:
-Nur Sprung zum Seitenanfang oder Hochscrollen
-Nur Sprung zum Seitenende oder Runterscrollen
-Die komplette Navigation
-Gar keine Navigation (wenn die Seite kleiner als der zur Verfügung stehende Framebereich ist)

Die einzelnen Aktionen werden bei OnMouseOver gestartet und bei OnMouseOut wieder beendet.

Um die Navigation dynamisch zu gestalten, ist eine Funktion enthalten, die überprüft, ob der angezeigte Bereich der aktuellen Seite überhaupt scrollbar ist:

function scrollable()
{
  if(parent.haupt.innerHeight)
    return ((parent.haupt.pageYOffset + parent.haupt.innerHeight) < parent.haupt.document.height);
  else
    return ((parent.haupt.document.body.scrollTop + parent.haupt.document.body.clientHeight) < parent.haupt.document.body.scrollHeight);
}

----------
PROBLEM 1:
----------

Die obige Abfrage funktioniert bestens, wenn ich hoch- oder runterscrollen will, nicht aber beim ersten Aufruf einer Seite (diese Funktion wird unmittelbar vor dem </body>-Tag aufgerufen, wenn eine Seite vollständig geladen wurde).

Die Scrollfunktion, beispielsweise zum Hochscrollen, sieht folgendermassen aus:

function hochscrollen()
{
  if(!scrollable()) <= Abfrage auf Seitenposition
  {
    stop(); <= Scrollen beenden
    parent.N_seite.location.href="[...]"; <= Imagemap wechseln
  }
  if(parent.N_seite.location.href != "[...]") <= Bereich ist scrollbar, Abfrage auf angezeigte Imagemap
    parent.N_seite.location.href="[...]"; <= Imagemap wechseln (volle Navigation)
  parent.haupt.scrollBy(0, -1); <= 1 Bildpunkt nach oben scrollen
  timer = window.setTimeout("hochscrollen()", 30); <= Verzögerung
}

----------
PROBLEM 2:
----------

Wenn ich in obiger Funktion die Abfrage nach der angezeigten Imagamap weg lasse, wird absolut flüssig gescrollt. Da aber die Imagemap, wie beschrieben, dynamisch wechseln lassen möchte, benötigt ich ja diese Abfrage, die prüft, ob für eine scrollbare Seite die komplette Navigation angezeigt wird oder nicht.

Zu [2.4]
In diesem Frame wird die Navigation zum Zurück- und Vorblättern angezeigt. Die Anzeige erfolgt ebenfalls dynamisch. Ist ausser der Startseite noch keine weitere Seite aufgerufen worden, so steht keine Navigation zur Verfügung. Befindet man sich auf der letzten Seite unserer Homepage, d.h. es ist keine Seite mehr zum Vorblättern vorhanden, dann wird nur der Zurück-Button angezeigt. Analag dazu wird nur der Vor-Button angezeigt, wenn man sich auf der ersten Seite befindet und weitere Seiten zum Vorblättern vorhanden sind.

Da ich ja die Bereiche in eingebettete Frames unterteilt habe, muss ich beim Anwählen einer Seite im Register (siehe Punkt [2.1]) zwei Frames gleichzeitig ändern. So eine Funktion einzubauen war auch kein Problem.

Um zu vermeiden, dass es Probleme mit den Navigations-Schaltflächen des Browsers gibt, ersetze ich die history des Browsers mit dem Eintrag framename.location.replace(ziel). Diese Vorgehensweise macht es aber nötig, dass ich das Register, die Seite, die Seitennavigation und die Browsernavigation abspeichere.

Prinzipiel ist das über ein mehrdimensionales Array auch kein Problem. Das Array wird über die Variablen-Definition im Frame frm_variablen angelegt, damit ich immer darauf zurückgreifen kann:

var herkunft = new Array();

Die Funktion zum Wechseln des Registers und Abspeichern der Herkunft erfolgt in einer ausgelagerten js-Datei und sieht folgendermassen aus:

function zwei_frames(aktuelles_register,aktuelle_seite,ziel_1,frame_1,ziel_2,frame_2)
{
  var neues_element = parent.frm_variablen.new herkunft_detail(aktuelles_register,aktuelle_seite);
  herkunft = herkunft.push(neues_element);
  frame1 = eval("parent." + frame_1);
  frame2 = eval("parent." + frame_2);
  frame1.location.replace(ziel_1);
  frame2.location.replace(ziel_2);
}

function herkunft.detail(aktuelles_register,aktuelle_seite)
{
  this.N_register = aktuelles_register;
  this.S_seite    = aktuelle_seite;
}

----------
PROBLEM 3:
----------

Mein drittes Problem ist eigentlich ein zweigeteiltes:
Erstens weiss ich nicht, ob die Abspeicherung so auch funktioniert und zweitens kann ich das Register nicht mehr wechseln. Hier erhalte ich Fehlermeldungen, die mir leider nichts sagen.

================
ZUSAMMENFASSUNG:

Hier nochmal meine Probleme in der Übersicht:
-Die Überprüfung, ob eine angezeigte Seite kleiner als der zur Verfügung stehende Framebereich ist, funktioniert nicht (siehe Punkt [2.3])
-Runter- und Hochscrollen ruckelt
-Register werden nicht mehr gewechselt (Abspeicherung funktioniert nicht ?)

Ich hoffe wirklich, dass Sie mir weiterhelfen können

Mit freundlichem Gruss, Enrico

  1. Hallo Enrico,

    bei so einer schönen Fehlerbeschreibugn ist es schon fast ärgerlich, keine konkreten Lösungshinweise geben zu können ;-)


    PROBLEM 1:

    Die obige Abfrage funktioniert bestens, wenn ich hoch- oder runterscrollen will, nicht aber beim ersten Aufruf einer Seite (diese Funktion wird unmittelbar vor dem </body>-Tag aufgerufen, wenn eine Seite vollständig geladen wurde).

    Wann funktioniert sie denn dann genau? z.B. nachdem ein Element über location.href neu geladen wurde? Ich könnte mir vorstellen, daß der Browser auch beim erreichen des </body>-Tags noch nicht soweit ist, den Eigenschaften des window-Objekts (innerHeight) sinnvolle Werte zu geben. Probieren Sie es mal testweise mit einem Timeout von ein paar Sekunden beim Aufruf dieser Funktion.


    PROBLEM 3:

    Mein drittes Problem ist eigentlich ein zweigeteiltes:
    Erstens weiss ich nicht, ob die Abspeicherung so auch funktioniert und zweitens kann ich das Register nicht mehr wechseln. Hier erhalte ich Fehlermeldungen, die mir leider nichts sagen.

    Ob die Abspeicherung funktioniert, kann man über ein alert() in der Speicherfunktion prüfen - geben Sie einfach die Länge oder alle Elemente des Arrays aus, nachdem Sie etwas daran geändert haben.
    Die Fehlermeldung sagen vielleicht Ihnen nix, aber für das Forum wären sie zur Fehlerbehebung quasi von essentieller Bedeutung - also bitte abschreiben / kopieren und posten!

    Simon

    1. Hallo Simon,

      Danke für die Blumen und natürlich für Ihre rasche Antwort :-)

      Es ist vielleicht einfacher, wenn ich Ihnen die betroffenen Dateien als ZIP-Datei schicke.

      Was halten Sie davon ?

      Wenn mein Vorschlag ok ist, einfach eine kurze eMail an mich.

      Danke. Enrico

      1. Hallo Enrico,

        Es ist vielleicht einfacher, wenn ich Ihnen die betroffenen Dateien als ZIP-Datei schicke.

        Was halten Sie davon ?

        wenig, weil ich ab heute Abend für vier Wochen weg bin, und in der Zwischenzeit wird aus der Korrektur leider nix. Abgesehen davon ist dies ein Forum und keine Reparaturstelle für Webseiten, das mit dem Zuschicken ist hier also quasi schlechter Stil ;-)
        Posten Sie doch, wonach ich gefragt hatte, hier rein, dann können es viele Leute lesen, die mehr Ahnung von JavaScript haben als ich.

        Simon