Wir verwenden jQuery Thickbox , um einen Iframe dynamisch anzuzeigen, wenn jemand auf ein Bild klickt. In diesem Iframe verwenden wir Galleria, eine Javascript-Bibliothek, um mehrere Bilder anzuzeigen.
Das Problem scheint zu sein, dass $(document).ready
der Iframe zu früh ausgelöst wird und der Iframe-Inhalt noch nicht einmal geladen ist, sodass der Galleria-Code nicht ordnungsgemäß auf die DOM-Elemente angewendet wird. $(document).ready
scheint den übergeordneten Bereitschaftsstatus des Iframes zu verwenden, um zu entscheiden, ob der Iframe bereit ist.
Wenn wir die von document ready aufgerufene Funktion in einer separaten Funktion extrahieren und nach einer Zeitüberschreitung von 100 ms aufrufen. Es funktioniert, aber wir können die Chance in der Produktion mit einem langsamen Computer nicht nutzen.
$(document).ready(function() { setTimeout(ApplyGalleria, 100); });
Meine Frage: An welches jQuery-Ereignis sollten wir binden, um unseren Code ausführen zu können, wenn der dynamische Iframe bereit ist und nicht nur ein übergeordnetes Element?
Antworten:
Ich habe eine ähnliche Frage beantwortet (siehe Javascript-Rückruf, wenn IFRAME vollständig geladen ist? ). Sie können die Kontrolle über das iframe-Ladeereignis mit dem folgenden Code erhalten:
Im Umgang mit iframes fand ich gut genug, um ein Ladeereignis anstelle eines dokumentenfertigen Ereignisses zu verwenden.
quelle
.load()
Ereignis ist veraltet. Verwenden Sie.on( "load", handler )
stattdessen.Mit jQuery 1.3.2 hat Folgendes für mich funktioniert:
REVISION:! Tatsächlich sieht der obige Code manchmal so aus, als würde er in Firefox funktionieren, nie so, als würde er in Opera funktionieren.
Stattdessen habe ich eine Polling-Lösung für meine Zwecke implementiert. Vereinfacht sieht es so aus:
Dies erfordert keinen Code auf den aufgerufenen Iframe-Seiten. Der gesamte Code befindet sich im übergeordneten Frame / Fenster und wird ausgeführt.
quelle
setInterval
zum Abrufen empfehlen .In IFrames löse ich dieses Problem normalerweise, indem ich ein kleines Skript ganz am Ende des Blocks platziere:
Diese Arbeit die meiste Zeit für mich. Manchmal ist die einfachste und naivste Lösung die am besten geeignete.
quelle
parent
um eine Kopie von jQuery zu erhalten undparent.$(document).ready(function(){ parent.IFrameLoaded( ); });
den Iframe zu initialisieren.Nach der Idee von DrJokepu und David Murdoch habe ich eine vollständigere Version implementiert. Es erfordert jQuery sowohl auf dem übergeordneten als auch auf dem iframe und dem iframe, um in Ihrer Kontrolle zu sein.
Iframe-Code:
übergeordneter Testcode:
quelle
Habe die Lösung für das Problem gefunden.
Wenn Sie auf einen Thickbox-Link klicken, der einen Iframe öffnet, wird ein Iframe mit der ID TB_iframeContent eingefügt.
Anstatt
$(document).ready
mich auf das Ereignis im Iframe-Code zu verlassen, muss ich mich nur an das Ladeereignis des Iframes im übergeordneten Dokument binden:Dieser Code befindet sich im Iframe, ist jedoch an ein Ereignis eines Steuerelements im übergeordneten Dokument gebunden. Es funktioniert in FireFox und IE.
quelle
top.document
, in dem ich Code im Iframe haben kann, um zu erkennen, wann der Iframe geladen wurde. (Obwohlload
seit dieser Antwort veraltet und sollte durch ersetzt werdenon("load")
.)Grundsätzlich was andere schon gepostet haben aber IMHO ein bisschen sauberer:
quelle
Versuche dies,
Sie müssen dann nur noch die JavaScript-Funktion testframe_loaded () erstellen.
quelle
Ich lade das PDF mit jQuery Ajax in den Browser-Cache. Dann erstelle ich ein eingebettetes Element mit Daten, die sich bereits im Browser-Cache befinden. Ich denke, es wird auch mit iframe funktionieren.
Sie müssen auch Ihre http-Header richtig einstellen.
quelle
Dies war genau das Problem, auf das ich bei unserem Kunden gestoßen bin. Ich habe ein kleines JQuery-Plugin erstellt, das für die Iframe-Bereitschaft zu funktionieren scheint. Es verwendet Polling, um das iframe-Dokument readyState in Kombination mit der inneren Dokument-URL in Kombination mit der iframe-Quelle zu überprüfen, um sicherzustellen, dass der iframe tatsächlich "ready" ist.
Das Problem mit "onload" ist, dass Sie Zugriff auf den tatsächlichen Iframe benötigen, der dem DOM hinzugefügt wird. Wenn Sie dies nicht tun, müssen Sie versuchen, das Laden des Iframes abzufangen. Wenn es zwischengespeichert wird, ist dies möglicherweise nicht der Fall. Was ich brauchte, war ein Skript, das jederzeit aufgerufen werden konnte und feststellte, ob der Iframe "bereit" war oder nicht.
Hier ist die Frage:
Heiliger Gral, um festzustellen, ob ein lokaler Iframe geladen wurde oder nicht
und hier ist die jsfiddle, die ich mir schließlich ausgedacht habe.
https://jsfiddle.net/q0smjkh5/10/
In der obigen jsfiddle warte ich darauf, dass beim Laden ein Iframe an den Dom angehängt wird, und überprüfe dann den Bereitschaftsstatus des inneren Dokuments des Iframes - der domänenübergreifend sein sollte, da er auf Wikipedia verweist -, aber Chrome scheint "vollständig" zu melden. Die iready-Methode des Plug-Ins wird dann aufgerufen, wenn der iframe tatsächlich bereit ist. Der Rückruf versucht erneut, den Bereitschaftszustand des inneren Dokuments zu überprüfen - diesmal wird eine domänenübergreifende Anfrage gemeldet (was korrekt ist) -, trotzdem scheint es für das zu funktionieren, was ich brauche, und ich hoffe, es hilft anderen.
quelle
Diese Funktion aus dieser Antwort ist der beste Weg, um damit
$.ready
umzugehen, da dies für iframes explizit fehlschlägt. Hier ist die Entscheidung nicht zu unterstützen.Das
load
Ereignis wird auch nicht ausgelöst, wenn der Iframe bereits geladen wurde. Sehr frustrierend, dass dies auch 2020 ein Problem bleibt!}}
quelle