Wie erkennt man, ob ein Iframe erreichbar ist, ohne einen Fehler auszulösen?

8

Grundsätzlich habe ich einen Iframe geladen, auf den vom Elternteil zugegriffen wird, wenn er das Onload-Ereignis auslöst. Es funktioniert gut, aber ich bekomme Fehler, wenn der Inhalt des Iframe nicht mehr auf der gleichen Domäne ist, was zu erwarten ist.

Einzige Sache ist, ich möchte diese Fehler unterdrücken. Leider versucht try / catch diese Ausnahme nicht, und der Versuch, auf eine dieser Eigenschaften zuzugreifen, um sie zu validieren, führt erneut zu demselben Fehler und vereitelt den Zweck.

Gibt es eine zuverlässige Möglichkeit für mich, einfach zu überprüfen, ob der Iframe-Inhalt zugänglich ist, ohne Fehlermeldungen zu erzeugen?

Danke

Bearbeiten:

Aus Gründen des Kontextes und damit, dass Leute nicht mit irrelevanten Kommentaren antworten; Ich schreibe ein kleines Skript, das die Größe des iframe auf der übergeordneten Seite basierend auf der Höhe des iframes-Dokuments automatisch ändert. Wenn ein Benutzer auf einen Link im Iframe außerhalb der Domain klickt, kann ich die Höhe der Seite natürlich nicht erkennen, aber ich möchte lieber keine Fehler in der Konsole auslösen und stattdessen die Exception ordnungsgemäß behandeln.

Ich bin mir bewusst, dass es Problemumgehungen gibt, ich versuche einfach, mich selbst zu erziehen, indem ich herausfinde, ob es einen anmutigen Weg gibt, mit solchen Fällen umzugehen, anstatt nur auf einen hässlichen Workaround zurückzugreifen.

    
Naatan 18.01.2012, 21:31
quelle

7 Antworten

5

Wenn Sie allen Seiten Ihrer Domain, die Sie im iframe laden möchten, ein wenig JavaScript hinzufügen, können Sie window.postMessage , das von der gleichen Ursprungsrichtlinie ausgenommen ist. Wahrscheinlich wäre der einfachste Weg, wenn das untergeordnete Fenster eine Nachricht an das übergeordnete Element sendet, wenn es geladen und statt onload verwendet wird. Beispielsweise könnten Sie dies jeder Seite hinzufügen:

%Vor%

Damit wird eine Nachricht an das übergeordnete Fenster gesendet, wenn die Seite in einen Frame mit demselben Ursprung geladen wird. Sie würden dann so darauf hören:

%Vor%

Beachten Sie, dass die Beispiele die W3C / Netscape-Ereignis-API verwenden und daher in Internet Explorer vor Version 9 nicht funktionieren.

    
Sam Hanes 26.01.2012, 00:03
quelle
1

Versuchen Sie Folgendes:

%Vor%

BEARBEITEN: fügen Sie einen Versuch hinzu und fangen Sie, kein Fehler wird false zurückgeben.

    
Ady Ngom 28.01.2012 02:36
quelle
0

Sie können die aktuelle URL von iframe mit window.frames['frame_name'].contentWindow.location.href erhalten.

Wenn der Benutzer von Ihrer Domain weg navigiert hat, gibt es keine Möglichkeit, dies zu tun. Entschuldigung ...

Weitere Informationen hier .

    
Jivings 18.01.2012 21:37
quelle
0

Können Sie nicht auf das Attribut src vom übergeordneten Element zugreifen?

Wie ich es verstehe, gehört das Element iframe zur Seite 'parent', während das Objekt window , das mit dem iframe enthalten ist, zur Seite 'child' gehört.

Das funktioniert für mich:

%Vor%     
Tim 23.01.2012 14:44
quelle
0

Ok, das ist Overkill, nicht viel, aber ein Hack und vielleicht nicht möglich in deiner Situation, aber trotzdem:

Sie könnten eine JavaScript-Einfügung auf allen Seiten Ihrer Website hinzufügen, die versucht, auf den Opener (den übergeordneten Frame) zuzugreifen, und eine Markierung (eine Variable wie bool stillOnMySite) auf true setzen.

Dann

  1. Zeitbasiert: Das Skript in Ihren Webseiten setzt das Flag jede Sekunde auf "true", das Skript in Ihrem Eltern-iframe setzt die Flagge jede Sekunde auf "false". Poll den iframe in einem setTimeOut (xxx, 1). Wenn das Flag nicht mehr wahr ist, dann hat der Benutzer Ihre Site verlassen und Sie sollten den IFrame nicht abfragen, wenn das Flag wahr ist, der Benutzer sich immer noch auf Ihrer Website befindet, können Sie den IFRAME abfragen.

  2. Klickbasiert: Mit jquery für unauffälliges JavaScript überwacht das Skript auf Ihren Webseiten clickevents in allen Links auf der Seite. Wenn sich ein Link außerhalb Ihrer Domain befindet, setzt dies das Flag im übergeordneten iframe auf false.

Natürlich zerfällt diese ganze Theorie in Stücke, wenn Sie kein Skript in Ihre Webseiten einfügen können.

Alternativ dachte ich nur: Wenn Ihr iframe immer auf Ihrer Website startet, müssen Sie Ihre Webseiten-Seiten nicht ändern, sondern injizieren Sie einfach die n ° 2-Lösung aus dem übergeordneten iframe in die iframed-Seite.

    
Yahel 24.01.2012 16:50
quelle
0

Können Sie mir sagen, wie Sie den iframe src setzen? Wenn Sie JavaScript verwenden, um es dynamisch zu ändern, ist Ihr Problem einfach zu handhaben.

%Vor%

Aber ich glaube nicht, dass es ein guter Weg ist, dies zu lösen.
hoffe, dass jemand eine bessere Lösung finden könnte.

    
simon xu 27.01.2012 14:19
quelle
0

Wie wäre es, wenn IFRAME überhaupt nicht (innerhalb der Elternseite) gerendert wird, wenn seine href nicht auf dasselbe Protokoll und denselben Host verweist wie die übergeordnete Seite? Ich verstehe möglicherweise Dinge, die damit zusammenhängen, ob Sie beide Seiten besitzen oder nur eine (und welche). Aber wenn Sie die Parent-Page-Site besitzen, sollten Sie dies tun können, sei es auf dem Server (bevor IFRAME sogar enthalten ist) oder irgendwann auf dem Client (page-load / doc-load).

>     
user191966 27.01.2012 21:42
quelle