Frames ohne Nachteile!?
Markus Franzen
Hallo zusammen!
Ich habe folgendes Problem:
Meine Homepage besteht aus zwei Frames. Links die Navigationsleiste, recht der eigentliche Inhalt.
Da ich meine Seite bei verschiedenen Suchmaschinen angemeldet habe, sind auch alle Einzelseiten indiziert worden (habe es eine zeitlang mit "Noindex" versucht, wurde aber auch nicht von allen Suchmaschinen befolgt).
Bis jetzt habe ich immer auf jede Seite ganz unten den Vermerk "Fehlt die Navigationsleiste? Bitte hier klicken!" gemacht, der die entsprechende Frameaufteilung öffnete.
In der Zeitschrift "Internet World 9/98" steht jetzt allerdings ein interessanter Artikel. Dort wird beschrieben, wie man mit Hilfe von Javascript überprüfen kann, ob die aufgerufene Unterseite im Frameset aufgerufen worden ist. Ist die nicht der Fall, öffnet sich automatisch der fehlende Rahmen.
Leider ist (für mich) nicht verständlich, wie ich das Script in meine Seiten einbaue, bzw. steht dort etwas von einer externen Javascript-Datei.
Also ganz konkret:
1. Wie muss ich das Script umformen, damit es auch bei meiner Homepage funktioniert?
2. Wie kann ich dann das Script in einer externen Datei ablegen, so dass alle Unterseite auf diese Datei zugreifen können?
Hier noch ein paar Angaben:
Meine Homepage besteht wie oben erwähnt aus zwei Frames. Die Startseite sieht so aus:
<frameset cols=19%,* border=0 frameborder=0 framespacing=0>
<frame src="links.htm" name="Inforahmen" scrolling=no>
<frame src="start.htm" name="Homepage von Markus Franzen">
</frameset>
In dem Artikel stand bezüglich der externen JS-Datei:
Ab JavaScript 1.1 kann es auch in einer externen Script-Datei via <script language="JavaScript" src="framing.js"> eingebunden werden.
An welcher Stelle müsste ich denn diesen Befehl in meinen Unterseiten einbauen, und wie erstelle ich die datei "framing.js"? Mit einem einfachen Editor und dann einfach die Endung umbenennen?
Über eine Antwort wäre ich euch dankbar, weil das Problem (denke ich) auch viele andere betrifft.
Markus
Hier jetzt das Listing:
<html>
<head>
<title>Eine Unterseite</title>
<script language="JavaScript">
<!--
function is_msie() {
return (navigator.appName == "Microsoft Internet Explorer");
}
function Framing()
{
if (this.document == top.document ||
top.location.host != this.location.host) {
var pathprefix = location.protocol + '//'
+ location.host
+ location.pathname.substring(0,
location.pathname.lastIndexOf('/')+1);
var doctitle = document.title;
document.clear();
document.open("text/html");
document.writeln('<html>\n<head><title>' +doctitle+
'</title></head>');
document.writeln('<frameset cols="90,*">'+
'<frame src="'+pathprefix+'buttons.htm" name=buttons>'+
'<frame src="'+top.location.href+'" name=content>'+
'</frameset></html>');
document.close();
return true;
}
return false;
}
function msieFraming() {
if (is_msie()) {
if (Framing()) {
window.setTimeout('top.frames["content"].location.href = '+
'"'+top.location.href+'";',10);
}
}
}
function netscFraming() {
if (!is_msie()) Framing();
}
msieFraming();
// -->
</script>
</head>
<body onLoad="netscFraming()">
<h2>Unterseite</h2>
Dies ist der Inhalt des Content-Frames.
</body>
</html>
Auf den javaScript habe ich leider auch keine Antwort ich kann dir nur einen Tip geben, der wird dass es alle Suchmaschinen verstehen welche Seite sie anzeigen sollen/müssen.
Suchmaschinen surfen auf eine Seite hin und suchen als erstes ein Dokument namens "robots.txt". Dieses musst du anlegen, und angenommen du hast jetzt folgende HTML Seiten:
nav.html = Die Navigationsseite
content.html = der eigentliche inhalt
index.html = Die Seite die die Frames aufruft
Nun kannst du der Suchmaschine es verbieten nav.html oder content.html aufzurufen, sondern nur Index.html
Also startest du unter eine DOSE Start|Programme|Zubehör|Editor
Jetzt gibst du in das Dokument ein:
#Start Robots.TXT
User-agent: *
Disallow: nav.html
Disallow: content.html
#End Robots.TXT
Das speicherst du jetzt in das Binäre Verzeichniss deiner Seite und die 3 Standardseiten auch.
So, fertig!
CU
Pierre :-)
Hallo,
Das speicherst du jetzt in das Binäre Verzeichniss deiner Seite und die 3 Standardseiten auch.
So, fertig!
Mit binaerem Verzeichnis meinst Du wahrscheinlich das Root-Verzeichnis. Robots.txt funktioniert nur an dieser Stelle und ist in erster Linie dazu gedacht, Verzeichnisse fuer Robots zu sperren. Fuer das Frames Problem ist dies daher eine wenig geeignete Methode.
Vor allem bei einem grossen Projekt ware die Robots.txt riesig. Das Problem dirkt verlinkter Seiten waere damit dann auch nicht geloest.
JS oder besagter Link aufs Frameset sind IMHO eine umfassender Loesung des Problems.
Gruss, Stefan
hi!
In dem Artikel stand bezüglich der externen JS-Datei:
Ab JavaScript 1.1 kann es auch in einer externen Script-Datei via <script language="JavaScript" src="framing.js"> eingebunden werden.
An welcher Stelle müsste ich denn diesen Befehl in meinen Unterseiten einbauen,
Zwischen <head> und </head>, wie jeden JavaScript.
»»und wie erstelle ich die datei "framing.js"? Mit einem einfachen Editor und dann einfach die Endung umbenennen?
Ja.
bye, Frank!
Hallo Markus,
Leider ist (für mich) nicht verständlich, wie ich das Script in meine Seiten einbaue, bzw. steht dort etwas von einer externen Javascript-Datei.
Uff, das zitierte Script ist mir jetzt zu kompliziert, deswegen poste ich einfach noch mal das, was ich vor kurzem schon mal gepostet habe, angepasst auf Deine Situation:
<SCRIPT LANGUAGE="JavaScript">
<!--
if(parent.frames.length == 0)
{
document.close();
document.open();
document.write("<HTML><HEAD><TITLE>Titel</TITLE></HEAD>");
document.write("<frameset cols=19%,* border=0 frameborder=0 framespacing=0>");
document.write("<frame src="links.htm" name="Inforahmen" scrolling=no>");
document.write("<frame src="diesedatei.htm" name="\Homepage von Markus Franzen">");
document.write("</FRAMESET></HTML>");
}
//-->
</SCRIPT>
Das kannst Du einfach zwischen <HEAD> und </HEAD> in jeder Datei notieren, die im Informations-Frame angezeigt wird. Fuer diesedatei.htm setzt Du einfach den Namen der aktuellen Datei ein.
Viele Gruesse
Stefan Muenz
Hallo Markus,
»»
Hallo Leute!
<SCRIPT LANGUAGE="JavaScript">
<!--
if(parent.frames.length == 0)
{
document.close();
document.open();
document.write("<HTML><HEAD><TITLE>Titel</TITLE></HEAD>");
document.write("<frameset cols=19%,* border=0 frameborder=0 framespacing=0>");
document.write("<frame src="links.htm" name="Inforahmen" scrolling=no>");
document.write("<frame src="diesedatei.htm" name="\Homepage von Markus Franzen">");
document.write("</FRAMESET></HTML>");
}
//-->
</SCRIPT>
Wieso macht ihr das alle umstaendlich? Hier meine
Idee:
<script language="JavaScript">
<!--
if(top.location.href == this.document.location.href)
{top.location.href = 'index.html';}
//-->
</script>
Wobei index.html das Frameset und JS-Spielereien
wie
if(top.frames.length > 0)
top.location.href=self.location;
enthaelt.
Gruß
André
Wieso macht ihr das alle umstaendlich?, Hier meine
Idee:
<script language="JavaScript">
<!--
if(top.location.href == this.document.location.href)
{top.location.href = 'index.html';}
//-->
</script>
Das ist aber erstens was anderes, laedt naemlich nur einfach ein Frameset,
nicht gleich die gewuenschte Datei in einen der Frames,
und zweitens hat es eine Haken.
Auf Eigenschaft href kann man nicht unter allen Umstaenden ungestraft
zugreifen. Wenn top von einer anderen Domain kommt, also jemand so "nett"
war, Deine Seite irgendwo in einem fremden Frameset unterzubringen, gibts eine
unschoene Meldung.
Christine
Hallo,
Bis jetzt habe ich immer auf jede Seite ganz unten den Vermerk "Fehlt die Navigationsleiste? Bitte hier klicken!" gemacht, der die entsprechende Frameaufteilung öffnete.
Das halte ich persoenlich immer noch fuer besser als alle JS-Konstruktionen, ist aber nur meine Ansicht dazu.
Also:
- Wie muss ich das Script umformen, damit es auch bei meiner Homepage funktioniert?
Wenn ich das jetzt so beim Ueberfliegen richtig sehe, dann ist da nicht viel umzuformen, das _ist_ die fertige Seite.
Fuer "Dies ist der Inhalt des Content-Frames." setzt Du nur Deinen kompletten Seitenihnalt ein, also alles, was zwischen <BODY> und </BODY> steht.
Na ja, und als linken Frame musst Du natuerlich statt buttons.htm Deinen eigene Datei und Deine Frame-Breite angeben..
- Wie kann ich dann das Script in einer externen Datei ablegen, so dass alle Unterseite auf diese Datei zugreifen können?
Das ist Dir ueberlassen.
Pack nur die Fuktionen rein (wuerde ich machen) oder das gesamte Script
Zugriff so:
<SCRIPT LANGUAGE="JavaScript1.1" SRC="mein_Script.js"></SCRIPT>
Christine
Hallo zusammen!
Erstmal vielen Dank an Christine, Stefan, Frank und Pierre für die schnellen Antworten!!
Ich habe mal das JS von Stefan abgeschrieben und in eine Seite von mir eingebunden.
Und zwar genauso wie beschrieben. Zwischen <HEAD> und </HEAD>.
Wenn ich jetzt diese Seite aufrufe, wird aber leider nur der Navigationsrahmen (also der linke Rahmen) geladen.
Die eigentliche Datei wird nun nicht mehr angezeigt, sondern der rechte Rahmen bleibt leer. 8-(
Mach ich was falsch, oder liegt es am Listing?
Markus
P.S. Da wäre noch eine Frage zu Christines Antwort / an Christine:
1. Was meinst du mit "Pack nur die Funktionen rein..."? und
2. Verstehe ich das richtig, das man nicht EINE Universal-JS-Datei ablegen kann, auf die dann alle Unterseiten gemeinsam zugreifen können, sondern dass man jede externe JS-Datei speziell für die einzelnen Unterseiten anpassen muss? Was für einen Sinn hat es denn dann, das Script in eine externe Datei zu packen??
Hallo!
Wenn ich jetzt diese Seite aufrufe, wird aber leider nur der Navigationsrahmen (also der linke Rahmen) geladen.
Die eigentliche Datei wird nun nicht mehr angezeigt, sondern der rechte Rahmen bleibt leer. 8-(
Das Problem tritt bei mir auch auf. 2 Frames mit den Navigationsleisten werden korrekt geladen, nur der 3. Frame mit der ursprünglichen Seite bleibt leer. Ich konnte folgendes herausfinden:
Lokal auf Festplatte genügt beim IE der Dateiname z.B. xyz.htm damit es funktioniert. Beim Navigator muß der komplette Pfad angegeben werden z.B. file:///..../xyz.htm
Im Netz funktionierts bei beiden Browsern nicht, der 3. Frame bleibt leer. Auch wenn man die volle URL http://..../xyz.htm angibt. In der Statuszeile beim IE sieht man aber, daß die Bilder der Seite geladen werden. Seltsam!?
Christine Kuehnel hat vielleicht doch nicht so unrecht ;-)
Grüße, Harald
Christine Kuehnel hat vielleicht doch nicht so unrecht ;-)
Freut mich zwar, wenn ich recht habe ;-)
aber womit eigentlich?
Christine
Christine Kuehnel hat vielleicht doch nicht so unrecht ;-)
Freut mich zwar, wenn ich recht habe ;-)
aber womit eigentlich?
Mit der Ansicht, daß ein Verweis zum Frameset am Ende einer Seite besser ist als eine JavaScript-Konstuktion um das Frameset zu laden.
Hier nochmals die Passage auf ich mich bezog. Hätte ich wohl vorher schon machen sollen. Sorry! :-)
Bis jetzt habe ich immer auf jede Seite ganz unten den Vermerk "Fehlt die Navigationsleiste? Bitte hier klicken!" gemacht, der die entsprechende Frameaufteilung öffnete.
Das halte ich persoenlich immer noch fuer besser als alle JS-Konstruktionen, ist aber nur meine Ansicht dazu.
Grüße, Harald
Hallo Markus,
Wenn ich jetzt diese Seite aufrufe, wird aber leider nur der Navigationsrahmen (also der linke Rahmen) geladen.
Hmm, ich habe es mit einem eigenen Projekt, das aus zwei Frames besteht, einfach mal ganz naiv ausprobiert, allerdings nur mit MS IE 4, und da funktionierte alles einwandfrei. War wahrscheinlich ein wenig vorschnell <g>.
Viele Gruesse
Stefan Muenz
Hi!
Womit wir wieder beim Thema "Unverträglichkeiten der verschiedenen Browser" wären... ;-)
Trotzdem danke für eure Bemühungen.
Wenn noch jemand eine Lösung hat/bekommt/liest/... wäre ich dankbar.
Ansonsten wäre es nett, wenn mir noch jemand die beiden Fragen beantworten könnte, die ich zuletzt geschrieben habe.
Hier nochmal zur Erinnerung:
1. Was meinst du mit "Pack nur die Funktionen rein..."? (siehe Christines Antwort 23.8, 21:13) und
2. Verstehe ich das richtig, das man nicht EINE Universal-JS-Datei ablegen kann, auf die dann alle Unterseiten gemeinsam zugreifen können, sondern dass man jede externe JS-Datei speziell für die einzelnen Unterseiten anpassen muss? Was für einen Sinn hat es denn dann, das Script in eine externe Datei zu packen??
Vielen Dank und macht‚s gut!
Markus
Womit wir wieder beim Thema "Unverträglichkeiten der verschiedenen Browser" wären... ;-)
Hm, so ganz sicher bin ich da noch nicht.
Das Script von Stefan sollte eigentlich komplett funktionieren.
Das mit dem zweiten bzw. dritten Frame, der nicht geladen wird, begreife ich noch nicht so recht.
Habt Ihr mal im Source nachgesehen (nur bei Navi4 mgl.)?
Da muesste sowas gleich oben stehen:
<BASE HREF="das_Verzeichnis_in_dem_die_Datei_steht">
Und dann duerfte es keine Rolle spielen, ob nun relative oder komplette URL-Angabe.
Ich habe mal geguckt, was das urspruenglche Script, was Markus angegeben hat, eigentlich anders macht.
Da sind nur ein document.clear, was eigentlich nichts machen duerfte, der Zusammenbau des kompletten URLs und die Tatsache, dass fuer Netscape erst BODY onload das Script ausgefuehrt wird. Mehr kann ich erst mal nicht erkennen.
Wenn noch jemand eine Lösung hat/bekommt/liest/... wäre ich dankbar.
Na ja, das Script aus der Zeitschrift tuts ja wohl.
Willst Du noch eine Variante?
Guck mal hier: http:///screenExa.net/js_notiz/tips/frame_set.htm
Das ist so aehnlich. Hier sind es lediglich Links zu einer Frameset-Datei, die ausgefuehrt werden, um dann passende Dateien in einen Frame zu laden. Da fehlt zwar der Automatismus, aber den kann man einbauen, eben nicht per HTML-Link sondern ueber JavaScript aufrufen.
Vielleicht etwas langwieriger beim Laden, weil zuerst die Standarddatei in den Frame geladen wird, dafuer aber universeller einsetzbar (Browser ohne bzw. mit abgeschaltetem JS bleiben nicht vollstaendig aussen vor).
Noch eine?
http://www.informatik.uni-dortmund.de/~sm/aw/js/faq//fenster/framecheck.html
Das ist die Antwort aus der FAQ von de.comp.lang.javascript auf die Frage
"Wie lade ich das Frameset zu einer bestimmten Datei nach?"
Laeuft uebrigens nach einem aehnlichen Prinzip, wie das, was ich benutzt habe.
Ansonsten wäre es nett, wenn mir noch jemand die beiden Fragen beantworten könnte, die ich zuletzt geschrieben habe.
Die Antworten sollst Du nun auch noch haben,
wenn auch
"> Hier nochmal zur Erinnerung:"
sicher nicht notwendig war. Ich lese das, was Du nachts halb eins und morgens kurz vor zehn schreibst, alles zusammen erst abends. Andere womoeglich auch :-)
- Was meinst du mit "Pack nur die Funktionen rein..."? (siehe Christines Antwort 23.8, 21:13) und
In so eine externe Datei kannst Du das gesamte Script reinschreiben, aber auch nur Teile.
Ich wuerde nur die Funktionen dort unterbringen, also
function is_msie()
{
// ...
}
function Framing()
{
// ...
}
function msieFraming()
{
// ...
}
function netscFraming()
{
// ...
}
Die anderen Script-Teile jeweils direkt in die einzelnen Dateien schreiben, das hier:
<script language="JavaScript">
<!--
msieFraming();
// -->
</script>
Sowieso in jeder Datei muss stehen:
<body onLoad="netscFraming()">
Warum ich gern nur Funktionen in externen Dateien unterbringe?
Das Ladeverhalten der Browser kann man vorher nicht 100%ig kennen, also den Zeitpunkt, zu dem die externen Dateien geladen werden. Deswegen schreibe ich Scriptbloecke, deren Ausfuehrungszeitpunkt mir wichtig ist, direkt in die Datei.
- Verstehe ich das richtig, das man nicht EINE Universal-JS-Datei ablegen kann, auf die dann alle Unterseiten gemeinsam zugreifen können, sondern dass man jede externe JS-Datei speziell für die einzelnen Unterseiten anpassen muss?
War das so rauszulesen?
Nein, natuerlich nicht. Der Sinn liegt gerade darin, nur eine externe Datei zu haben, die man immer wieder aus ganz unterschiedlichen Ecken aufrufen kann.
Noch'n Link?
"Wie kann ich Funktionen mehrfach verwenden?": <:http://www.informatik.uni-dortmund.de/~sm/aw/js/faq/jslib/fktlib.html>
Zu beachten naemlich der Hinweis, der dort gegeben wird bzgl. MIME-Type. Wird inzwischen gern vergessen, weil's nur bei Navi3 noch auffaellt.
So, Roman beendet :-)
Christine
Verflixt, diese langen URL's, und dann merkt man erst nach dem Abschicken, dass die nicht stimmen :-(
Hier nochmal alle drei:
http://screenExa.net/js_notiz/tips/frame_set.htm
http://irb-www.informatik.uni-dortmund.de/~sm/aw/js/faq/fenster/framecheck.html
http://irb-www.informatik.uni-dortmund.de/~sm/aw/js/faq/jslib/fktlib.html
Christine
Hi Christine!
Vielen, vielen Dank für die sehr ausführliche Antwort!!
Da muss ich mich jetzt erstmal durchkämpfen... ;-)
Ich hoffe, ich werde es jetzt zufriedenstellend lösen können...
Markus
Hallo!
Ich habe einige Testseiten ins Netz gestellt, damit man das Problem auch sieht.
Zuerst der Code von test.htm:
----------
<html>
<head>
<base href="http://privat.schlund.de/hgabler/wcn/">
<title>test.htm</title>
<script language="javascript">
<!--
if(parent.frames.length == 0)
{
document.close();
document.open();
document.write("<html><head><title>WebCam-Navigator</title></head>");
document.write("<frameset cols="170,*" border=0 frameborder=0 framespacing=0>");
document.write("<frameset rows="220,*" border=0 frameborder=0 framespacing=0>");
document.write("<frame src="logo.htm" name="wcnlogo" marginwidth=0 marginheight=5 noresize scrolling=no>");
document.write("<frame src="content.htm" name="wcncontent" marginwidth=0 marginheight=0 noresize>");
document.write("</frameset>");
document.write("<frame src="test.htm" name="wcndisplay" noresize>");
document.write("</frameset></html>");
}
//-->
</script>
</head>
<body bgcolor=#F0E0C0 text=#000000>
<center>
<b>test.htm</b>
</center>
</body>
</html>
----------
test.htm soll ein Frameset aufrufen mit logo.htm, content.htm und sich selbst im 3. Frame. Bei mir bleibt das 3. Frame (das große rechts) aber weiß.
Siehe: http://privat.schlund.de/hgabler/wcn/test.htm
Wenn man aber im 3. Frame eine andere Datei aufruft funktioniert es. Nur ist es eben sinnlos.
Siehe: http://privat.schlund.de/hgabler/wcn/test2.htm
test2.htm ruft hier ein Frameset mit logo.htm, content.htm und test3.htm auf
Ich hoffe, die Testseiten helfen weiter.
Grüße, Harald
PS: Ich hatte das schon mal geschickt, nur ist es im Forum nicht erschienen. Also bitte nicht auszucken wenns jetzt doppelt ist :-)
Ich habe einige Testseiten ins Netz gestellt, damit man das Problem auch sieht.
Zuerst der Code von test.htm:
usw.
Schon kurios, scheint tatsaechlich damit zusammenzuhaengen, dass die Datei selbst geladen werden soll. Woran das liegen mag? Keine Ahnung. Jemand 'ne Idee?
Harald, wenn Du schon am Testen bist, dann probier doch mal, nur diese eine Datei nicht durch direkte Angabe ihres Namens in das Frameset einzubauen.
Die andere Loesung, die hier diskutiert wurde, tut das auch nicht, und die klappt wohl.
Wussten die Autoren von diesem Effekt oder haben sie nur die Funktion allgemein nutzbar gemacht, indem sie schreiben:
<frame src="'+top.location.href+'" name=content>'+ ...
???
Wenn's das ist, dann sollte Deine/Stefans Version klappen, wenn man
statt
document.write("<frame src="test.htm" name="wcndisplay" noresize>");
schreibt:
document.write("<frame src=" + self.location.href + "name="wcndisplay" noresize>");
oder
document.write("<frame src=" + top.location.href + "name="wcndisplay" noresize>");
oder auch eine Variable am Anfang definiert
var ich = self.location.href;
und dann weiter unten dann
document.write("<frame src=" + ich + "name="wcndisplay" noresize>");
Christine
Hallo!
Harald, wenn Du schon am Testen bist, dann probier doch mal, nur diese eine Datei nicht durch direkte Angabe ihres Namens in das Frameset einzubauen.
Die andere Loesung, die hier diskutiert wurde, tut das auch nicht, und die klappt wohl.
Wussten die Autoren von diesem Effekt oder haben sie nur die Funktion allgemein nutzbar gemacht, indem sie schreiben:
<frame src="'+top.location.href+'" name=content>'+ ...
???Wenn's das ist, dann sollte Deine/Stefans Version klappen, wenn man
statt
document.write("<frame src="test.htm" name="wcndisplay" noresize>");
schreibt:
document.write("<frame src=" + self.location.href + "name="wcndisplay" noresize>");
oder
document.write("<frame src=" + top.location.href + "name="wcndisplay" noresize>");
oder auch eine Variable am Anfang definiert
var ich = self.location.href;
und dann weiter unten dann
document.write("<frame src=" + ich + "name="wcndisplay" noresize>");
Leider ist das Ergebnis unverändert. Ich werde mal die andere Lösung ausprobieren. Und noch vielen Dank für die Mühe.
Grüße, Harald