Comment détecter si un iframe a déjà été chargé
Il semble que $('#someIframe').load(function(){...})
ne se déclenche pas si elle est attachée après l'iframe a fini de charger. Est-ce exact?
Ce que j'aimerais vraiment est d'avoir une fonction qui est toujours appelé une seule fois lors de ou après un iframe est chargé. Pour rendre cela plus clair, voici deux cas:
- Iframe n'a pas encore chargé: exécuter une fonction de rappel une fois qu'il se charge.
- Iframe a déjà chargé: exécuter la fonction de rappel immédiatement.
Comment puis-je faire cela?
- Est l'iframe dans le même domaine que la page qui veut savoir quand il est chargé? Avez-vous contrôler le contenu de l'iframe? ou est le contenu de l'iframe connu?
- Ressemble à la même question que this
- Donc, comme une question de fait, il est dans le même domaine. Bien sûr, la meilleure réponse serait la même pour les deux. Idéalement, je ne veux pas d'une page à modifier le contenu dans l'autre page, ou le contrôle de variables dans une autre page.
- Mike W - Cette question ne mentionne pas comment faire si l'iframe est / peut-être déjà chargé. C'est la question principale pour moi.
- Comme de jQuery 3.0,
load
est allé. S'il vous plaît essayer.on('load', function() { ... })
à la place.
Vous devez vous connecter pour publier un commentaire.
J'ai cogné la tête contre un mur jusqu'à ce que j'ai trouvé ce qui se passe ici.
Informations d'arrière-plan
.load()
n'est pas possible si l'iframe a déjà été chargé (événement se déclenche jamais).ready()
sur un élément iframe n'est pas pris en charge (référence) et va appeler la fonction de rappel immédiatement, même si l'iframe n'est pas encore chargé,postMessage
ou un appel d'un conteneur de fonction surload
à l'intérieur de l'iframe n'est possible que lorsque le contrôle$(window).load()
sur le conteneur serait également attendre pour les autres actifs, à la charge, comme des images et d'autres iframes. Ce n'est pas une solution si vous voulez attendre seulement pour un iframereadyState
en Chrome pour une alredy tiré événement onload est vide de sens, comme Chrome initialise tous les iframe avec un "about:blank" page vide. LereadyState
de cette page peut êtrecomplete
, mais ce n'est pas lereadyState
de la page que vous attendez (src
attribut).Solution
Il est nécessaire de:
.load()
événementreadyState
readyState
estcomplete
, on peut normalement supposer que l'iframe a déjà été chargé. Toutefois, en raison de la sus-nommée comportement de Chrome en outre, nous devons vérifier si c'est lareadyState
d'une page videreadyState
dans un intervalle de vérifier si le document lui-même (liée à l'attribut src) estcomplete
J'ai résolu ce problème avec la fonction suivante. Il a été (transpiled à ES5) testé avec succès dans
Fonction de prise de jquery.marque
Exemple de travail
Composé de deux fichiers (index.html et iframe.html):
index.html:
iframe.html:
Vous pouvez également modifier la
src
attribut à l'intérieur deindex.html
, par exemple "http://example.com/". Juste jouer un peu avec elle.load.jqueryMark
à l'intérieur deobserveOnload
? Je peux voir que si le contenu de l'iframe src est "about:blank" il va appelerobserveOnload
et attendre jqueryMark...mais pourquoi jqueryMark?observerOnload
fonction etload
événement sont deux choses différentes. Leload.jqueryMark
est juste un espace de noms, ce qui rend possible pour vous désabonner après unload
a été congédié. Il n'est pas nécessaire d'avoir mark.js inclus, il n'y a pas de dépendance. Cependant, je vous recommande d'utiliser la dernière version du code à partir de la dépôt.J'utiliserais postMessage. L'iframe peut attribuer son propre événement onload et poste pour la société mère. Si il y a des problèmes de timing assurez-vous de vous attribuer le parent postMessage gestionnaire d'avant la création de l'iframe.
Pour que cela fonctionne, l'iframe devez connaître l'url de la mère, par exemple en passant un paramètre GET de l'iframe.
J'ai eu le même problème, dans mon cas, j'ai simplement vérifié si onload fonction est viré ou pas.
J'ai essayé très dur pour arriver à une solution qui a travaillé de façon constante de la croix-navigateur. IMPORTANT: je n'ai pas pu arriver à une telle solution. Mais ici, c'est pour autant que je suis:
et je l'utilise comme ceci:
Noter que même ce ne résout pas le problème pour moi. Voici quelques problèmes avec cette solution:
Donc, si quelqu'un peut améliorer sur ce point, il serait très apprécié.
Seulement lorsque le contenu à l'intérieur de l'iframe est chargé innerDoc est vrai et les feux de code à l'intérieur de la si.
exemple
window.onload
suppose que vous aussi, vous voulez attendre pour les images et autres iframes à l'intérieur de la fenêtre. Ce que nous voulons, c'est uniquement pour vérifier si spécifique de l'iframe a été chargé.Je pense que vous devriez essayer d'utiliser
onreadystatechange
événement.http://jsfiddle.net/fk8fc/3/
EDIT: le contexte n'est pas ce que je pense c'est. vous pouvez seulement de vérifier la readyState de iframe document et tout devrait bien se passer.
OP: C'est un emballés fonction que j'ai faite à partir de concepts décrits ci-dessus: