Nous utilisons jQuery Thickbox pour afficher dynamiquement une iframe lorsque quelqu'un clique sur une image. Dans cette iframe, nous utilisons galleria une bibliothèque javascript pour afficher plusieurs images.
Le problème semble être que $(document).ready
l'iframe semble être déclenché trop tôt et que le contenu de l'iframe n'est même pas encore chargé, donc le code galleria n'est pas appliqué correctement sur les éléments DOM. $(document).ready
semble utiliser l'état prêt du parent iframe pour décider si l'iframe est prêt.
Si nous extrayons la fonction appelée par document prête dans une fonction séparée et l'appelons après un timeout de 100 ms. Cela fonctionne, mais nous ne pouvons pas prendre le risque en production avec un ordinateur lent.
$(document).ready(function() { setTimeout(ApplyGalleria, 100); });
Ma question: à quel événement jQuery devons-nous nous lier pour pouvoir exécuter notre code lorsque l'iframe dynamique est prêt et pas seulement un parent?
Réponses:
J'ai répondu à une question similaire (voir rappel Javascript quand IFRAME a fini de charger? ). Vous pouvez obtenir le contrôle sur l'événement de chargement iframe avec le code suivant:
En traitant les iframes, j'ai trouvé assez bon pour utiliser l'événement de chargement au lieu de l'événement prêt pour le document.
la source
.load()
l'événement est obsolète. Utilisez.on( "load", handler )
plutôt.En utilisant jQuery 1.3.2, les éléments suivants ont fonctionné pour moi:
RÉVISION:! En fait, le code ci-dessus semble parfois fonctionner dans Firefox, ne semble jamais fonctionner dans Opera.
Au lieu de cela, j'ai mis en œuvre une solution de sondage pour mes besoins. Simplifié vers le bas, il ressemble à ceci:
Cela ne nécessite pas de code dans les pages iframe appelées. Tout le code réside et s'exécute à partir du cadre / fenêtre parent.
la source
setInterval
plutôt pour le sondage.Dans IFrames, je résous généralement ce problème en mettant un petit script à la toute fin du bloc:
Ce travail la plupart du temps pour moi. Parfois, la solution la plus simple et la plus naïve est la plus appropriée.
la source
parent
pour récupérer une copie de jQuery et l'utiliserparent.$(document).ready(function(){ parent.IFrameLoaded( ); });
pour initialiser l'iframe.Suite à l'idée de DrJokepu et David Murdoch, j'ai implémenté une version plus complète. Il nécessite jQuery sur le parent et l'iframe et l'iframe pour être sous votre contrôle.
code iframe:
code de test parent:
la source
J'ai trouvé la solution au problème.
Lorsque vous cliquez sur un lien Thickbox qui ouvre un iframe, il insère un iframe avec un identifiant TB_iframeContent.
Au lieu de
$(document).ready
me fier à l' événement dans le code iframe, je dois juste me lier à l'événement load de l'iframe dans le document parent:Ce code est dans l'iframe mais se lie à un événement d'un contrôle dans le document parent. Cela fonctionne dans FireFox et IE.
la source
top.document
qui me permet d'avoir du code à l' intérieur de l'iframe pour pouvoir dire quand l'iframe s'est chargé. (Bien qu'ilload
soit obsolète depuis cette réponse, et devrait être remplacé paron("load")
.)Fondamentalement, ce que d'autres ont déjà publié mais à mon humble avis un peu plus propre:
la source
Essaye ça,
Il ne vous reste plus qu'à créer la fonction JavaScript testframe_loaded ().
la source
Je charge le PDF avec jQuery ajax dans le cache du navigateur. Ensuite, je crée un élément intégré avec des données déjà dans le cache du navigateur. Je suppose que cela fonctionnera aussi avec iframe.
Vous devez également définir correctement vos en-têtes http.
la source
C'était le problème exact que j'ai rencontré avec notre client. J'ai créé un petit plugin jquery qui semble fonctionner pour la préparation iframe. Il utilise l'interrogation pour vérifier le document iframe readyState combiné avec l'url du document interne combiné avec la source iframe pour s'assurer que l'iframe est en fait «prêt».
Le problème avec "onload" est que vous avez besoin d'accéder à l'iframe réel ajouté au DOM, si ce n'est pas le cas, vous devez essayer d'attraper le chargement de l'iframe qui, s'il est mis en cache, vous ne le pourrez peut-être pas. Ce dont j'avais besoin était un script qui pouvait être appelé à tout moment et déterminer si l'iframe était "prêt" ou non.
Voici la question:
Saint Graal pour déterminer si l'iframe locale a été chargée ou non
et voici le jsfiddle que j'ai finalement trouvé.
https://jsfiddle.net/q0smjkh5/10/
Dans le jsfiddle ci-dessus, j'attends que onload ajoute une iframe au dom, puis je vérifie l'état prêt du document interne de l'iframe - qui devrait être interdomaine car il pointe vers wikipedia - mais Chrome semble signaler "terminé". La méthode iready du plug-in est alors appelée lorsque l'iframe est en fait prête. Le rappel essaie de vérifier à nouveau l'état prêt du document interne - cette fois en signalant une requête interdomaine (ce qui est correct) - de toute façon, il semble fonctionner pour ce dont j'ai besoin et j'espère que cela aidera les autres.
la source
Cette fonction de cette réponse est la meilleure façon de gérer cela car elle
$.ready
échoue explicitement pour les iframes. Voici la décision de ne pas soutenir cela.L'
load
événement ne se déclenche pas non plus si l'iframe est déjà chargé. Très frustrant que cela reste un problème en 2020!}
la source