Müşterimizle karşılaştığım sorun buydu. Iframe hazırlığı için işe yarayan küçük bir jquery eklentisi oluşturdum. İframe'in aslında "hazır" olduğundan emin olmak için iframe belgesinin readyState dokümanını iç çerçeve url'si ile birlikte iframe kaynağıyla birlikte kontrol etmek için yoklama kullanır.
"Onload" ile ilgili sorun, DOM'a eklenen gerçek iframe'e erişmeniz gerektiğidir, eğer yoksa, önbelleğe alınırsa iframe'in yüklenemeyeceği iframe yüklemesini yakalamaya çalışmanız gerekir. Ne gerek her zaman çağrılabilir bir komut dosyası ve iframe "hazır" olup olmadığını belirlemek oldu.
İşte soru:
Yerel iframe'in yüklü olup olmadığını belirlemek için kutsal kâse
ve işte sonunda bulduğum jsfiddle.
https://jsfiddle.net/q0smjkh5/10/
Yukarıdaki jsfiddle'da, dom'a bir iframe eklemek için onload'u bekliyorum, sonra iframe'in iç belgesinin hazır durumunu kontrol ediyorum - wikipedia'ya işaret ettiği için alanlar arası olmalı - ancak Chrome "tamamlandı" gibi görünüyor. Daha sonra, iframe aslında hazır olduğunda eklentinin akıllı yöntemi çağrılır. Geri arama, iç belgenin hazır durumunu tekrar kontrol etmeye çalışır - bu sefer bir alanlar arası istek (bu doğru) bildirir - yine de ihtiyacım olan şey için çalışıyor ve umarım başkalarına yardımcı olur.
<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>