2015-12-03 5 views
8

Ich habe einige Probleme beim Aufruf einer Funktion eines bestimmten iframe nach dem erneuten Laden eines anderen iframe. Es funktioniert auf allen gängigen Browsern, verhält sich aber auf Microsoft Edge etwas seltsam. Sie benötigen die folgende Konstellation, um den Fehler zu erhalten. Alle Dateien befinden sich im selben Verzeichnis auf demselben Server. Ich habe keine Inhaltssicherheitsrichtlinie festgelegt.Warum bekomme ich "Berechtigung verweigert" in Microsoft Edge beim Zugriff auf Eltern iframe

Wenn Sie die Frame1.html laden, wird alles in Ordnung sein und Sie erhalten die "Alarm" -Meldung.

Wenn Sie jedoch auf das a-Tag "Click me" auf frame4.html klicken, wird frame2.html neu geladen und Sie erhalten den Fehler "permission denied", weil das übergeordnete Objekt (var tmpParent = parent;) nicht zugänglich ist. Wenn Sie erneut auf das a-Tag klicken, funktioniert es ohne Fehler.

Ich denke, es ist ein Edge-Bug, weil alle anderen Browser damit umgehen können und es nur beim ersten Klick passiert.

Der Fehler tritt auch auf, wenn Sie die oberste Instanz des übergeordneten Elements verwenden.

Der Code von topFrame.js wird verwendet, um den obersten Frame meiner Site zu finden. Ich kann nicht einfach top verwenden, da es möglich sein sollte, meine Website einzubetten.

Hat jemand eine Ahnung?

Vielen Dank!

Frame1.html

<!DOCTYPE html> 
<html> 

<head> 
    <title>Frame 1</title> 
    <script type="text/javascript"> 
    var topFrame = this; 

    function myAlert() { 
     alert('alert'); 
    } 
    </script> 
</head> 

<body> 
    <iframe id="overallContentWrapper" name="mainFrame" src="frame2.html" frameborder="0"></iframe> 
</body> 

</html> 

Frame2.html

<!DOCTYPE html> 
<html> 

<head> 
    <title>Frame 2</title> 
    <script src="topFrame.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
    window.addEventListener("load", function load(event) { 
     window.removeEventListener("load", load, false); 

     try { 
     topFrame.myAlert(); 
     } catch (e) { 
     alert(e); 
     } 
    }, false); 
    </script> 
</head> 

<body> 
    <iframe name="subFrame" src="frame3.html" frameborder="0"></iframe> 
</body> 

</html> 

Frame3.html

<!DOCTYPE html> 
<html> 

<head> 
    <title>Frame 3</title> 
</head> 

<body> 
    <iframe name="subsubFrame" src="frame4.html" frameborder="0"></iframe> 
</body> 

</html> 

Frame4.html

<!DOCTYPE html> 
<html> 

<head> 
    <title>Frame 4</title> 
</head> 

<body> 
    <a href="frame2.html" target="mainFrame">Click me</a> 
</body> 

</html> 

topFrame.js

try { 
    var tmpParent = parent; 
    var topFrame = tmpParent.topFrame; 
    while (topFrame === undefined) { 
    tmpParent = tmpParent.parent; 
    topFrame = tmpParent.topFrame; 
    } 
} catch (e) { 
    alert(e); 
} 
+3

Vielleicht ist das https://davidwalsh.name/iframe-permission-denied – mplungjan

+1

X-Frame-Optionen zu SAMEORIGIN setzen nicht beheben :-(aber thx. – gollum1007

+1

@ gollum1007 haben Sie es geschafft, dies zu lösen? Alle anderen Updates "Bitte teilen. Wir haben auch das gleiche. –

Antwort

0

Nun, ich weiß, im Nacken auf der Linie hier setzen versuchen zu erraten, was IE versucht, Ihnen zu sagen, aber ich würde davon ausgehen, dass Die Verwendung dieser Art von Kommunikation steht im Gegensatz zu dem, was iframes tun sollen.

Wenn Sie zwischen Child Frames zu Parnet Frames kommunizieren möchten, empfehle ich stattdessen postMessages. Ich denke (ich glaube, denke), dass Ihr Skript gegen XSS blockiert wird - Cross Site Scripting. Also, wenn Sie einige Informationen zwischen Eltern-Rahmen und Kind-Rahmen kommunizieren möchten oder umgekehrt, empfehle ich einen Blick auf .