2012-03-27 15 views
5

Javascript:isInIframe Erkennung in Javascript

inFrame = true; 
try { 
    if(window.top == self) { 
     inFrame = false; 
    } 
} catch (err){} 

try { 
    if(window.parent.location == self.location){ 
     inFrame = false;  
    } 
} catch (err){} 

Dies ist ein Stück Javascript-Code, den ich verwende, um festzustellen, ob meine Bibliothek in einem Iframe ist. 1 von 100% der Anfragen meldet, dass sich meine Bibliothek in einem Iframe befindet, was meiner Meinung nach nicht möglich ist.

Besteht die Möglichkeit, dass dieser Code fehlschlägt [true auf false oder umgekehrt]?

Von Zugriffsprotokoll [log ich alle solche iframe Anfragen]

  1. Ich fand, dass es in allen modernen Browsern geschieht [dh 6-9, Chrom, ff, Safari] von String-User-Agent.
  2. Ich konnte aus Referrer keinen Sinn machen, weil sie die gleiche wie meine Publisher-Site sind.
  3. In einigen Fällen habe ich für den gleichen Referrer gefunden, die gleiche URL angefordert & gleichen Client ip meine Bibliothek war einmal in einem iframe & nicht in anderen. Das ließ mich an dem obigen Code zweifeln.

Wird es einen Unterschied, während window oder document wird in den Eigenschaften geladen [self, location, top, parent] ich überprüfen? Weil mein Skript synchron geladen und ausgeführt wird, meistens bevor das Dokument fertig ist oder das Fenster vollständig geladen ist und der Iniframe-Test weiterläuft.

Antwort

0

Sie kennen die meisten modernen Browser Sie „Ansicht Frame“ rechts erlauben? Sehen Sie sich den Bildinhalt ohne das übergeordnete Element an. Das ist eine völlig plausible Antwort für 3. (Ich mache es die ganze Zeit).

Eine plausible Ursache von 1 und 2 ist, dass self nicht wirklich in Javascript definiert ist daher nicht immer gleich window sein kann. Sie sollten daher überprüfen window oder besser noch window.self nicht self wie Özgür schlägt.

+0

Ich werde mit Fenster versuchen und den Status aktualisieren – Tamil

1

das ist, wie ich das bekommen, ist in Folge Rahmen und es funktioniert für mich inFrame = window.top != window

0

Wenn alles, was Sie zu tun versuchen ist festzustellen, wenn der Code in einem Rahmen jeglicher Art ist, alles, was Sie benötigen, ist dieses:

if (window.top !== window) { 
    // you are embedded in a frame 
} 

oder Ihre Variable inFrame wie folgt festgelegt:

inFrame = (window.top !== window); 

oder in Funktionsform:

function isInFrame() { 
    return (window.top !== window); 
} 

Solange Sie keine Eigenschaften auf die zugreifen window.top Objekt sollten Sie keine Ausnahme-Handler zum Schutz vor domänenübergreifenden Eltern benötigen. In einer Situation mit Ursprungsherkunft können Sie auf window.top zugreifen, aber Sie können nicht auf Eigenschaften wie window.top.location.href zugreifen.

Was Ihre andere Fragen:

Gibt es eine Möglichkeit, dass dieser Code [Bericht wahr auf falsche oder umgekehrt] zum Scheitern verurteilt?

Der erste Teil Ihres Codes sieht OK aus, obwohl der Ausnahmebehandler nicht erforderlich ist. Der zweite Teil Ihres Codes löst in modernen Browsern jedes Mal eine Ausnahme aus, wenn das Fenster und der Elternrahmen unterschiedliche Ursprünge haben.

Wird es ein Unterschied beim Fenster oder Dokument in den Eigenschaften geladen [self, Lage, top, parent] Ich verwende überprüfen? Weil mein Skript synchron geladen und ausgeführt wird, meistens bevor das Dokument fertig ist oder das Fenster vollständig geladen ist und der Iniframe-Test weiterläuft.

An dem Punkt, an dem Ihr Fenster geladen wird, ist es sicher, diese Überprüfung durchzuführen. Sowohl window als auch window.top sind zu diesem Zeitpunkt gültig, auch wenn keiner der beiden den Ladevorgang abgeschlossen hat. Es sollte also keine Probleme mit der inFrame-Erkennung geben, die Sie warten müssen, bis alles vollständig geladen ist.