obiwan1973: Prüfen, ob eine Seite in iFrame geladen ist

Hallo zusammen,

jaaajaaajaa, ich weiß, man soll nicht mit Frames arbeiten, ich mache es trotzdem, zumindest an einer Stelle, weil es da Sinn macht und die Seite nicht suchmaschinenoptimiert sein soll.

Die Anwendung ist Teil einer Business-Applikation (PHP). Ein reines Intranet-Dingens.

Nun würde ich gerne folgende Möglichkeit prüfen, ist mehr ein Luxus-Feature:

Wenn der User im Frame die "Zurück-Taste" gedruckt hat (rechte Maustaste, Kontextmenü), bringt jeder Browser in diesem Frame eine Fehlerseite.

Was mich Interessiert:
Kann ich das mit JS abfragen?
Schaut: Ich habe es mal so probiert:

  
  
	if(document.getElementById('iframe_list'))  
	{  
		if(frames['iframe_list'].document)  
		{  
			if(frames['iframe_list'].document.getElementById('form_list'))  
			{  
				// mache irgendetwas  
			}  
			else  
			{  
				// mache was anderes  
			}  
		}  
		else  
		{  
			// mache irgendetwas  
		}  
	}  
	else  
	{  
		// mache irgendetwas  
	}  

Bei der Zeile

  
  
               if(frames['iframe_list'].document)  
  

macht mich JS blöd an, bedeutet wohl: JS darf den Inhalt des iFrames, besser: das Dokument nicht prüfen.

Aaaaalsooo, Ihr fanatischen Framehasser, ich kann Euch nicht daran hindern, zu denken, was Ihr wollt, aber vielleicht bringt es ja doch der eine oder andere fertig, mich mit Input zu füttern ... :-) Aber bitte nicht: "Programmiere alles neu."

Gruß aus dem nebeligen Sachsenheim

