Schaufensterproblem und eigenes Frameset - noscript?
Martin_K
- javascript
0 Cochrane0 Ingo Turski
0 Cybaer
Hallo zusammen,
ich muss zugeben, dass ich ein ziemlicher js-Anfänger bin...
Ich bemerkte vor kurzem, dass eine meiner Frameseiten in einem fremden Frame angezeigt wurde.
Nach langem stöbern und rumprobieren bin ich zu folgender Lösung gekommen, die auch mit Opera (zumindest 7.51) funktioniert:
-----
function checkHOME() {
var heim=false;
try { if (top.location.host.indexOf("domain.tld") >0) throw "zuhause"; }
catch (check) { if (check=="zuhause") { heim=true; if(top==self) location.href="index.htm"; return; } }
finally { if (heim==true) return; else top.location=self.location; }
}
-----
Was kann ich tun, wenn kein js angeschaltet ist? Gibt es nur die Möglichkeit innerhalb eines noscript-tags darauf hinzuweisen, dass die Seite evt in einem fremden Frame angezeigt wird? Oder gibt es noch eine andere Möglichkeit das Frameset zu überprüfen?
Bei der Gelegenheit möchte ich auch nach Tipps bezüglich des obigen Codes fragen: Fällt Euch irgendetwas umständliches oder stilistisch unsauberes auf? Vielleicht irgendetwas, von dem Ihr wisst, dass es in anderen Browsern nicht funktioniert?
Über Hinweise würde ich mich wirklich sehr freuen, da ich so etwas noch nicht erkennen kann.
Vielen Dank schonmal für Eure Antwort,
Gruß, Martin
Hallo auch,
erst mal herzlichen Glückwunsch, meine Seiten fand noch nie einer so interessant dass er sie klauen und in seinem Frame anzeigen wollte ;-). Nee, ernsthaft, Seitenklau durch Frames ist eine gemeine Sache, aber eine Lösung die ohne JavaScript funktioniert gibt es meines Wissens dafür nicht, außer den Betreiber der betreffenden Seite ansprechen.
Zu deinem Code:
function checkHOME() {
var heim=false;
try { if (top.location.host.indexOf("domain.tld") >0) throw "zuhause"; }catch (check) { if (check=="zuhause") { heim=true; if(top==self) location.href="index.htm"; return; } }
finally { if (heim==true) return; else top.location=self.location; }
}
Dass ist mit try und catch eigentlich sehr umständlich formuliert. Ich würde dass eher so schreiben:
function checkHOME()
{
if (top.location.host.indexOf("domain.tld") >0)
{
if (top == self)
location.href="index.htm";
}
else
{
top.location = self.location;
}
}
Wie die geschweiften Klammern sitzen ist Geschmacksfrage, aber diese Lösung kommt mit zwei statt vier if-Abfragen, keiner Zwischenvariablen und ohne try, catch und finally (die für so etwas hier sowieso nicht gedacht sind, sondernd für Fehlerbehandlung) aus.
Aber ich habe mir dass jetzt nur so schnell mal ausgedacht, ich habe das nicht getestet, auf keinem Browser und ich kann da für nichts garantieren. Die Lösung, die du da jetzt hast, könnte aber mit älteren Browsern (Netscape/Internet Explorer 4.x und früher) nicht funktionieren, da diese noch keine Fehlerbehandlung mit try und catch kennen.
Ich hoffe, ich konnte trotzdem helfen
Mfg
Cochrane
Hi,
Aber ich habe mir dass jetzt nur so schnell mal ausgedacht, ich habe das nicht getestet, auf keinem Browser und ich kann da für nichts garantieren.
sehr clever. ;-)
Das dürfte nämlich schon deshalb nicht funktionieren, weil ein Zugriff über Domaingrenzen hinweg verboten ist und zu einem Fehler führt.
freundliche Grüße
Ingo
Hallo,
Das dürfte nämlich schon deshalb nicht funktionieren, weil ein Zugriff über Domaingrenzen hinweg verboten ist und zu einem Fehler führt.
Ach, stimmt, da war doch vor kurzem was mit einem Exploit der auch über fremde Frames führte, wofür es jetzt überall Patches gibt. Tut mir leid, dass ich hier so einen Schrott verzapfe ;-)
Mit freundlichen Grüßen
Cochrane
Hi Leute,
Das dürfte nämlich schon deshalb nicht funktionieren, weil ein Zugriff über Domaingrenzen hinweg verboten ist und zu einem Fehler führt.
genau das war das Problem mit dem Skript: ich durfte die Domain nicht checken.
Dann konnte ich in Opera die Fehlermeldung nicht mit "window.onerror" abfangen.
Leider hab ich nur diese wirklich umständliche Lösung gefunden.
Nuja, immerhin funktioniert sie bei mir... Aber, ob's noch schicker geht, weiß ich nicht...
Viele Grüße, Martin
Hi,
auf meiner Seite zum Frameset nachladen frage ich
if (top.frames[0].name != "LinkFrame"
ab. Dies führt bei einem fremden Frameset natürlich zu einem Zugriffsfehler, der aber über onerror abgefangen werden sollte.
freundliche Grüße
Ingo
Hi,
Was kann ich tun, wenn kein js angeschaltet ist?
Zu jedem Link ein target="_top" hinzufügen oder einfach auf jeder Seite ein <base target="_top"> im HEAD.
Gruß, Cybaer