কৌণিক অ্যাপ্লিকেশনগুলিতে Iframe রিলোডগুলি পরিচালনা করা
আধুনিক ওয়েব ডেভেলপমেন্টে, আইফ্রেমের মাধ্যমে একটি কৌণিক প্রকল্পের ভিতরে পিএইচপি পৃষ্ঠার মতো বাহ্যিক অ্যাপ্লিকেশনগুলিকে এম্বেড করা একটি সাধারণ পদ্ধতি। যাইহোক, সেই আইফ্রেমের মধ্যে ইভেন্ট বা পৃষ্ঠা পুনরায় লোড করার চেষ্টা করার সময় এটি চ্যালেঞ্জের পরিচয় দেয়, বিশেষ করে যখন আপনার পিএইচপি প্রকল্পের কোডে অ্যাক্সেস না থাকে।
যখনই iframe বিষয়বস্তু রিফ্রেশ করা হয় তখন আপনার কৌণিক অ্যাপ্লিকেশনে একটি লোডিং স্পিনার প্রদর্শন করার প্রয়োজন হলে এরকম একটি চ্যালেঞ্জ দেখা দেয়। যেহেতু আপনি পিএইচপি কোড পরিবর্তন করতে পারবেন না, তাই আইফ্রেম সামগ্রীতে পুনরায় লোড বা পরিবর্তন সনাক্ত করা কঠিন হয়ে পড়ে। মূল বিষয় হল জাভাস্ক্রিপ্টের দিক থেকে আইফ্রেমে পরিবর্তনগুলি ট্র্যাক করার উপায় খুঁজে বের করা৷
অনেক বিকাশকারীরা ভাবছেন যে আইফ্রেমে একটি স্ক্রিপ্ট ইনজেক্ট করা সম্ভব কিনা যা HTTP অনুরোধ বা পুনরায় লোড করার মতো ইভেন্টগুলির জন্য শোনে, বিশেষ করে যদি আইফ্রেমটি এমন কোনও প্রকল্প থেকে নেওয়া হয় যেখানে কোডের উপর আপনার সরাসরি নিয়ন্ত্রণ নেই৷ এটি সম্ভাব্যভাবে আপনার কৌণিক অ্যাপ্লিকেশনে জাভাস্ক্রিপ্টের মাধ্যমে করা যেতে পারে।
এই নিবন্ধে, আমরা আইফ্রেমের মধ্যে একটি পিএইচপি পৃষ্ঠা কখন পুনরায় লোড হচ্ছে তা শনাক্ত করার সম্ভাব্য সমাধানগুলি অন্বেষণ করব এবং এই ধরনের পরিবর্তনগুলির প্রতিক্রিয়া হিসাবে আপনি কীভাবে একটি লোডিং স্পিনার প্রয়োগ করতে পারেন। যদিও আপনার পিএইচপি কোডে অ্যাক্সেস নেই, জাভাস্ক্রিপ্ট সৃজনশীল সমাধান দিতে পারে।
আদেশ | ব্যবহারের উদাহরণ |
---|---|
contentWindow | iframe এর উইন্ডো অবজেক্ট অ্যাক্সেস করে, আপনাকে প্যারেন্ট উইন্ডো থেকে iframe এর DOM-এ স্ক্রিপ্ট ম্যানিপুলেট বা ইনজেক্ট করার অনুমতি দেয়। উদাহরণ: const iframe = document.querySelector("iframe").contentWindow; |
addEventListener("load") | একটি ইভেন্ট লিসেনার নিবন্ধন করে যেটি আইফ্রেম লোড করা বা পুনরায় লোড করা শেষ হলে ফায়ার করে। iframe বিষয়বস্তু পরিবর্তিত হলে ট্র্যাক করার জন্য দরকারী। উদাহরণ: iframe.addEventListener("লোড", ফাংশন() {...}); |
postMessage | একটি iframe এবং এর মূল উইন্ডোর মধ্যে সুরক্ষিত যোগাযোগ সক্ষম করে, বার্তাগুলিকে সামনে এবং পিছনে পাঠানোর অনুমতি দেয়৷ উদাহরণ: parent.postMessage("iframeReloaded", "*"); |
XMLHttpRequest.prototype.open | নেটওয়ার্ক অনুরোধ করা হলে সনাক্ত করতে একটি XMLHttpRequest এর ডিফল্ট আচরণ ওভাররাইড করে। আইফ্রেমে যখনই একটি HTTP অনুরোধ ট্রিগার হয় তখন কাস্টম লজিক ইনজেক্ট করার জন্য সহায়ক। উদাহরণ: XMLHttpRequest.prototype.open = function() {...}; |
fetch | জাভাস্ক্রিপ্ট ফেচ এপিআই ইন্টারসেপ্ট করে, যখন একটি নেটওয়ার্ক অনুরোধ চলছে তখন একটি স্পিনার প্রদর্শন করতে HTTP অনুরোধ করার জন্য ব্যবহৃত হয়। উদাহরণ: window.fetch = function() {...}; |
createElement | DOM এ গতিশীলভাবে একটি নতুন HTML উপাদান তৈরি করে। এটি আইফ্রেমের নথিতে স্ক্রিপ্ট বা অন্যান্য উপাদান ইনজেক্ট করতে ব্যবহৃত হয়। উদাহরণ: 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 এর অ্যাক্সেস দ্বারা , আমরা গতিশীলভাবে iframe এর DOM-এ একটি স্ক্রিপ্ট উপাদান তৈরি এবং সন্নিবেশ করতে পারি। এই স্ক্রিপ্টটি আইফ্রেমের ভিতরে PHP পৃষ্ঠার দ্বারা শুরু করা যেকোনো HTTP অনুরোধ ট্র্যাক করে, উভয় ব্যবহার করে এবং . এখানে লক্ষ্য হল আইফ্রেমের মধ্যে নেটওয়ার্ক ক্রিয়াকলাপ নিরীক্ষণ করা এবং এই ধরনের কোনও কার্যকলাপ ঘটলে লোডিং স্পিনার প্রদর্শন করা। এই পদ্ধতিটি HTTP অনুরোধগুলি করার সঠিক মুহূর্তটি ট্র্যাক করে আরও দানাদার নিয়ন্ত্রণ অফার করে।
তৃতীয় পদ্ধতি লিভারেজ API, যা iframe এবং মূল কৌণিক অ্যাপ্লিকেশনের মধ্যে যোগাযোগের অনুমতি দেয়। এই ক্ষেত্রে, আইফ্রেম লোড করা শেষ হলেই অভিভাবককে একটি বার্তা পাঠায়। প্যারেন্ট উইন্ডো এই বার্তাগুলি শোনে এবং সেই অনুযায়ী স্পিনারকে দেখায় বা লুকিয়ে রাখে। পোস্টমেসেজ ব্যবহার করার সুবিধা হল যে এটি উইন্ডোজের মধ্যে তথ্য বিনিময় করার একটি নিরাপদ উপায়, এমনকি আপনার আইফ্রেমের অভ্যন্তরীণ কোডে অ্যাক্সেস না থাকলেও। এটি ক্রস-অরিজিন আইফ্রেমের জন্য আদর্শ যেখানে প্যারেন্ট এবং আইফ্রেম বিভিন্ন ডোমেন থেকে আসে।
এই সমাধানগুলির প্রতিটিরই তার শক্তি রয়েছে এবং পদ্ধতির পছন্দ নির্ভর করে আপনার প্রয়োজনীয় নিয়ন্ত্রণের স্তর এবং iframe এর আচরণের উপর। লোড ইভেন্ট লিসেনার সহজ কিন্তু শুধুমাত্র সম্পূর্ণ পুনরায় লোড সনাক্ত করার জন্য কাজ করে। আইফ্রেমে একটি স্ক্রিপ্ট ইনজেকশন করা তার কার্যকলাপের আরও বিশদ অন্তর্দৃষ্টি দেয় তবে স্ক্রিপ্ট সন্নিবেশের অনুমতি দেওয়ার জন্য iframe প্রয়োজন৷ অবশেষে, দ পদ্ধতি ক্রস-ডোমেন যোগাযোগ পরিচালনার জন্য একটি শক্তিশালী সমাধান এবং নির্দিষ্ট আইফ্রেম ইভেন্ট সম্পর্কে অভিভাবককে অবহিত করতে পারে। এই পদ্ধতিগুলি PHP কোডে সরাসরি অ্যাক্সেসের প্রয়োজন ছাড়াই iframe অবস্থার পরিবর্তনগুলি পরিচালনা করার নমনীয় উপায় প্রদান করে।
সমাধান 1: "লোড" ইভেন্ট ব্যবহার করে আইফ্রেম পুনরায় লোড নিরীক্ষণ করা
এই সমাধানটি আইফ্রেমের "লোড" ইভেন্ট শোনার জন্য জাভাস্ক্রিপ্ট ব্যবহার করে, আইফ্রেমটি কখন পুনরায় লোড করা হয় বা বিষয়বস্তু পরিবর্তন করা হয় তা সনাক্ত করে।
// 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: নেটওয়ার্ক অনুরোধ ট্র্যাক করার জন্য আইফ্রেমে জাভাস্ক্রিপ্ট ইনজেক্ট করা
এই পদ্ধতিটি আইফ্রেমে একটি স্ক্রিপ্ট ইনজেক্ট করে কোনো HTTP অনুরোধ বা পুনরায় লোড শনাক্ত করতে, যখন আপনাকে আইফ্রেমের মধ্যে থেকে ইন-পেজ পরিবর্তন বা পুনরায় লোডগুলি ট্র্যাক করতে হবে তখন দরকারী।
// 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);
কৌণিক আইফ্রেম পরিবর্তনগুলি নিরীক্ষণের জন্য উন্নত কৌশল
আইফ্রেমে পরিবর্তন সনাক্ত করার জন্য আরেকটি আকর্ষণীয় কৌশল হল ব্যবহার করে API এই API আপনাকে DOM ট্রিতে পরিবর্তনগুলি নিরীক্ষণ করতে দেয়, যেমন যখন নতুন নোড যোগ করা হয় বা সরানো হয়। পিএইচপি পৃষ্ঠাটি পুনরায় লোড হওয়ার সময় এটি আপনাকে সরাসরি সূচিত করবে না, এটি iframe-এর সামগ্রীতে পরিবর্তন সনাক্ত করতে সহায়তা করতে পারে। উদাহরণস্বরূপ, যদি আইফ্রেমের নির্দিষ্ট উপাদানগুলি পুনরায় লোড করার পরে প্রতিস্থাপিত বা আপডেট করা হয়, মিউটেশন অবজারভার সেই পরিবর্তনগুলি ধরতে পারে এবং সেই অনুযায়ী স্পিনারকে ট্রিগার করতে পারে।
উপরন্তু, সুবিধা ব্রাউজার ইভেন্ট মত বা আইফ্রেমটি কখন পুনরায় লোড হতে চলেছে তা সনাক্ত করতে সহায়তা করতে পারে। এই ইভেন্টগুলি যখন পৃষ্ঠাটি আনলোড করা হয় বা যখন বর্তমান পৃষ্ঠা থেকে দূরে একটি নেভিগেশন শুরু হয় তখন ফায়ার হয়৷ iframe-এর ভিতরে এই ইভেন্টগুলিতে ইভেন্ট শ্রোতাদের যোগ করার মাধ্যমে, আপনি সঠিক সময়ে স্পিনার দেখানো হয়েছে তা নিশ্চিত করে, একটি পুনরায় লোড হতে চলেছে বলে অভিভাবক উইন্ডোকে অবহিত করতে পারেন। এই পদ্ধতিটি সর্বোত্তম কাজ করে যখন অন্যান্য পদ্ধতির সাথে মিলিত হয়, একটি ব্যাপক সমাধান প্রদান করে।
পরিশেষে, আপনি পরিবর্তনগুলি পরীক্ষা করার জন্য একটি পদ্ধতি হিসাবে iframe পোলিং ব্যবহার করার কথা বিবেচনা করতে পারেন। এই পদ্ধতিতে, প্যারেন্ট অ্যাঙ্গুলার অ্যাপটি পর্যায়ক্রমে চেক করে URL বা আইফ্রেমের মধ্যে অন্যান্য নির্দিষ্ট উপাদানগুলি নির্ধারণ করতে বিষয়বস্তু পরিবর্তিত হয়েছে বা পুনরায় লোড হয়েছে কিনা। যদিও এই পদ্ধতিটি কম দক্ষ হতে পারে, বিশেষ করে কর্মক্ষমতার ক্ষেত্রে, এটি একটি ফলব্যাক বিকল্প যখন অন্যান্য পদ্ধতিগুলি সম্ভব নয়। নেতিবাচক দিক হল যে পোলিং সমস্ত ইন-পেজ পরিবর্তনগুলি সনাক্ত করতে পারে না তবে নির্দিষ্ট পরিস্থিতিগুলির জন্য এখনও কার্যকর হতে পারে।
- আমি কিভাবে একটি iframe পুনরায় লোড সনাক্ত করতে পারি?
- আপনি ব্যবহার করতে পারেন একটি iframe পুনরায় লোড বা এর বিষয়বস্তু পরিবর্তন হলে সনাক্ত করতে ইভেন্ট।
- আইফ্রেমে নেটওয়ার্ক অনুরোধগুলি নিরীক্ষণ করা কি সম্ভব?
- হ্যাঁ, iframe-এ একটি স্ক্রিপ্ট ইনজেক্ট করে, আপনি ওভাররাইড করতে পারেন এবং HTTP অনুরোধ ট্র্যাক করার পদ্ধতি।
- আমি কি আইফ্রেম এবং প্যারেন্ট উইন্ডোর মধ্যে যোগাযোগ করতে পোস্টমেসেজ ব্যবহার করতে পারি?
- হ্যাঁ, দ API আইফ্রেম এবং এর মূল উইন্ডোর মধ্যে নিরাপদ যোগাযোগের অনুমতি দেয়, তাদের মধ্যে বার্তা পাস করতে সক্ষম করে।
- যদি আমি আইফ্রেমে জাভাস্ক্রিপ্ট ইনজেক্ট করতে না পারি?
- আপনার যদি জাভাস্ক্রিপ্ট ইনজেক্ট করার অ্যাক্সেস না থাকে, ব্যবহার করে API বা আইফ্রেমের মধ্যে থেকে পদ্ধতি (যদি এটি সমর্থন করে) সম্ভাব্য বিকল্প।
- কিভাবে MutationObserver iframe পরিবর্তন সনাক্ত করতে সাহায্য করে?
- দ API DOM-এ পরিবর্তনগুলি নিরীক্ষণ করে, যা আপনাকে সতর্ক করতে পারে যখন আইফ্রেমের মধ্যে উপাদানগুলি পুনরায় লোড করার পরে পরিবর্তিত হয়।
অন্তর্নিহিত PHP কোডে সরাসরি অ্যাক্সেস ছাড়াই আইফ্রেম পুনরায় লোড পর্যবেক্ষণ করা সৃজনশীল জাভাস্ক্রিপ্ট সমাধানের মাধ্যমে অর্জন করা যেতে পারে। ইভেন্ট শ্রোতা, ইনজেক্টেড স্ক্রিপ্ট বা পোস্টমেসেজ API ব্যবহার করা হোক না কেন, ডেভেলপারদের কাছে তাদের কৌণিক অ্যাপ্লিকেশনগুলি প্রতিক্রিয়াশীল থাকা নিশ্চিত করার জন্য বিকল্প রয়েছে।
প্রতিটি পদ্ধতির তার শক্তি আছে, প্রকল্পের জটিলতা এবং iframe-এর উপর নিয়ন্ত্রণের উপর নির্ভর করে। আপনার নির্দিষ্ট ক্ষেত্রে সর্বোত্তম সমাধান ব্যবহার করে, আপনি iframe বিষয়বস্তু পরিবর্তনের সময় নির্ভরযোগ্য স্পিনার বিজ্ঞপ্তিগুলির মাধ্যমে একটি ভাল ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে পারেন।
- আইফ্রেম ইভেন্ট এবং ক্রস-অরিজিন কমিউনিকেশন পর্যবেক্ষণের বিস্তারিত ডকুমেন্টেশন এখানে পাওয়া যাবে MDN ওয়েব ডক্স - postMessage API .
- DOM পরিবর্তনের জন্য MutationObserver ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, পড়ুন MDN ওয়েব ডক্স - মিউটেশন অবজারভার .
- আইফ্রেমে জাভাস্ক্রিপ্ট ইনজেক্ট করার কৌশলগুলি অন্বেষণ করতে, এই সংস্থানটি দেখুন StackOverflow - iframe এ জাভাস্ক্রিপ্ট ইনজেক্ট করুন .