کونیی ایپلی کیشنز میں Iframe دوبارہ لوڈز کو ہینڈل کرنا
جدید ویب ڈویلپمنٹ میں، بیرونی ایپلی کیشنز جیسے پی ایچ پی پیج کو انگولر پروجیکٹ کے اندر ایک iframe کے ذریعے سرایت کرنا ایک عام طریقہ ہے۔ تاہم، اس iframe کے اندر واقعات یا صفحہ کو دوبارہ لوڈ کرنے کی کوشش کرتے وقت یہ چیلنجز پیش کرتا ہے، خاص طور پر جب آپ کو PHP پروجیکٹ کے کوڈ تک رسائی حاصل نہ ہو۔
ایسا ہی ایک چیلنج اس وقت پیدا ہوتا ہے جب آپ کو اپنی انگولر ایپلیکیشن میں لوڈنگ اسپنر ڈسپلے کرنے کی ضرورت ہوتی ہے جب بھی iframe کا مواد ریفریش ہوتا ہے۔ چونکہ آپ PHP کوڈ میں ترمیم نہیں کر سکتے، اس لیے iframe کے مواد میں دوبارہ لوڈز یا تبدیلیوں کا پتہ لگانا مشکل ہو جاتا ہے۔ کلیدی جاوا اسکرپٹ کی طرف سے iframe میں تبدیلیوں کو ٹریک کرنے کا طریقہ تلاش کرنا ہے۔
بہت سے ڈویلپر سوچتے ہیں کہ کیا iframe میں اسکرپٹ کا انجیکشن لگانا ممکن ہے جو HTTP درخواستوں یا دوبارہ لوڈ جیسے واقعات کو سنتا ہے، خاص طور پر اگر iframe کسی ایسے پروجیکٹ سے حاصل کیا گیا ہو جہاں آپ کو کوڈ پر براہ راست کنٹرول نہ ہو۔ یہ ممکنہ طور پر آپ کی انگولر ایپلیکیشن میں جاوا اسکرپٹ کے ذریعے کیا جا سکتا ہے۔
اس آرٹیکل میں، ہم یہ معلوم کرنے کے ممکنہ حل تلاش کریں گے کہ آئی فریم کے اندر پی ایچ پی کا صفحہ کب دوبارہ لوڈ ہو رہا ہے، اور آپ اس طرح کی تبدیلیوں کے جواب میں لوڈنگ اسپنر کو کیسے نافذ کر سکتے ہیں۔ اگرچہ آپ کو خود پی ایچ پی کوڈ تک رسائی نہیں ہے، جاوا اسکرپٹ تخلیقی حل پیش کر سکتا ہے۔
حکم | استعمال کی مثال |
---|---|
contentWindow | iframe کے ونڈو آبجیکٹ تک رسائی حاصل کرتا ہے، آپ کو پیرنٹ ونڈو سے iframe کے DOM میں اسکرپٹس کو جوڑ توڑ یا انجیکشن کرنے کی اجازت دیتا ہے۔ مثال: const iframe = document.querySelector("iframe").contentWindow؛ |
addEventListener("load") | ایک ایونٹ سننے والے کو رجسٹر کرتا ہے جو اس وقت فائر ہوتا ہے جب iframe لوڈنگ یا دوبارہ لوڈنگ مکمل کر لیتا ہے۔ iframe کا مواد تبدیل ہونے پر ٹریکنگ کے لیے مفید ہے۔ مثال: iframe.addEventListener("load", function() {...}); |
postMessage | ایک iframe اور اس کی پیرنٹ ونڈو کے درمیان محفوظ مواصلت کو قابل بناتا ہے، پیغامات کو آگے پیچھے کرنے کی اجازت دیتا ہے۔ مثال: parent.postMessage("iframeReloaded", "*"); |
XMLHttpRequest.prototype.open | نیٹ ورک کی درخواستوں کا پتہ لگانے کے لیے XMLHttpRequest کے پہلے سے طے شدہ رویے کو اوور رائیڈ کرتا ہے۔ جب بھی iframe میں HTTP درخواست کو متحرک کیا جاتا ہے تو حسب ضرورت منطق کو انجیکشن کرنے میں مددگار۔ مثال: XMLHttpRequest.prototype.open = function() {...}; |
fetch | JavaScript Fetch API کو روکتا ہے، جو HTTP درخواستیں کرنے کے لیے استعمال ہوتا ہے، جب نیٹ ورک کی درخواست جاری ہوتی ہے تو اسپنر کو ظاہر کرنے کے لیے۔ مثال: window.fetch = function() {...}; |
createElement | DOM میں متحرک طور پر ایک نیا HTML عنصر بناتا ہے۔ اس کا استعمال اسکرپٹس یا دیگر عناصر کو iframe کی دستاویز میں داخل کرنے کے لیے کیا جاتا ہے۔ مثال: const script = iframe.document.createElement('script'); |
appendChild | iframe کے DOM ٹری میں ایک نیا نوڈ (جیسے اسکرپٹ یا div) شامل کرتا ہے، جس سے iframe میں JavaScript کے انجیکشن کی اجازت ہوتی ہے۔ مثال: iframe.document.body.appendChild(script); |
window.onload | iframe کا صفحہ مکمل طور پر لوڈ ہونے کے بعد ایک فنکشن کو انجام دیتا ہے، جب iframe دوبارہ لوڈ مکمل کرتا ہے تو اطلاعات کو فعال کرتا ہے۔ مثال: window.onload = function() {...}; |
style.display | ان کی CSS ڈسپلے پراپرٹی کو تبدیل کرکے HTML عناصر (جیسے اسپنرز) کی مرئیت کو جوڑتا ہے۔ صفحہ لوڈ ہونے کے دوران اسپنر کی مرئیت کو ٹوگل کرنے کے لیے مفید ہے۔ مثال: document.getElementById("spinner").style.display = "بلاک"؛ |
کونیی میں Iframe دوبارہ لوڈز کا پتہ لگانے کے لئے حل تلاش کرنا
پہلے اسکرپٹ میں، کلیدی خیال یہ ہے کہ سننا ہے۔ لوڈ iframe کا واقعہ۔ جب بھی iframe کا مواد تبدیل ہوتا ہے یا دوبارہ لوڈ ہوتا ہے تو لوڈ ایونٹ کو متحرک کیا جاتا ہے۔ اس ایونٹ کو استعمال کرتے ہوئے، ہم پتہ لگا سکتے ہیں کہ iframe کے اندر PHP کا صفحہ کب ریفریش ہوتا ہے۔ ابتدائی طور پر، لوڈنگ اسپنر فنکشن کو کال کرکے دکھایا جاتا ہے۔ شو اسپنر. ایک بار جب iframe کا مواد مکمل طور پر لوڈ ہو جاتا ہے، اسپنر کو چھپائیں فنکشن کو اسپنر کو چھپانے کے لیے کہا جاتا ہے۔ یہ طریقہ کافی کارآمد ہے کیونکہ اسے پی ایچ پی کوڈ تک رسائی کی ضرورت نہیں ہے، اور صرف iframe کی حالت پر انحصار کرتا ہے۔
دوسرا حل جاوا اسکرپٹ کو براہ راست iframe میں انجیکشن کرکے زیادہ جدید طریقہ اختیار کرتا ہے۔ iframe's تک رسائی حاصل کرکے مواد ونڈو، ہم متحرک طور پر iframe کے DOM میں اسکرپٹ عنصر کو تخلیق اور داخل کر سکتے ہیں۔ یہ اسکرپٹ آئیفریم کے اندر پی ایچ پی صفحہ کے ذریعے شروع کی گئی کسی بھی HTTP درخواستوں کو ٹریک کرتا ہے، دونوں کا استعمال کرتے ہوئے XMLHttpRequest اور API بازیافت کریں۔. یہاں کا مقصد iframe کے اندر نیٹ ورک کی سرگرمی کی نگرانی کرنا اور اس طرح کی کوئی سرگرمی ہونے پر لوڈنگ اسپنر کو ڈسپلے کرنا ہے۔ یہ نقطہ نظر HTTP درخواستوں کے عین مطابق لمحے کا سراغ لگا کر مزید دانے دار کنٹرول پیش کرتا ہے۔
تیسرا طریقہ فائدہ اٹھاتا ہے۔ پوسٹ پیغام API، جو iframe اور پیرنٹ Angular ایپلیکیشن کے درمیان مواصلت کی اجازت دیتا ہے۔ اس صورت میں، iframe جب بھی لوڈنگ مکمل کرتا ہے تو والدین کو پیغام بھیجتا ہے۔ پیرنٹ ونڈو ان پیغامات کو سنتا ہے اور اس کے مطابق اسپنر کو دکھاتا یا چھپاتا ہے۔ پوسٹ میسج استعمال کرنے کا فائدہ یہ ہے کہ یہ ونڈوز کے درمیان معلومات کے تبادلے کا ایک محفوظ طریقہ ہے، یہاں تک کہ جب آپ کو iframe کے اندرونی کوڈ تک رسائی حاصل نہ ہو۔ یہ کراس اوریجن iframes کے لیے مثالی ہے جہاں والدین اور iframe مختلف ڈومینز سے آتے ہیں۔
ان حلوں میں سے ہر ایک کی اپنی طاقتیں ہیں، اور طریقہ کا انتخاب آپ کے کنٹرول کی سطح اور iframe کے رویے پر منحصر ہے۔ لوڈ ایونٹ سننے والا آسان ہے لیکن صرف مکمل دوبارہ لوڈ کا پتہ لگانے کے لیے کام کرتا ہے۔ اسکرپٹ کو iframe میں داخل کرنے سے اس کی سرگرمی میں مزید تفصیلی بصیرت ملتی ہے لیکن اس کے لیے iframe کو اسکرپٹ داخل کرنے کی اجازت دینے کی ضرورت ہوتی ہے۔ آخر میں، پوسٹ پیغام کراس ڈومین کمیونیکیشن کو سنبھالنے کا طریقہ ایک مضبوط حل ہے اور والدین کو مخصوص iframe واقعات کے بارے میں مطلع کر سکتا ہے۔ یہ طریقے PHP کوڈ تک براہ راست رسائی کی ضرورت کے بغیر iframe ریاست کی تبدیلیوں کو سنبھالنے کے لچکدار طریقے فراہم کرتے ہیں۔
حل 1: "لوڈ" ایونٹ کا استعمال کرتے ہوئے iframe دوبارہ لوڈ کی نگرانی کرنا
یہ حل iframe کے "لوڈ" ایونٹ کو سننے کے لیے JavaScript کا استعمال کرتا ہے، یہ پتہ لگاتا ہے کہ کب iframe دوبارہ لوڈ ہوتا ہے یا مواد تبدیل ہوتا ہے۔
// Select the iframe element by its ID or query selector
const iframe = document.getElementById("myIframe");
// Function to display the spinner
function showSpinner() {
document.getElementById("spinner").style.display = "block";
}
// Function to hide the spinner
function hideSpinner() {
document.getElementById("spinner").style.display = "none";
}
// Add event listener for the iframe's load event
iframe.addEventListener("load", function() {
hideSpinner();
});
// Display the spinner initially before iframe reload completes
showSpinner();
// HTML: Loading spinner (CSS or image-based)
<div id="spinner" style="display: none;">Loading...</div>
حل 2: نیٹ ورک کی درخواستوں کو ٹریک کرنے کے لیے iframe میں JavaScript کا انجیکشن لگانا
یہ طریقہ کسی بھی HTTP درخواستوں یا دوبارہ لوڈز کا پتہ لگانے کے لیے iframe میں ایک اسکرپٹ داخل کرتا ہے، جب آپ کو صفحہ میں ہونے والی تبدیلیوں یا iframe کے اندر سے دوبارہ لوڈز کو ٹریک کرنے کی ضرورت ہوتی ہے تو مفید ہے۔
// Access the iframe's content window
const iframe = document.querySelector("iframe").contentWindow;
// Create a script to inject into the iframe
const script = iframe.document.createElement('script');
// JavaScript to track network requests
script.textContent = `
(function() {
const oldFetch = window.fetch;
window.fetch = function() {
document.querySelector('#spinner').style.display = 'block';
return oldFetch.apply(this, arguments);
};
const oldXHR = window.XMLHttpRequest;
XMLHttpRequest.prototype.open = function() {
document.querySelector('#spinner').style.display = 'block';
oldXHR.open.apply(this, arguments);
};
})();`;
// Append the script to the iframe's document
iframe.document.body.appendChild(script);
حل 3: iframe اور والدین کے درمیان بات چیت کرنے کے لیے postMessage کا استعمال
یہ نقطہ نظر iframe اور پیرنٹ ونڈو کے درمیان بات چیت کرنے کے لیے "postMessage" API کا استعمال کرتا ہے، والدین کو iframe میں کسی بھی دوبارہ لوڈ یا تبدیلی کی اطلاع دیتا ہے۔
// Parent script (Angular application)
const iframe = document.querySelector("iframe");
// Listen for messages from the iframe
window.addEventListener("message", function(event) {
if (event.data === "iframeReloaded") {
document.getElementById("spinner").style.display = "none";
}
});
// Iframe script to post a message on reload
const iframeScript = document.createElement('script');
iframeScript.textContent = `
window.onload = function() {
parent.postMessage("iframeReloaded", "*");
};`;
// Inject the script into the iframe
iframe.contentWindow.document.body.appendChild(iframeScript);
کونیی میں Iframe تبدیلیوں کی نگرانی کے لیے جدید تکنیک
iframe میں تبدیلیوں کا پتہ لگانے کے لئے ایک اور دلچسپ تکنیک کا استعمال کرنا ہے۔ میوٹیشن آبزرور API یہ API آپ کو DOM درخت میں ہونے والی تبدیلیوں کی نگرانی کرنے کی اجازت دیتا ہے، جیسے کہ جب نئے نوڈس کو شامل یا ہٹایا جاتا ہے۔ اگرچہ یہ پی ایچ پی صفحہ کے دوبارہ لوڈ ہونے پر آپ کو براہ راست مطلع نہیں کرے گا، لیکن یہ iframe کے مواد میں تبدیلیوں کا پتہ لگانے میں مدد کر سکتا ہے۔ مثال کے طور پر، اگر iframe میں کچھ عناصر کو دوبارہ لوڈ کرنے کے بعد تبدیل یا اپ ڈیٹ کیا جاتا ہے، میوٹیشن آبزرور ان تبدیلیوں کو پکڑ سکتا ہے اور اس کے مطابق اسپنر کو متحرک کرسکتا ہے۔
مزید برآں، براؤزر کے واقعات کا فائدہ اٹھانا جیسے لوڈ کرنے سے پہلے یا ان لوڈ یہ پتہ لگانے میں مدد کر سکتا ہے کہ iframe کب دوبارہ لوڈ ہونے والا ہے۔ یہ واقعات اس وقت فائر ہوتے ہیں جب صفحہ اتارا جا رہا ہوتا ہے یا جب موجودہ صفحہ سے دور نیویگیشن شروع کی جاتی ہے۔ iframe کے اندر ان ایونٹس میں ایونٹ سننے والوں کو شامل کرکے، آپ پیرنٹ ونڈو کو مطلع کر سکتے ہیں کہ دوبارہ لوڈ ہونے والا ہے، اس بات کو یقینی بناتے ہوئے کہ اسپنر صحیح وقت پر دکھایا گیا ہے۔ یہ طریقہ بہترین کام کرتا ہے جب دوسرے طریقوں کے ساتھ مل کر ایک جامع حل فراہم کرتا ہے۔
آخر میں، آپ تبدیلیوں کو چیک کرنے کے لیے iframe پولنگ کو بطور طریقہ استعمال کرنے پر غور کر سکتے ہیں۔ اس طریقے میں، پیرنٹ اینگولر ایپ وقتاً فوقتاً چیک کرتی ہے۔ iframe URL یا iframe کے اندر دیگر مخصوص عناصر کا تعین کرنے کے لیے کہ آیا مواد تبدیل ہوا ہے یا دوبارہ لوڈ ہوا ہے۔ اگرچہ یہ نقطہ نظر کم کارگر ہو سکتا ہے، خاص طور پر کارکردگی کے لحاظ سے، جب دوسرے طریقے قابل عمل نہ ہوں تو یہ فال بیک آپشن ہے۔ منفی پہلو یہ ہے کہ پولنگ صفحہ میں ہونے والی تمام تبدیلیوں کا پتہ نہیں لگا سکتی لیکن پھر بھی مخصوص منظرناموں کے لیے مفید ہو سکتی ہے۔
Iframe Reloads کی نگرانی کے بارے میں اکثر پوچھے گئے سوالات
- میں iframe دوبارہ لوڈ کا پتہ کیسے لگا سکتا ہوں؟
- آپ استعمال کر سکتے ہیں addEventListener("load") ایک iframe دوبارہ لوڈ ہونے یا اس کا مواد تبدیل ہونے پر پتہ لگانے کے لیے ایونٹ۔
- کیا iframe میں نیٹ ورک کی درخواستوں کی نگرانی کرنا ممکن ہے؟
- ہاں، iframe میں اسکرپٹ کو انجیکشن لگا کر، آپ اوور رائڈ کر سکتے ہیں۔ fetch اور XMLHttpRequest.prototype.open HTTP درخواستوں کو ٹریک کرنے کے طریقے۔
- کیا میں iframe اور پیرنٹ ونڈو کے درمیان بات چیت کرنے کے لیے postMessage استعمال کر سکتا ہوں؟
- جی ہاں، postMessage API iframe اور اس کی پیرنٹ ونڈو کے درمیان محفوظ مواصلت کی اجازت دیتا ہے، ان کے درمیان پیغام کو منتقل کرنے کو فعال کرتا ہے۔
- اگر میں iframe میں JavaScript انجیکشن نہیں کر سکتا تو کیا ہوگا؟
- اگر آپ کے پاس جاوا اسکرپٹ کو انجیکشن تک رسائی نہیں ہے تو، کا استعمال کرتے ہوئے MutationObserver API یا postMessage iframe کے اندر سے طریقہ (اگر یہ اس کی حمایت کرتا ہے) ممکنہ متبادل ہیں۔
- MutationObserver iframe تبدیلیوں کا پتہ لگانے میں کس طرح مدد کرتا ہے؟
- دی MutationObserver API DOM میں تبدیلیوں کی نگرانی کرتا ہے، جو آپ کو الرٹ کر سکتا ہے جب iframe کے اندر عناصر دوبارہ لوڈ کرنے کے بعد تبدیل ہوتے ہیں۔
کونیی میں Iframe دوبارہ لوڈز کی نگرانی کے بارے میں حتمی خیالات
بنیادی پی ایچ پی کوڈ تک براہ راست رسائی کے بغیر iframe دوبارہ لوڈ کی نگرانی تخلیقی JavaScript حل کے ساتھ حاصل کی جا سکتی ہے۔ چاہے ایونٹ سننے والوں، انجیکشن شدہ اسکرپٹس، یا پوسٹ میسج API کا استعمال کر رہے ہوں، ڈویلپرز کے پاس یہ یقینی بنانے کے لیے اختیارات ہوتے ہیں کہ ان کی انگولر ایپلی کیشنز ریسپانسیو رہیں۔
منصوبے کی پیچیدگی اور iframe پر کنٹرول کے لحاظ سے ہر نقطہ نظر کی اپنی طاقت ہوتی ہے۔ اپنے مخصوص کیس کے لیے بہترین حل کو استعمال کرتے ہوئے، آپ iframe مواد کی تبدیلیوں کے دوران قابل اعتماد اسپنر اطلاعات کے ذریعے صارف کا بہتر تجربہ فراہم کر سکتے ہیں۔
حوالہ جات اور بیرونی وسائل
- iframe واقعات کی نگرانی اور کراس اوریجن کمیونیکیشن کے بارے میں تفصیلی دستاویزات پر مل سکتی ہیں۔ MDN Web Docs - postMessage API .
- DOM تبدیلیوں کے لیے MutationObserver استعمال کرنے کے بارے میں مزید معلومات کے لیے، رجوع کریں۔ MDN Web Docs - MutationObserver .
- iframes میں JavaScript کو انجیکشن لگانے کی تکنیکوں کو دریافت کرنے کے لیے، اس وسیلہ کو آن دیکھیں StackOverflow - iframe میں JavaScript کو انجیکشن کریں۔ .