C'est exactement le problème que j'ai rencontré avec notre client. J'ai créé un petit plugin jquery qui semble fonctionner pour la préparation des iframes. Il utilise le polling pour vérifier le readyState du document iframe combiné avec l'url du document interne combiné avec la source de l'iframe pour s'assurer que l'iframe est en fait "prêt".
Le problème avec "onload" est que vous devez avoir accès à la iframe réelle ajoutée au DOM, si vous ne l'avez pas, vous devez essayer d'attraper le chargement de l'iframe, ce qui, s'il est mis en cache, peut ne pas être le cas. 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 :
Le Saint Graal pour déterminer si un iframe local a été chargé 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 de préparation du document interne de l'iframe - qui devrait être inter-domaine puisqu'il pointe vers wikipedia - mais Chrome semble signaler "complete". La méthode iready du plug-in est ensuite appelée lorsque l'iframe est effectivement prête. Le callback essaie de vérifier à nouveau l'état de préparation du document interne - cette fois-ci, il signale une requête inter-domaine (ce qui est correct). Quoi qu'il en soit, cela semble fonctionner pour ce dont j'ai besoin et j'espère que cela aidera d'autres personnes.
<script>
(function($, document, undefined) {
$.fn["iready"] = function(callback) {
var ifr = this.filter("iframe"),
arg = arguments,
src = this,
clc = null, // collection
lng = 50, // length of time to wait between intervals
ivl = -1, // interval id
chk = function(ifr) {
try {
var cnt = ifr.contents(),
doc = cnt[0],
src = ifr.attr("src"),
url = doc.URL;
switch (doc.readyState) {
case "complete":
if (!src || src === "about:blank") {
// we don't care about empty iframes
ifr.data("ready", "true");
} else if (!url || url === "about:blank") {
// empty document still needs loaded
ifr.data("ready", undefined);
} else {
// not an empty iframe and not an empty src
// should be loaded
ifr.data("ready", true);
}
break;
case "interactive":
ifr.data("ready", "true");
break;
case "loading":
default:
// still loading
break;
}
} catch (ignore) {
// as far as we're concerned the iframe is ready
// since we won't be able to access it cross domain
ifr.data("ready", "true");
}
return ifr.data("ready") === "true";
};
if (ifr.length) {
ifr.each(function() {
if (!$(this).data("ready")) {
// add to collection
clc = (clc) ? clc.add($(this)) : $(this);
}
});
if (clc) {
ivl = setInterval(function() {
var rd = true;
clc.each(function() {
if (!$(this).data("ready")) {
if (!chk($(this))) {
rd = false;
}
}
});
if (rd) {
clearInterval(ivl);
clc = null;
callback.apply(src, arg);
}
}, lng);
} else {
clc = null;
callback.apply(src, arg);
}
} else {
clc = null;
callback.apply(this, arguments);
}
return this;
};
}(jQuery, document));
</script>
1 votes
Et vous confirmez que Galleria fonctionne lorsque vous le chargez directement au lieu de passer par un iframe, correct ?
0 votes
Oui, galleria fonctionne parfaitement lorsque nous l'utilisons directement dans une page normale.
0 votes
Duplicata possible de Callback Javascript lorsque le chargement de l'IFRAME est terminé ?