Notiz an mich selber: JS-Security in Safari ist strenger als in Firefox
1. Juli 2009
JavaScript schreiben und mit dem Firefox testen kann also irreführend sein! Heut habe ich über zwei Stunden Lebenszeit vergeudet, weil Firefox offenbar bestimmte JavaScript-Dinge anders regelt als Safari.
Beispiel: Ich hab einen Video-Embed-Code, der auf einer normalen HTML-Seite herumliegt. Ich möchte, dass sich auf Knopfdruck ein Popup öffnet, in das der besagte Embed-Code hineinkopiert werden soll. In Firefox kein Problem:
embedcode = document.getElementById('video');
newwindow = window.open('video-leer.html', 'fenstername');
Die Variable embedcode
kann nun ohne Probleme auch im soeben geöffneten Popup verwendet werden – die Umgebung opener
macht’s möglich:
document.getElementById('videocontainer').appendChild(opener.embedcode);
Theoretisch klappt das auch im Safari. Er sieht dort auch den opener.embedcode
und kann erkennen, welche Art von Objekt es ist. Aber er schafft es nicht, das Objekt als Kind irgendwo anzuhängen! Des Rätsels Lösung liegt darin, dass embedcode
kein Verweis auf den Embed-Code sein darf, sondern ein Clone! Offenbar ist es nicht möglich, in Safari ein Objekt aus einem anderen Fenster in das aktuelle Fenster hineinzukleben. Im Ausgangsdokument muss es also heißen:
embedcode = document.getElementById('video').cloneNode(true);
Erst dann klappt es sowohl in Firefox als auch in Safari.