Thomas

  1. Moin,

    Wenn der User im Frame die "Zurück-Taste" gedruckt hat (rechte Maustaste, Kontextmenü), bringt jeder Browser in diesem Frame eine Fehlerseite.

    dann verrate uns bloß nicht, was für ein Fehler das ist!
    Die Frage ist aber doch: Warum meldet ein Browser in dieser an sich selbstverständlichen Situation einen Fehler? Normalerweise sollte man erwarten, dass er -je nach Cache-Einstellungen- entweder die vorher angezeigte Seite aus dem Cache fischt und wieder so anzeigt wie vorher, oder eben diese Seite frisch vom Server anfordert. *Das* könnte je nach Kontext einen Fehler provozieren - aber nicht aus der Sicht des Browsers, sondern aus der Sicht der auf dem Server laufenden Geschichten.

    Kann ich das mit JS abfragen?

    Was genau? Das "Zurück"-Navigieren? AFAIK nein.

    Schaut: Ich habe es mal so probiert:

    Schön wäre, wenn du beschreiben würdest, was der Code bewirken soll. Das verstehe ich nämlich nicht.

    Bei der Zeile

    if(frames['iframe_list'].document)

    macht mich JS blöd an, bedeutet wohl: JS darf den Inhalt des iFrames, besser: das Dokument nicht prüfen.

    Kommen die Frame-Inhalte alle von derselben Domain? Falls nein, schlägt hier eventuell die SOP zu.

    So long,
     Martin

    --
    Okay, Alkohol ist keine Antwort.
    Aber manchmal vergisst man beim Trinken wenigstens die Frage.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Es ist ein Unterschied, ob das Dokument im iframe von derselben Domain stammt oder nicht. Bei derselben Domain lassen die Browser eine Verständigung zu zwischen parent- und iframe-document.

    Bei verschiedenen Domains gibt es einen Umweg.

    Das Dokument im iframe weiss ja, wenn es fertig geladen ist. Dann kann es per Ajax eine Meldung an seinen eigenen Server senden. Der Server stellt daraufhin eine Meldung online, etwa eine CSS-, Javascript-, oder Grafik-Datei.

    Die Dateien können per Javascript zeitverzögert vom parent-document gelesen werden.

    Du kannst das Lesen einige Male probieren, etwa dreimal nach je einer Sekunde.

    Wenn das dein Problem lösen kann, kann ich weitere Details schreiben.

    Gast

    1. Hallo,

      Das Dokument im iframe weiss ja, wenn es fertig geladen ist. Dann kann es per Ajax eine Meldung an seinen eigenen Server senden. Der Server stellt daraufhin eine Meldung online, etwa eine CSS-, Javascript-, oder Grafik-Datei.

      Die Dateien können per Javascript zeitverzögert vom parent-document gelesen werden.

      Du kannst das Lesen einige Male probieren, etwa dreimal nach je einer Sekunde.

      Wieso den Umweg über den Server nehmen? Die Seite kann doch auch ein JS des "Openers" aufrufen.

      Viele Grüße
      Siri

      1. Hi,

        Wieso den Umweg über den Server nehmen? Die Seite kann doch auch ein JS des "Openers" aufrufen.

        aber nicht wenn iframe- und Elterndokument domainfremd sind. :-P

        Ciao,
         Martin

        --
        Okay, Alkohol ist keine Antwort.
        Aber manchmal vergisst man beim Trinken wenigstens die Frage.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          Wieso den Umweg über den Server nehmen? Die Seite kann doch auch ein JS des "Openers" aufrufen.

          aber nicht wenn iframe- und Elterndokument domainfremd sind. :-P

          Aber wenn das iFrame-Dokument nicht "mir gehört", dann kann ich auch kein JS einbauen, das den Server benachrichtigt.

          Viele Grüße
          Siri

          1. Om nah hoo pez nyeetz, Siri!

            Aber wenn das iFrame-Dokument nicht "mir gehört", dann kann ich auch kein JS einbauen, das den Server benachrichtigt.

            Dir können aber Dokumente auf verschiedenen Domains gehören.

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Kolk und Kolkrabe.

            1. Hallo,

              Dir können aber Dokumente auf verschiedenen Domains gehören.

              Ja, aber da müsste sich mal der OP äußern ;-)

              Viele Grüße
              Siri

    2. Hallo,

      Bei verschiedenen Domains gibt es einen Umweg.

      Das Dokument im iframe weiss ja, wenn es fertig geladen ist. Dann kann es per Ajax eine Meldung an seinen eigenen Server senden. Der Server stellt daraufhin eine Meldung online, etwa eine CSS-, Javascript-, oder Grafik-Datei.

      Die Dateien können per Javascript zeitverzögert vom parent-document gelesen werden.

      Dieser Umweg ist zum Glück nicht mehr nötig. Dokumente können cross-domain mittels postMessage kommunizieren. Siehe auch:

      http://en.wikipedia.org/wiki/Web_Messaging
      http://dev.w3.org/html5/postmsg/
      http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html

      So kommuniziert man auch mit Web Workern.

      Mathias

  3. Hallo,

    Prüfen, ob eine Seite in iFrame geladen ist

    Du kannst auf den load-Event warten, bevor du versuchst, auf das Dokument im iframe zuzugreifen.

    <iframe src="…" id="meinIFrame"></iframe>

    document.getElementById('meinIframe').onload = function() {  
      alert(this.document.body.innerHTML);  
    };
    

    Das geht wie gesagt nicht, wenn das Dokument im Iframe von einer anderen »Origin« stammt (i.d.R. einer anderen Domain).

    Mathias

    1. Das geht wie gesagt nicht, wenn das Dokument im Iframe von einer anderen »Origin« stammt (i.d.R. einer anderen Domain).

      Das bezog sich auf den Zugriff auf iframe.document. Der load-Event lässt sich auch cross-domain überwachen.