Von IFrame aus innerHTML in obersten Fenster
Martin Reimer
- javascript
Hallo,
ich habe auf einer Seite einen DIV-Container namens "inhalt" und einen IFrame.
Von dem IFrame aus soll nun in den DIV-Container etwas geschrieben werden.
Dazu habe ich folgendes im IFrame notiert:
<script type="text/javascript">
top.document.getElementById("inhalt").innerHTML='123';
</script>
Es verändert sich aber gar nichts im Container .-(
Was könnte das für Gründe haben? Weil an sich ist es ja eigentlich richtig notiert...
Danke,
Martin
Lieber Martin,
<script type="text/javascript">
top.document.getElementById("inhalt").innerHTML='123';
</script>
dieses Script wird beim Laden des Iframes sofort ausgeführt. Sollte im Elternframe noch kein Element mit der ID "inhalt" existieren, kann diese JavaScriptanweisung nicht erfolgreich ausgeführt werden. Es kommt zu einer Fehlermeldung die Du anscheinend noch nicht nachgesehen hast, denn sonst hättest Du uns ihren Inhalt sicherlich längst verraten.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Frank,
Das DIV namens "inhalt" ist natürlich schon vorhanden.
Genaue Fehlermeldung:
Fehler: Erlaubnis zum Lesen der Eigenschaft Window.document wurde verweigert Quelldatei: http://127.0.1/iframe.php Zeile: 1
Das hat irgendwas mit Cross-Site-Scripting zu tun, allerdings liegen ja beide Dateien auf dem gleichen Server:
127.0.0.1/index.php (die Datei mit dem DIV-Container 'inhalt' und dem IFrame)
127.0.0.1/iframe.php (der IFrame der in den Container schreiben soll)
Lieber Martin,
Hallo Frank,
fast. Aber auch schön. ;-)
Das DIV namens "inhalt" ist natürlich schon vorhanden.
"Natürlich"? Was ist "natürlich"?
Fehler: Erlaubnis zum Lesen der Eigenschaft Window.document wurde verweigert Quelldatei: http://127.0.1/iframe.php Zeile: 1
Das hat irgendwas mit Cross-Site-Scripting zu tun, allerdings liegen ja beide Dateien auf dem gleichen Server:
127.0.0.1/index.php (die Datei mit dem DIV-Container 'inhalt' und dem IFrame)
127.0.0.1/iframe.php (der IFrame der in den Container schreiben soll)
Möglich... Ich würde die JavaScript-Operation erst nach dem vollständigen Laden des Iframes ausführen lassen. Dazu notierst Du in Deinen <script>-Bereich folgendes:
<script type="text/javascript">
var Grapscher = {
grapschen : function () {
if (!confirm("Soll jetzt gegrapscht werden?"))
return;
var elternFrame = top;
if (elternFrame == window)
alert("Kein Elternframe vorhanden!");
var doc = elternFrame.document;
if (!doc)
alert("Kein Zugriff auf das document Objekt im Elternframe!");
var div = elternFrame.doc.getElementById("inhalt");
if (!div)
alert("Kein Element mit der ID 'inhalt' gefunden...");
else
div.innerHTML = "123";
},
init : function () {
this.oldWinOnLoad = window.onload;
window.onload = function () {
if (typeof(window.Grapscher.oldWinOnLoad) == "function")
window.Grapscher.oldWinOnLoad();
window.Grapscher.grapschen();
};
}
};
Grapscher.init();
</script>
In diesem (ungetesteten!) Beispiel wollte ich Dir zwei Dinge zeigen:
1. wie man ein JavaScript sinnvoll für ein HTML-Dokument aufbaut
(also das mit dem "Autostart" nach dem Laden der Seite),
2. wie man sinnvolles Debugging betreibt
Das Script sollte Dir nun sagen können, wo genau das Problem auftritt.
Natürlich sollte dieses JavaScript in eine externe Datei ausgelagert werden, die Du dann in Deine HTML-Dokumente einbindest. Falls im "Eltern-DIV" verschiedene Inhalte eingetragen werden sollen, dann kannst Du die Funktion "grapschen" ja entsprechend erweitern, sodass Sie etwas von der aktuellen Iframe-Seite nimmt, um es in das Eltern-DIV zu schreiben. Dann ist das Script in diesem Punkt universell...
Liebe Grüße aus Ellwangen,
Felix Riesterer.