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.
<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>