IFrame-wechsel in der Javascript Konsole

Immer wieder stehe ich vor dem Problem, dass ich in der Javascript Konsole der verschiedenen Browser den Kontext in ein eingebettes IFrame wechseln muss um dort eine Javascript-Funktion auszuführen. In meinem Fall, habe ich meistens eine Facebook App mit einigen js-Funktionen geschrieben und möchte diese direkt ausführen. Facebook erstellt ja ein IFrame, welches die App (oder das Tab) dann enthält.

Man kann zwar in jedem Browser mit F12 die Javascript-Konsole (oder irgendwelchen „Tools“) öffnen, aber wie man dann in das eingebettete IFrame kommt, ist unterschiedlich. Ich habe bisher noch keine einfache Übersicht gesehen, wo für jeden Browser steht, wie man das macht.

Chrome

In Chrome gibt es ganz unten eine Zeile, wo ganz rechts ein Button ist, mit dem man in die Settings kommt. In dieser Zeile steht als viertes „<top frame>“. Wenn man darauf klickt, sieht man alle IFrames der Seite und kann so in das richtige wechseln.

Firefox/Firebug

In Firefox kann man mit dem Befehl cd(); in ein anderes IFrame wechseln. Der Befehl erwartet ein frame-Objekt als Argument. An dieses kommt man, indem man zum Beispiel auf die Liste der Frames im Fenster per window.frames zugreift. Im Falle von Facebook gibt es (derzeit, 14.01.2013) nur ein IFrame. Der Komplette Aufruf heißt also cd(window.frames[0]);. Um zu schauen, wie viele es gibt, kann man natürlich window.frames.length verwenden und dann entsprechend durchprobieren. Möchte man aus dem Context wieder in die Rahmenseite springen geht das mit cd(parent);.

Internet Explorer (ab IE9)

Der Internet Explorer 9 kennt auch den Befehl cd();. Allerdings speichert dieser Browser die IFrames im Document Objekt. Der Aufruf für das Wechseln am Beispiel Facebook wäre dann also cd(document.frames[0]);. Heraus kommt man auch wieder mit cd(parent);. Dieser Befehl funktioniert ab Internet Explorer 9 richtig, selbst wenn man mit die älteren Versionen (MSIE7 und 8) simuliert. Im IE8, den ich in einer Virtuellen Maschine mit Windows 7 laufen habe, die es bei Microsoft zum Download gibt, funktioniert der cd(); Befehl eigentlich auch, allerdings leider nicht, wenn das IFrame auf eine andere Domain verweist. Also, wenn zum Beispiel das top Dokument auf Facebook ist und das IFrame auf graphity-consulting.com. Für den IE8 habe also leider keine Lösung gefunden, wie man direkt ein js-Funktion in einem IFrame ausführen kann. Auch document.frames[0].myJsFunction(); gab mir nur den Fehler „Permission denied“.

Safari

Für den Safari habe ich keine Möglichkeit gefunden, den Context zu wechseln. Man kann zwar mit window.frames[0].myJsFunction(); die eigene js-Funktion myJsFunction() im IFrame ausführen, allerdings nur, wenn beide Seiten auf der selben Domain liegen, ansonsten kommt folgender Fehler:

Unsafe JavaScript attempt to access frame with URL http://192.168.2.111/test/xpathtest.html from frame with URL http://localhost/test/iframes.html. Domains, protocols and ports must match.

 

Hier also eine kurze Übersicht:

Browser Logo Operation Einschränkung / Constraint
Chrome  chrome In unterer Zeile auf <top frame> klicken / Click on <top frame> in
Firefox  firefox cd(window.frames[0]);
Internet Explorer  Internet Explorer cd(document.frames[0]); Erst ab IE9 für unterschiedliche Domains / Only works for IE9 or newer for different domains
Safari  safari Funktioniert nicht für unterschiedliche Domains / Does not work cross domain