এটিই আমাদের ক্লায়েন্টের সাথে আমি সঠিক সমস্যাটি পেয়েছিলাম। আমি একটি সামান্য jquery প্লাগইন তৈরি করেছি যা মনে হয় iframe প্রস্তুতি জন্য কাজ করে। এটি আইফ্রেমে প্রকৃতপক্ষে "প্রস্তুত" আছে কিনা তা নিশ্চিত করার জন্য আইফ্রেমে উত্সের সাথে মিলিত অভ্যন্তরীণ দলিল url এর সাথে মিলিত iframe নথি রেডিস্টেট পরীক্ষা করতে পোলিং ব্যবহার করে।
"অনলোড" সহ সমস্যাটি হ'ল আপনার যদি ডিওএম-তে যুক্ত হয়ে আসল আইফ্রেমে অ্যাক্সেসের প্রয়োজন হয় তবে যদি আপনি তা না করেন তবে আপনার যদি আইফ্রেমে লোডটি ক্যাশে করা হয় তবে তা ধরতে চেষ্টা করতে হবে তবে তা আপনি নাও করতে পারেন। আমার যা দরকার তা হ'ল একটি স্ক্রিপ্ট যা যেকোনো সময় বলা যেতে পারে এবং iframe "প্রস্তুত" ছিল কি না তা নির্ধারণ করে।
এখানে প্রশ্ন:
স্থানীয় iframe লোড হয়েছে কিনা তা নির্ধারণের জন্য পবিত্র গ্রেইল
এবং এখানে jsfiddle আমি অবশেষে সামনে এসেছি।
https://jsfiddle.net/q0smjkh5/10/
উপরে আমি ডোম একটি আইফ্রেম সংযোজন করতে লোড থাকলে জন্য অপেক্ষা করছি, তারপর আইফ্রেম পরীক্ষণ jsfiddle সালে ভেতরের দস্তাবেজের প্রস্তুত রাষ্ট্র নেই - যা ক্রস ডোমেইন হওয়া উচিত, কারণ এটি উইকিপিডিয়ার প্রতি ইঙ্গিত করা হয়েছে - কিন্তু Chrome "সম্পূর্ণ" রিপোর্ট বলে মনে হয়। প্লাগ-ইন এর আইরিডি পদ্ধতিটি যখন আইফ্রেমে আসলে প্রস্তুত থাকে তখন ডাকা হয় called কলব্যাক আবার অভ্যন্তরীণ ডকুমেন্টের প্রস্তুত অবস্থা যাচাই করার চেষ্টা করে - এবার ক্রস ডোমেন অনুরোধের রিপোর্ট করা (যা সঠিক) - যাইহোক এটি আমার প্রয়োজনের জন্য কাজ করছে বলে মনে হয় এবং আশা করি এটি অন্যকে সহায়তা করে।
<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>