Ich habe ein Projekt, in dem ich ein <iframe> -Element mit JavaScript erstellen und an das DOM anhängen muss . Danach muss ich etwas Inhalt in den <iframe> einfügen. Es ist ein Widget, das in Websites von Drittanbietern eingebettet wird."Zugriff verweigert" JavaScript-Fehler beim Versuch, auf das Dokumentobjekt eines programmgesteuerten <iframe> zuzugreifen (nur IE)
Ich setze nicht das "src" Attribut des <iframe>, da ich keine Seite laden möchte; Es wird vielmehr verwendet, um den Inhalt, den ich in den Inhalt einfüge, zu isolieren/sandboxieren, sodass ich keine CSS- oder JavaScript-Konflikte mit der übergeordneten Seite bekomme. Ich verwende JSONP, um einige HTML-Inhalte von einem Server zu laden und in diesen <iframe> einzufügen.
Ich habe dies funktioniert gut, mit einer ernsten Ausnahme - wenn die Eigenschaft document.domain in der übergeordneten Seite (die es in bestimmten Umgebungen sein kann, in denen dieses Widget bereitgestellt wird), Internet Explorer (wahrscheinlich alle Versionen, aber ich habe in 6, 7 und 8 bestätigt) gibt mir einen "Zugriff wird verweigert" Fehler, wenn ich versuche, auf das Dokumentobjekt dieses <iframe> zuzugreifen, das ich erstellt habe. Es passiert nicht in anderen Browsern, in denen ich getestet habe (alle wichtigen modernen).
Das macht einen Sinn, da ich weiß, dass Internet Explorer erfordert, dass Sie die document.domain aller Fenster/Frames, die miteinander kommunizieren, auf den gleichen Wert setzen. Mir ist jedoch keine Möglichkeit bekannt, diesen Wert für ein Dokument festzulegen, auf das ich nicht zugreifen kann.
Kennt jemand eine Möglichkeit, dies zu tun - irgendwie die Eigenschaft document.domain dieser dynamisch erstellten <iframe> setzen? Oder schaue ich es nicht aus dem richtigen Blickwinkel an - gibt es einen anderen Weg, um das zu erreichen, was ich will, ohne auf dieses Problem zu stoßen? Ich muss in jedem Fall einen <iframe> verwenden, da das isolierte/sandboxed-Fenster für die Funktionalität dieses Widgets entscheidend ist.
Hier ist mein Testcode:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Document.domain Test</title>
<script type="text/javascript">
document.domain = 'onespot.com'; // set the page's document.domain
</script>
</head>
<body>
<p>This is a paragraph above the <iframe>.</p>
<div id="placeholder"></div>
<p>This is a paragraph below the <iframe>.</p>
<script type="text/javascript">
var iframe = document.createElement('iframe'), doc; // create <iframe> element
document.getElementById('placeholder').appendChild(iframe); // append <iframe> element to the placeholder element
setTimeout(function() { // set a timeout to give browsers a chance to recognize the <iframe>
doc = iframe.contentWindow || iframe.contentDocument; // get a handle on the <iframe> document
alert(doc);
if (doc.document) { // HEREIN LIES THE PROBLEM
doc = doc.document;
}
doc.body.innerHTML = '<h1>Hello!</h1>'; // add an element
}, 10);
</script>
</body>
</html>
Ich habe es bei gehosteten:
http://troy.onespot.com/static/access_denied.html
Wie Sie sehen, wenn Sie diese Seite in IE laden, an dem Punkt, dass ich Call Alert(), ich habe ein Handle auf das Fensterobjekt des <iframe>; Ich kann einfach nicht tiefer in sein Dokumentobjekt eindringen.
Vielen Dank für jede Hilfe oder Anregungen! Ich werde denen danken, die mir helfen können, eine Lösung dafür zu finden.
@bobince: Du bist großartig! Ich bin tatsächlich am späten Abend nach sehr viel mehr Googeln über diesen Ansatz gestolpert. Tatsächlich hätte ich vielleicht eine noch robustere und möglicherweise weniger kludrige Cross-Browser-Lösung gefunden: http://www.telerik.com/community/forums/aspnet-ajax/editor/document-domain-access-denied -in-ie-6.aspx - beachten Sie Jeff Tuckers Post vom 21. August. Setzen Sie das "src" -Attribut derauf "javascript: void ((function() {document.open(); document.domain = \ 'tld .com \ '; document.close();})()) "scheint den Trick zu machen, und in einer Browser-übergreifenden Weise. Es funktioniert auch in Safari (mindestens v3 +). – Bungle
Hier ist eine Testseite, die meinen vorherigen Kommentar illustriert: http://troy.onespot.com/static/access_denied_test.html – Bungle
Oh großartig! Das ist viel besser! Interessant, dass es direkt funktionieren sollte ... normalerweise würde eine javascript: URL im Kontext des übergeordneten Elements ausgeführt, aber das scheint bei iframe src nicht der Fall zu sein. Sie können wahrscheinlich auch den 'void()' Aufruf verlieren, da die Funktion bereits 'undefined' zurückgibt. – bobince