यह सटीक मुद्दा था जिसे मैंने अपने ग्राहक के साथ चलाया था। मैंने थोड़ा jquery प्लगइन बनाया जो iframe तत्परता के लिए काम करता है। यह iframe दस्तावेज़ के साथ संयुक्त iframe दस्तावेज़ तैयार करने के लिए मतदान का उपयोग करता है, यह सुनिश्चित करने के लिए iframe स्रोत के साथ संयुक्त आंतरिक दस्तावेज़ url कि वास्तव में iframe "तैयार" है।
"Onload" के साथ समस्या यह है कि आपको DOM में जोड़े जा रहे वास्तविक iframe तक पहुंच की आवश्यकता है, यदि आपको नहीं है तो आपको iframe लोडिंग को पकड़ने की कोशिश करने की आवश्यकता है जो यदि यह कैश किया गया है तो आप नहीं कर सकते। मुझे जिस चीज की आवश्यकता थी वह एक ऐसी स्क्रिप्ट थी जिसे कभी भी बुलाया जा सकता है, और यह निर्धारित किया जा सकता है कि आइफ्रेम "तैयार" था या नहीं।
यहाँ सवाल है:
स्थानीय आइफ्रेम ने लोड किया है या नहीं, यह निर्धारित करने के लिए पवित्र ग्रिल
और यहाँ jsfiddle मैं अंततः के साथ आया था।
https://jsfiddle.net/q0smjkh5/10/
ऊपर के jsfiddle में, मैं डोम पर एक iframe संलग्न करने के लिए onload का इंतजार कर रहा हूं, फिर iframe के आंतरिक दस्तावेज़ की तैयार स्थिति की जांच कर रहा हूं - जिसे क्रॉस डोमेन होना चाहिए क्योंकि यह विकिपीडिया को इंगित किया गया है - लेकिन Chrome को "पूर्ण" रिपोर्ट करना प्रतीत होता है। प्लग-इन की विडंबना विधि तब कहलाती है जब आईफ्रेम वास्तव में तैयार होता है। कॉलबैक आंतरिक दस्तावेज़ की तैयार स्थिति को फिर से जांचने की कोशिश करता है - इस बार एक क्रॉस डोमेन अनुरोध (जो सही है) की रिपोर्ट कर रहा है - वैसे भी यह मेरी ज़रूरत के लिए काम करता है और आशा करता है कि यह दूसरों की मदद करता है।
<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>