Detect DOMContentLoaded in iframe

9

Ich war überrascht zu sehen, dass das Folgende scheinbar nicht funktioniert, insofern das DOMContentLoaded-Ereignis nicht ausgelöst wird ( this.els ist ein Objekt von Elementen).

%Vor%

Die Seite wird in den Iframe geladen, aber ohne Rückruf. Die DOM-Ebene null onload funktioniert jedoch.

%Vor%

Eine Problemumgehung besteht darin, ein global zugängliches jQuery-deferred-Objekt auf der übergeordneten Seite vorzubereiten und es über ein DOM-ready-Ereignis von der aufgerufenen Seite in den iframe auszulösen, anstatt vom übergeordneten Element auf DOM-ready zu warten.

Paraent-Seite:

%Vor%

Rahmenseite:

%Vor%

Trotzdem wäre es gut zu wissen, was mit dem ersten Ansatz los ist ...

    
Utkanos 06.06.2013, 11:20
quelle

3 Antworten

12

Bei der Beantwortung von Bei dieser Frage entdeckte ich den Grund dafür, dass Ihr DOMContentLoaded -Ereignis-Listener nicht funktioniert. Es scheint mir, dass Sie zwei Probleme haben.

Zuerst versuchen Sie, das Ereignis DOMContentLoaded auf dem iFrame selbst anzuhören. Das ist kein iFrame-Ereignis. Es ist ein Dokumentenereignis. Sie müssen also in den iFrame greifen, um das contentWindow zu erhalten und dann das Dokument daraus zu holen. Das führt zur zweiten Ausgabe.

Zweitens, wenn ein iFrame zum ersten Mal erstellt wird, hat er einen Dummy document darin, der NICHT das selbe Dokument ist, wie es schließlich vorhanden sein wird, wenn dynamischer Inhalt über das Attribut .src geladen wird. Also, selbst wenn du es getan hast:

%Vor%

Um das Dokument in den iFrame zu bekommen, ist es nicht unbedingt das richtige Dokument und somit wird das DOMContentLoaded -Ereignis nicht ausgelöst (ich habe dieses Verhalten in Chrome gesehen).

MDN sagt, dass man auf das DOMFrameContentLoaded -Ereignis auf dem iFrame selbst warten kann und dies entspricht dem, wenn das zugrundeliegende Dokument tatsächlich DOMContentLoaded bekommt. Leider kann ich dieses Ereignis in keinem Browser ausführen. In diesem Moment ist der einzige mir bekannte Workaround, das Load-Ereignis entweder aus dem iFrame heraus auszulösen, wo es sein eigenes DOMContentLoaded -Ereignis abhören kann (es kann bei Bedarf zum übergeordneten Fenster aufgerufen werden). oder einfach nur auf das load -Ereignis des iFrame-Objekts warten und wissen, dass es erst ausgelöst wird, wenn auch Ressourcen wie Stylesheets und Bilder im iFrame geladen sind.

Wie auch immer, ich dachte, ich würde etwas von dem, was mit Ihrem ursprünglichen Code vor sich ging, erklären und eine andere Lösung anbieten, obwohl diese Frage vor mehr als einem Jahr gestellt wurde (obwohl sie nie beantwortet wurde).

Aktualisierung:

Ich habe eine Methode entwickelt, mit der DOMContentLoaded für einen iFrame verfolgt werden kann, der mit demselben Ursprung geladen ist wie sein Elternteil. Sie können den Code sehen hier .

    
jfriend00 08.07.2014, 00:25
quelle
5

Nachdem ich verschiedene Optionen ausprobiert habe, habe ich festgestellt, dass der folgende Code für mich funktioniert:

%Vor%     
ivan.ice 07.08.2015 06:37
quelle
1

Das könnte eher ein Hack sein, aber hat mir geholfen, ein ähnliches Problem zu lösen.

Ich höre jetzt auf onmouseenter des Frame-Inhalts.

Dieses Ereignis wird vor load ausgelöst (wenn der Benutzer die Maus bewegt). Aber wie in meinem Fall brauche ich das Ereignis zur Initialisierung eines Kontextmenüs, die Maus war sowieso Voraussetzung.

Es wird sogar ausgelöst, wenn sich der Bildinhalt unter der Maus ändert.

    
JochenJung 01.12.2017 10:01
quelle