trollkongen: Anker auch im Frame nachladen

Hallo zusammen,

vorab: Ich weiß, Frames sind furchtbar veraltet und sind sehr suboptimal, leider ist das bei meinem Fall aber erstmal nicht zu ändern. (Komplexe Seite einer Bekannten, die nicht alles komplett ändern will.)

Ihr Problem war bzw. ist das Übliche: Wird die URL einer einzelnen Seite benutzt, wie google oder als Link in Facebook, fehlt natürlich der Frame.

Dank dem Artikel "Datei dynamisch in Frameset laden" ist ihr da grundsätzlich geholfen, mit nur einem anderen Problem: Die Bekannte benutzt viele Anker, um auf den Seiten oder auch zwischen Seiten zu springen.

Nun hab ich von JS eher wenig Ahnung. Tiefere Einblicke habe ich erst seit heute Morgen. ;)

Bei

 function checkFrameset() {  
  if(!parent.xyzVerweisframe)  
   location.href="http://www.xy.de/unterverzeichnisXY/index.htm?" + location.pathname;

wird ja nur der Pfad der Seite (pathname) übergeben. Ich dachte, man könnte es vielleicht mit "location.href" statt "location.pathname" lösen, aber das funktioniert nicht. Zwar ist der übergebene String dann tatsächlich die komplette URI inklusive dem Hash/Anker, allein: zum Ankerpunkt wird dennoch nicht gehüpft.

Was muss ich also tun, um der Funktion das beizubringen? Vermutlich übersehe ich da was in meiner Unwissenheit bzw. mache irgendwo einen Denkfehler ...

Vielen Dank im Voraus!

  1. Hallo,

    Ich dachte, man könnte es vielleicht mit "location.href" statt "location.pathname" lösen, aber das funktioniert nicht.

    Das ist eigentlich schon richtig. Allerdings bettest du hier eine URL in eine URL ein:

    http://example.org/url1?http://example.org/url2#anker

    Die Frage ist, zu welcher URL gehört der Anker, zur inneren oder zur äußeren?
    Die Antwort ist, »#anker« gehört zur äußeren und ist nicht Teil des Query-Strings der inneren. Beim Auslesen der eingebetteten URLs bekommst du wahrscheinlich »http://example.org/url2« zurück, also *ohne* den Anker.

    Eine Lösungsmöglichkeit ist, die eingebettete URL zu maskieren und beim Auslesen (d.h. beim Füllen des Frames) wieder zu demaskieren.

    Das geht z.B. mit encodeURIComponent (Maskieren) und http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#decode_uri_component@title=decodeURIComponent (Demaskieren). Beispiel:

    var s = 'http://example.org/url2#anker';  
    s = encodeURIComponent(s);
    

    ergibt "http%3A%2F%2Fexample.org%2Furl2%23anker"
    s = decodeURIComponent(s);
    ergibt wieder den Ausgangswert.

    In kodierter Form lässt sich die URL in die andere einbetten, ohne dass es Verwechslungen und Doppeldeutigkeiten gibt.

    Grüße,
    Mathias

    1. Hallo Mathias,

      ja, das war es wohl. Wusste doch, dass ich was übersehen habe.

      JS ist ja wie gesagt recht neu für mich, deswegen musste ich jetzt noch einige Zeit fummeln: Jetzt maskiert er die Adresse beim Auslesen auf der jeweiligen Seite und demaskiert sie dann, wenn es darum geht, sie im Frame zu laden.

      Erste Tests klappen jedenfalls gut.

      Vielen Dank!

  2. Leider habe ich noch ein Anschlussproblem. (Allmählich ärgere ich mich darüber, das Ganze nicht über z. B. Includes aufzuziehen, aber es ist nicht meine Entscheidung ...)

    Also:

    Hintergrund ist, dass es eigentlich zwei Framesets gibt, eins für deutsch, eins für englisch. (Nach der Auswahl auf der - framelosen - Startseite landet man ihm einen oder anderen.)

    Ich habe entsprechend mit verschiedenen Framenamen gearbeitet: "HauptFrame", "LinkerFrame", "KopfFrame" hier - "mainFrame", "leftFrame", "topFrame" dort.

    Soweit, so gut. Nun gibt es aber Seiten, die von beiden Framesets benutzt werden. Wenn diese also nun ohne eins der beiden Framesets aufgerufen werden, soll der englische Frame nachgeladen werden.

    Konkret: Bei der Prüfung, ob es ein Frame gibt, müssten beide, "HauptFrame" und "mainFrame" (als die relevanten) beachtet werden. Leider hakt es da bei mir, irgendwie will alles nicht funktionieren. Meine Lösung war jedenfalls, in die IF ein "oder" einzubauen:

    function checkFrameset() {  
      var Anhang = location.href  
      Anhang = encodeURIComponent(Anhang)  
      if(!parent.HauptFrame || !parent.mainFrame)  
       location.href="http://www.magic-tribal-hair.com/de_start.htm?" + Anhang;  
     }
    

    Das funktioniert aber nicht. Jedenfalls nicht so, wie es soll: Die Folge ist eine Kaskade von Frames.

    Stehe völlig auf dem Schlau, wie ich ihm das austreibe.

    Danke nochmal!

    1. @@trollkongen:

      nuqneH

      Hintergrund ist, dass es eigentlich zwei Framesets gibt, eins für deutsch, eins für englisch. (Nach der Auswahl auf der - framelosen - Startseite landet man ihm einen oder anderen.)

      Automatisch, hoffentlich?

      Soweit, so gut. Nun gibt es aber Seiten, die von beiden Framesets benutzt werden. Wenn diese also nun ohne eins der beiden Framesets aufgerufen werden, soll der englische Frame nachgeladen werden.

      Warum der englische und nicht der passende? Man kommt zwar mit JavaScript nicht an den Accept-Languge-Header ran, aber an das @lang-Attribut des html-Elements (was vorhanden* sein sollte).

      Oder auch den Frame generisch verlinken und Sprachvereinbarung für sich arbeiten lassen. Im Fall, dass der Nutzer selbst die Sprache wechselt, einen Cookie setzen und diesen entsprechend auswerten.

      Qapla'

      * Die aktualisierte Übersetzung ist endlich fertig und sollte in den nächsten Tagen auch auf der W3C-i18n-Website sein.

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)