jQuery কী, এবং কেন বলা হয় এটি ভুলে ফেলার মতো?
jQuery জাভাস্ক্রিপ্টকে DOM, ইভেন্ট ও AJAX সহজ করে তুলেছিল। জানুন এটা কী, কেন এর ব্যবহার কমেছে, এবং আজও কখন এটি ব্যবহার করা যুক্তিযুক্ত।

jQuery এক নজরে
jQuery একটি ছোট JavaScript লাইব্রেরি যা ওয়েব পেজে সাধারণ কাজগুলোকে সহজ করে—উদাহরণস্বরূপ উপাদান নির্বাচন, ক্লিক‑রেসপন্স, টেক্সট পরিবর্তন, পেজের অংশ দেখানো/লুকানো এবং সার্ভারে অনুরোধ পাঠানো।
আপনি যদি কখনো $("button").click(...) ধরনের কোড দেখেন, সেটা jQuery। $ কেবলই একটি শর্টকাট যা “পেজে কিছু খুঁজো এবং সেটার সাথে কিছু কর” বোঝায়।
এই আর্টিকেলে কী থাকবে
এই গাইডটি ব্যবহারিক এবং অ-টেকনিক্যাল: jQuery কী, কেন এটি জনপ্রিয় হয়েছিল, কেন নতুন প্রজেক্টগুলো এখন কম ব্যবহার করে, এবং যদি আপনার সাইট এখনো এটি ব্যবহার করে তাহলে কিভাবে মোকাবিলা করবেন। এটি意ভাবে লম্বা করা হয়েছে যাতে আমরা দ্রুত মতামতের পরিবর্তে স্পষ্ট উদাহরণ ও বাস্তব‑জগৎ নির্দেশনা দিতে পারি।
“ভুলে ফেলা” বলতে মানুষ সাধারণত কী বোঝায়
মানুষ যখন বলে jQuery “ভুলে ফেলা” হয়েছে, তারা সাধারণত বলতে চায়:
- নতুন প্রজেক্টগুলোতে এটি কম ব্যবহার হচ্ছে, কারণ আধুনিক ব্রাউজারগুলো অনেক ফিচার এখন নেটিভভাবে সাপোর্ট করে যা আগে jQuery दिया করত।
- তবে পুরনো সাইটগুলিতে এটি এখনও সাধারণ (আর কিছু প্লাগইন, থিম এবং অ্যাডমিন প্যানেলেও) কারণ এটি কাজ করে, পরিচিত এবং প্রতিস্থাপন করতে সময় লাগে।
তাই গল্পটা “jQuery মৃত” নয়। বরং: jQuery ডিফল্ট ফ্রন্ট‑এন্ড টুল থেকে চলে এসেছে লিগ্যাসি নির্ভরশীলতায়—যা আপনি উত্তরাধিকারসূত্রে পেতে পারেন এবং মাঝে মাঝে ইচ্ছাকৃতভাবে ব্যবহারও করেন।
কেন jQuery এত গুরুত্বপূর্ণ ছিল
jQuery আসার আগে, ফ্রন্ট‑এন্ড কাজ মানে প্রায়ই একই ছোট, বিরক্তিকর কোড বারবার লেখা—তারপর কয়েকটি ব্রাউজারে টেস্ট করে দেখা যে আচরণ আলাদা। এমনকি সাধারণ লক্ষ্যগুলো যেমন “এলিমেন্ট খুঁজে পাও”, “ক্লিক হ্যান্ডলার লাগাও” বা “অনুরোধ পাঠাও”ও অনেক বিশেষ ক্ষেত্রে পরিণত হতে পারে।
jQuery ও আগের বেলার ফ্রন্ট‑এন্ড
অনেক প্রারম্ভিক JavaScript বাস্তবে ফিচার তৈরির চেয়ে পরিবেশের সাথে লড়াই করার মতো ছিল। আপনি এমন কোড লিখতেন যা একটি ব্রাউজারে কাজ করত, তারপর অন্য ব্রাউজারে কাজ করানোর জন্য অতিরিক্ত শাখা যোগ করতেন। টিমগুলো তাদের নিজস্ব ছোট “হেল্পার লাইব্রেরি” রাখত দিন‑প্রতি UI পরিবর্তন সামলাতে।
ফলে: ডেভেলপমেন্ট ধীর, বাগ বেশি, এবং ছোট পরিবর্তনেও ভয় থাকত যে পুরনো কোনো ব্রাউজার ভেঙে যাবে যেটির ওপর আপনার ব্যবহারকারীরা নির্ভর করে।
ব্রাউজারের পার্থক্য কেন গুরুত্বপূর্ণ ছিল
ব্রাউজারগুলো গুরুত্বপূর্ণ বিবরণে একমত ছিল না। DOM সিলেকশন মেথড, ইভেন্ট হ্যান্ডলিং, এমনকি এলিমেন্ট সাইজ জানা—এসব আলাদা হতে পারে। বিশেষ করে Internet Explorer‑এর ইভেন্ট ও XMLHTTP অনুরোধের API আলাদা ছিল, ফলে “স্ট্যান্ডার্ড” কোড সবসময় পোর্টেবল ছিল না।
এটি গুরুত্বপূর্ণ ছিল কারণ ওয়েবসাইটগুলো একটুখানি ব্রাউজারের জন্য নয় বানানো হত। যদি আপনার চেকআউট ফর্ম, নেভিগেশন মেনু, বা মোডাল ডায়ালগ কোনো জনপ্রিয় ব্রাউজারে ব্যর্থ হয়, সেটা ব্যবসায়িক সমস্যা তৈরি করত।
দৈনন্দিন কাজগুলোতে jQuery যে ফাঁকটা পূরণ করল
jQuery বড় কারণটি ছিল এটি একটি ধারাবাহিক, ব্যবহারকারী‑বান্ধব API দিলো যা সেই অসামঞ্জস্যগুলোকে মসৃণ করেছিল।
এটি সাধারণ কাজগুলো উল্লেখযোগ্যভাবে সহজ করে দিলো:
- CSS‑স্টাইল সিলেক্টর দিয়ে DOM উপাদান নির্বাচন ও পরিবর্তন
- ক্রস‑ব্রাউজারভাবে ইভেন্ট হ্যান্ডলিং
- টাইমার নিজে না করে এনিমেশন ও ইফেক্ট
- একটি একক, পূর্বাভাসযোগ্য ইন্টারফেস দিয়ে Ajax অনুরোধ
আরও গুরুত্বপূর্ণভাবে, jQuery‑র “কম লিখো, বেশি করো” স্টাইল টিমগুলোকে দ্রুত শিপ করতে সাহায্য করেছিল—বিশেষ করে সেই যুগে যখন আধুনিক DOM API‑গুলো এত সক্ষম বা ব্যাপকভাবে সাপোর্টেড ছিল না।
jQuery‑এর মূল কাজগুলো
jQuery‑এর আসল সুপারপাওয়ার ছিল নতুন কোনো ধারণা নয়— বরং সাধারণ ব্রাউজার কাজগুলোকে বিভিন্ন ব্রাউজারে ধারাবাহিক ও সহজ করে তোলা। পুরনো ফ্রন্ট‑এন্ড কোডে সাধারণত jQuery চারটি দৈনন্দিন কাজের জন্য ব্যবহৃত হতো।
1) DOM সিলেকশন ও ট্র্যাভার্সাল ($ ফাংশন ধারণা)
$() ফাংশন আপনাকে CSS‑সদৃଶ সিলেক্টর ব্যবহার করে উপাদান “ধরতে” দিত এবং তারপর একটি গ্রুপ হিসেবে তাদের সাথে কাজ করতে পারতেন।
ব্রাউজার কোয়র্ক ও verbose API‑এর সাথে গণ্ডগোল করার বদলে আপনি সংক্ষিপ্ত, চেইনেবল কল দিয়ে সব আইটেম সিলেক্ট করতে, একটি চাইল্ড খুঁজতে বা প্যারেন্টে উঠতে পারতেন।
2) ইভেন্ট: click/submit/ready প্যাটার্ন
jQuery ইউজার অ্যাকশন‑এ রেসপন্ড করাকে সহজ করে তুলল:
clickবোতাম ও লিঙ্কের জন্যsubmitফর্মের জন্যreadyপেজ লোড হলে কোড চালানোর জন্য
এটি ব্রাউজারগুলো কিভাবে ইভেন্ট অবজেক্ট ও বাইনিং হ্যান্ডল করে তা মসৃণ করতো, যা তখনকার অনিয়মিত ব্রাউজার সাপোর্টে অনেক কাজে লাগত।
3) AJAX বেসিকস (রিফ্রেশ ছাড়াই ডেটা লোড করা)
fetch() স্ট্যান্ডার্ড হওয়ার আগে, jQuery‑র $.ajax(), $.get(), এবং $.post() ছিল একটি সরল উপায় সার্ভার থেকে ডেটা আনার এবং পেজ রিফ্রেশ না করে আপডেট করার।
এটি সেইসব প্যাটার্নকে সম্ভব করেছিল যা এখন স্বাভাবিক মনে হয়—লাইভ সার্চ, “লুড মোর” বাটন, আংশিক পেজ আপডেট—একটি পরিচিত API দিয়ে।
4) ইফেক্ট/অ্যানিমেশন এবং সাধারণ UI হেল্পার
jQuery দ্রুত UI স্পর্শ যেমন hide(), show(), fadeIn(), slideToggle(), এবং animate()‑কে জনপ্রিয় করে তুলেছিল। এগুলো মেনু, নটিফিকেশন এবং মৌলিক ট্রানজিশনের জন্য সুবিধাজনক ছিল—বিশেষ করে যখন CSS সাপোর্ট কম নির্ভরযোগ্য ছিল।
এই সুবিধাগুলো মিলিয়ে ব্যাখ্যা করে কেন লিগ্যাসি JavaScript কোড সাধারণত $( দিয়ে শুরু করে এবং কেন jQuery দীর্ঘকাল ডিফল্ট টুল ছিল।
সহজ উদাহরণ: jQuery বনাম আধুনিক JavaScript
অনেকটা jQuery‑এর খ্যাতি আসে সাধারণ UI টাস্কগুলোতে কতো কম কোড লাগে—বিশেষ করে তখন যখন ব্রাউজার পার্থক্য কষ্টদায়ক ছিল। এক পাশে‑বিপরীত উদাহরণ এটা স্পষ্ট করে।
একটি এলিমেন্ট সিলেক্ট করা ও ক্লিক হ্যান্ডেল করা
jQuery
// Select a button and run code when it's clicked
$('#save').on('click', function (e) {
e.preventDefault();
$('.status').text('Saved!');
});
আধুনিক (ভ্যানিলা) JavaScript
// Select a button and run code when it's clicked
const saveButton = document.querySelector('#save');
const status = document.querySelector('.status');
saveButton?.addEventListener('click', (e) => {
e.preventDefault();
if (status) status.textContent = 'Saved!';
});
রিডেবিলিটি: কম লাইনের বনাম পরিষ্কার API
প্রথম দৃষ্টিতে jQuery ভার্সনটি “ক্লিনার” মনে হতে পারে: একটি চেইন এলিমেন্ট সিলেক্ট করে, হ্যান্ডলার যোগ করে এবং টেক্সট আপডেট করে। সেই সংক্ষিপ্ততাই বড় বিক্রির পয়েন্ট ছিল।
আধুনিক JavaScript খানিক বেশি বর্ণনামূলক, কিন্তু তা আরও স্পষ্ট:
querySelectorএবংaddEventListenerআপনাকে সঠিকভাবে বলে কী হচ্ছে।textContentএকটি স্ট্যান্ডার্ড DOM প্রপার্টি (কোনো লাইব্রেরি র্যাপার নয়)।?.ও নাল চেক আরও পরিষ্কার করে দেয় যদি এলিমেন্ট না থাকে কী হবে।
কোনটা “ভাল”?
পরিপ্রেক্ষিতের উপর নির্ভর করে। যদি আপনি একটি পুরনো কোডবেস মেইনটেন করেন যা সবখানে jQuery ব্যবহার করে, তাহলে jQuery স্নিপেটটি বেশি সঙ্গত এবং দ্রুত কাজ করতে পারে। নতুন কোড লেখার সময়, আধুনিক DOM API‑গুলো ব্যাপকভাবে সাপোর্টেড, নির্ভরতা কমায়, এবং আজকের টুলিং ও ফ্রেমওয়ার্কগুলোর সাথে আরও সহজেই ইন্টিগ্রেট হয়।
নেটিভ JavaScript সমকালে পৌঁছেছে
অনেক বছর jQuery‑এর সবচেয়ে বড় সুবিধা ছিল পূর্বাভাসযোগ্যতা। আপনি একটি উপায়ে সিলেকশন, ইভেন্ট সংযুক্তি বা Ajax অনুরোধ লিখলে তা বেশিরভাগ জায়গায় কাজ করত।
ব over সময়, ব্রাউজারগুলো স্ট্যান্ডার্ডাইজড ও উন্নত হল। jQuery যে অনেক সুবিধা একত্রে দিয়েছে, তার অনেকটাই এখন JavaScript‑এই বিল্ট‑ইন আছে, তাই বেসিক কাজ করতে প্রায়ই আলাদা লাইব্রেরি দরকার হয় না।
DOM API‑গুলো সহজ ও ধারাবাহিক হয়ে উঠেছে
আধুনিক DOM মেথডগুলো অনেক সাধারণ jQuery প্যাটার্ন কভার করে:
document.querySelector()/document.querySelectorAll()অনেক সিলেকশনের জন্য$(...)ersetzen করে।element.classList.add()/.remove()/.toggle()ক্লাস ম্যানিপুলেশন সামলে ফেলে।element.addEventListener()বেশিরভাগ কেসে jQuery‑র ইভেন্ট র্যাপার প্রতিস্থাপন করেছে।
jQuery‑নির্ভর হেল্পারগুলো মনে রাখার বদলে আপনি স্ট্যান্ডার্ড API‑র ওপর নির্ভর করতে পারেন যা আধুনিক ব্রাউজারে কাজ করে।
নেটওয়ার্ক অনুরোধে fetch
যেখানে $.ajax() প্রচলিত ছিল, সেখানে এখন fetch() অনেক দিনের কার্যদক্ষতা সহজে দেয়, বিশেষ করে JSON‑এর সাথে:
const res = await fetch('/api/items');
const data = await res.json();
আপনাকে এখনও এরর ও টাইমআউট স্পষ্টভাবে হ্যান্ডেল করতে হবে, কিন্তু মূল ধারণা—প্লাগইন ছাড়া অনুরোধ করা—এখন নেটিভ।
প্রমিস, async/await, এবং মডিউল দিয়ে ভালো স্ট্রাকচার
jQuery অনেককে কলব্যাক এবং $.Deferred‑এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কোডে পরিচিত করিয়েছিল। আজ Promises ও async/await অ্যাসিঙ্ক ফ্লোদের পড়তে সহজ করেছে, এবং ES মডিউলগুলো কোড কিভাবে সংগঠিত হবে তা পরিষ্কার করে।
এই সংমিশ্রণ—আধুনিক DOM API + fetch + আধুনিক ভাষার ফিচার—অনেক মূল কারণ সরিয়েছে যেগুলি টিমগুলোকে ডিফল্টভাবে jQuery নেবার দিকে ঠেলে দিত।
ফ্রেমওয়ার্কগুলো UI নির্মাণের পদ্ধতি বদলে দিল
jQuery বড় হয়েছে যখন ওয়েব ছিল “মাল্টি‑পেজ” যুগে: সার্ভার HTML রেন্ডার করত, ব্রাউজার পেজ লোড করত, এবং আপনি বিদ্যমান মার্কআপে আচরণ ছিটিয়ে দিতেন—ক্লিক হ্যান্ডলার, অ্যানিমেশন, Ajax কল।
আধুনিক ফ্রন্ট‑এন্ড ফ্রেমওয়ার্কগুলো সেই মডেল উলটো করে দিয়েছে। এছাড়া এখন অনেক অ্যাপ ব্রাউজারে UI‑র বেশি অংশই তৈরি করে এবং ডেটার সাথে সিঙ্ক রাখে।
সিঙ্গেল‑পেজ অ্যাপ ও কম্পোনেন্ট‑ভিত্তিক UI
React, Vue, ও Angular‑এ কম্পোনেন্ট ধারণা জনপ্রিয়—ছোট, পুনরায় ব্যবহারযোগ্য অংশ যা তাদের মার্কআপ, আচরণ এবং স্টেট কন্ট্রোল করে।
এই কনফিগারেশনে ফ্রেমওয়ার্কটাই স্ক্রিনে কী আছে তার সোর্স‑অফ‑ট্রুথ হতে চায়। এটি স্টেট ট্র্যাক করে, স্টেট বদলালে UI‑র অংশগুলো রিরেন্ডার করে এবং আপনাকে ঘোষণামূলকভাবে বলতে বলে (“যখন X সত্য, Y দেখাও”)।
jQuery অপরদিকে বিস্তারততভাবে নির্দেশাত্মক DOM ম্যানিপুলেশন করে (“এই এলিমেন্ট খুঁজো, টেক্সট বদলো, লুকাও”)। এটা ফ্রেমওয়ার্কের রেন্ডার সাইকেলের সাথে দ্বন্দ্ব সৃষ্টি করতে পারে। আপনি যদি এমন DOM‑নোডগুলো ম্যানুয়ালি বদলান যেগুলো কোনো কম্পোনেন্ট ‘কন্ট্রোল’ করে, পরবর্তী রেন্ডার আপনার পরিবর্তনগুলো ওভাররাইট করে দিতে পারে—বা অসঙ্গতিগুলো ডিবাগ করা কঠিন হয়ে পড়ে।
বিল্ড টুল ও বান্ডলার কোড শিপ করার পদ্ধতিও বদলালো
SPA‑এর জনপ্রিয়তা বাড়ার সাথে সাথে টিমগুলো Webpack, Rollup, Vite মত বিল্ড টুল গ্রহণ করেছে। স্ক্রিপ্ট ট্যাগ দিয়ে কেবল কোড রাখার বদলে আপনি মডিউল ইমপোর্ট, ব্যবহার না করা কোড বাদ দেওয়া, পারফরম্যান্স অপটিমাইজেশন করেন।
এই পরিবর্তন এছাড়াও মানুষকে ডিপেনডেন্সি ও বান্ডল সাইজ সম্পর্কে সচেতন করেছে। "শুধু‑খাসে jQuery টেনে আছি" বলতে আর ততটা স্বাভাবিক লাগত না যখন প্রতিটি কিলোবাইট এবং তৃতীয়‑পক্ষ আপডেট পিপলাইনে মানে রাখে।
কেন jQuery কম্পোনেন্ট অ্যাপগুলিতে অস্বস্তিকর হতে পারে
আপনি jQuery একটি ফ্রেমওয়ার্কের ভিতরে ব্যবহার করতে পারেন, কিন্তু প্রায়ই এটি একটি বিশেষ‑কেস দ্বীপ হয়ে যায়—পরীক্ষা করা কঠিন, যুক্তি করা কঠিন, এবং রিফ্যাক্টরের সময় ভাঙার সম্ভাবনা বেশি। ফলশ্রুতিতে অনেক টিম jQuery‑স্টাইল DOM স্ক্রিপ্টিংয়ের বদলে ফ্রেমওয়ার্ক‑নেটিভ প্যাটার্ন বেছে নেয়।
বান্ডল সাইজ ও রক্ষণাবেক্ষণের চাপ
jQuery নিজে খুবই বড় নয়, কিন্তু সাথে সাধারণত ব্যাগেজ আসে। অনেক প্রকল্প যেখানে jQuery নির্ভর করে সেখানে প্লাগইনগুলো (স্লাইডার, ডেট পিকার, মডাল লাইব্রেরি, ভ্যালিডেশন হেল্পার) জমে যায়, প্রতিটি আরও তৃতীয়‑পক্ষ কোড যোগ করে। সময়ের সাথে পেজটি একাধিক ওভারল্যাপিং ইউটিলিটি শিপ করতে পারে—বিশেষ করে যখন ফিচার দ্রুত যোগ করা হয় এবং পরে আর রিভিউ করা হয় না।
বড় ডাউনলোড, ব্রাউজারের জন্য বেশি কাজ
আরও JavaScript মানে ব্রাউজারকে বেশি ফেচ, পার্স এবং এক্সিকিউট করতে হয় আগে পেজটি রিস্পন্সিভ মনে হবে। এই প্রভাব মোবাইল ডিভাইস, ধীর নেটওয়ার্ক, এবং পুরনো হার্ডওয়্যারে আরও লক্ষ্যযোগ্য। এমনকি যদি ব্যবহারকারীরা পরে স্মুথ এক্সপেরিয়েন্স পায়, “টাইম টু ইউজেবল” বিলম্বিত হতে পারে অতিরিক্ত স্ক্রিপ্ট ও তাদের ডিপেনডেন্সিগুলোর কারণে।
লুকানো খরচ: মিশ্র শৈলী ও মানসিক ওভারহেড
দীর্ঘজীবী সাইটে একটি সাধারণ প্যাটার্ন হলো “হাইব্রিড” কোডবেস: কিছু বৈশিষ্ট্য jQuery‑তে লেখা, নতুন অংশগুলো ফ্রেমওয়ার্কে (React/Vue/Angular), এবং কয়েকটি ভ্যানিলা JS স্নিপেট ছড়িয়ে। সেই মিশ্রণ বিভ্রান্তিকর হতে পারে:
- উপাদান নির্বাচন ও DOM আপডেট করার দুইটি উপায়
- ভিন্ন ইভেন্ট মডেল ও লাইফসাইকেল কল্পনা
- স্টেটের জন্য প্রতিদ্বন্দ্বী সমাধান (DOM as state বনাম component state)
যখন একাধিক স্টাইল সহঅস্তিত্বে থাকে, ছোট পরিবর্তনগুলো ঝুঁকিপূর্ণ হয়। একটি ডেভেলপার একটি কম্পোনেন্ট আপডেট করে, কিন্তু পুরনো jQuery স্ক্রিপ্ট এখনও একই মার্কআপে প্রবেশ করে এবং তা পরিবর্তন করে দেয়—ফলে রিপোর্ট করা বাগ কঠিন হয়।
রক্ষণাবেক্ষণের চাপ সংক্ষেপে বাড়ে
টিমগুলো ক্রমান্বয়ে jQuery থেকে সরে যায় না কারণ এটি “অন্ত” হয়ে গেছে—বরং আধুনিক প্রজেক্টগুলো ছোট বান্ডল ও UI আচরণের স্পষ্ট মালিকানার জন্য অপ্টিমাইজ করে। সাইট বৃদ্ধি পাওয়ার সঙ্গে তৃতীয়‑পক্ষ কোড ও স্টাইল সমন্বয় কমানো পারফরম্যান্স টিউনিং, ডিবাগিং এবং অনবোর্ডিংকে সহজ করে।
কেন আপনি এখনও পুরনো সাইটে jQuery দেখেন
jQuery কেবল জনপ্রিয় হয়নি—এটা ডিফল্ট হয়ে গিয়েছিল। বছরগুলো ধরে এটি ছিল সবচেয়ে সহজ উপায় ইন্টার্যাকটিভ পেজগুলো ব্রাউজার-রিলায়েবল করার, তাই এটি অসংখ্য টেমপ্লেট, স্নিপেট, টিউটোরিয়াল এবং কপি‑পেস্ট সমাধানে ঢুকে পড়েছিল।
একবার সেট হয়ে গেলে, jQuery এড়ানো কঠিন হয়ে আসে: এমনকি যদি একটি সাইট মাত্র একটি ছোট ফিচারের জন্যই ব্যবহার করত, অনেক সময় পুরো লাইব্রেরিটাই লোড করা হত কারণ সবকিছুই তার উপস্থিতির ওপর নির্ভর করত।
এটি পুরনো প্লাগইন ও থিমে বেক করা আছে
jQuery এখনো দেখা যায় কারণ এর সাফল্য এটিকে তৃতীয়‑পক্ষ কোডে “সর্বত্র” করে তুলেছিল। পুরনো UI উইজেট, স্লাইডার, লাইটবক্স, ফর্ম ভ্যালিডেটর, এবং থিম স্ক্রিপ্টগুলো প্রায়ই jQuery প্লাগইন হিসেবে লেখা ছিল। যদি একটি সাইট সেই উপাদানগুলোর উপর নির্ভর করে, jQuery সরানো মানে সেই নির্ভরশীলতাগুলো পুনঃলিখন বা প্রতিস্থাপন করা—not শুধুমাত্র কয়েকটা লাইন বদলানো।
WordPress‑এ এটি উত্তরাধিকার সূত্রে এসেছে
WordPress একটি বড় উৎস যেখানে “লিগ্যাসি jQuery” দেখা যায়। অনেক থিম ও প্লাগইন—বিশেষত যেগুলো বছরগুলো আগে তৈরি—ফ্রন্ট‑এন্ড আচরণের জন্য jQuery ব্যবহার করে এবং ঐতিহাসিকভাবে WordPress অ্যাডমিন স্ক্রিনও প্রায়ই এর ওপর নির্ভর করত। নতুন ভার্সনগুলো আধুনিক JS‑এ সরতে লাগলেও দীর্ঘ‑পাথের এক্সটেনশনের কারণে jQuery অনেক ইনস্টলেশনে এখনো উপস্থিত থাকে।
লিগ্যাসি সিস্টেমগুলো পরিবর্তনের চাইতে স্থিতিশীলতাকে মূল্যায়ন করে
পুরনো সাইটগুলো প্রায়ই “যা কাজ করছে, তা ভেঙো না”‑কেই অগ্রাধিকার দেয়। jQuery রাখা নিরাপদ বিকল্প হতে পারে যখন:
- সাইট স্থিতিশীল ও রেভিনিউ‑ক্রিটিক্যাল
- সময় সীমিত এবং রিগ্রেশন টেস্টিং ব্যয়বহুল
- কোডবেসে বছরগুলোর ছোট ছোট ফিক্স আছে যেগুলো পুনর্মূল্যায়ন করা ঝামেলার
সংক্ষেপে, jQuery সবসময় “ভুলে যাওয়া” নয়—এটি প্রায়ই সেই ভিত্তির অংশ যা সাইট তৈরি হয়েছিল, এবং ভিত্তি বদলানো সহজ কাজ নয়।
কখন jQuery রাখা আরও যুক্তিযুক্ত
jQuery “খারাপ” সফটওয়্যার নয়—এটি শুধু এখন আর আগের মতো প্রয়োজনীয় নয়। তবুও কিছু বাস্তব পরিস্থিতি আছে যেখানে ছোট্ট jQuery রাখা বা যোগ করাই সবচেয়ে বাস্তবিক, বিশেষ করে যখন আপনি সময়, সামঞ্জস্যতা বা স্থিতিশীলতার জন্য অপ্টিমাইজ করছেন না যে স্থাপত্যিক পবিত্রতা।
আপনাকে লিগ্যাসি ব্রাউজার সমর্থন করতে হবে
পুরনো ব্রাউজার (বিশেষ করে পুরনো Internet Explorer) সমর্থন করলে jQuery এখনও DOM সিলেকশন, ইভেন্ট হ্যান্ডলিং এবং AJAX সহজ করে দিতে পারে এমনভাবে যা নেটিভ API‑তে অতিরিক্ত পলিফিল ছাড়া পাওয়া কঠিন।
মূল প্রশ্ন হলো খরচ: লিগ্যাসি ব্রাউজার সমর্থন মানে আপনি সাধারণত অতিরিক্ত কোডই শিপ করবেন। সেই প্রসঙ্গে jQuery থাকার সিদ্ধান্ত গ্রহণযোগ্য হতে পারে।
বিদ্যমান jQuery কোডবেসে দ্রুত ফিক্স দরকার
যদি সাইটটি ইতিমধ্যেই jQuery‑কে কেন্দ্র করে চলে, ছোট UI টিউনগুলো একই স্টাইলে করা সাধারণত দ্রুত ও নিরাপদ। পদ্ধতিগুলির মিশ্রণ বিভ্রান্তি সৃষ্টি করতে পারে (ইভেন্টের দুইটি পদ্ধতি, DOM ম্যানিপুলেশনের দুইটি উপায়), যা রক্ষণাবেক্ষণকে কঠিন করে।
একটি বাস্তবে মানদণ্ড: আপনি যদি মাত্র এক বা দুই স্ক্রিন স্পর্শ করছেন এবং অ্যাপ মুলত স্থিতিশীল, তবে jQuery‑তে প্যাচ করা ঠিক আছে—কিন্তু নতুন সিস্টেমে jQuery‑এর বব্যবহার বাড়ানো থেকে বিরত থাকুন যেটা পরে আপনাকে উল্টে দিতে হবে।
বিল্ড স্টেপ নেই তেমন ছোট সাইট
সহজ একটি মার্কেটিং সাইট বা ইনটার্নাল টুল—কোনো বান্ডলার, ট্রান্সপাইলার বা কম্পোনেন্ট ফ্রেমওয়ার্ক নেই—এর জন্য jQuery এখনও সুবিধাজনক “একটি স্ক্রিপ্ট ট্যাগ” হেল্পার। কয়েকটি ইন্টারঅ্যাকশন (টগল মেনু, সহজ ফর্ম আচরণ) চাইলে আপনি একটি বিল্ড পাইপলাইন যোগ না করেও দ্রুত কাজ করতে পারবেন।
আপনি এমন একটি পুরনো প্লাগইন ব্যবহার করছেন যা নির্ভরশীল
অনেক পরিপক্ক প্লাগইন (ডেট পিকার, টেবিল, লাইটবক্স) jQuery‑এর উপর নির্মিত। একটি পুরনো, ব্যবসায়িকভাবে গুরুত্বপূর্ণ এবং স্থিতিশীল প্লাগইন যদি থাকে, তাহলে jQuery রাখা সবচেয়ে কম‑ঝুঁকির সিদ্ধান্ত হতে পারে।
কমিট করার আগে দেখুন কি কোনো রক্ষণাবেক্ষিত, নন‑jQuery বিকল্প আছে কিনা—অথবা প্লাগইন আপগ্রেড করলে পুরো সিস্টেমই রিপ্লেস করতে হবে কি না।
কীভাবে নিরাপদে jQuery থেকে সরে যাবেন
jQuery থেকে সরে আসা বড় রিভ্রাইটের চেয়ে বেশি একটি ধাপচালিত নির্ভরতা কমানো—প্রবাহ বজায় রেখে টুকরো টুকরো করে প্রতিস্থাপন করা নিরাপদ।
1) আপনি আসলে কী ব্যবহার করছেন তা অডিট করুন
তিনটি বাস্তব প্রশ্নের উত্তর দিয়ে শুরু করুন:
- কোন পেজগুলো jQuery লোড করে?
- কোন প্লাগইনগুলো নির্ভরশীল (স্লাইডার, ডেট পিকার, ভ্যালিডেশন ইত্যাদি)?
- আপনার কোডবেসে কোন jQuery ফিচারগুলো আছে (DOM সিলেকশন, ইভেন্ট, AJAX, অ্যানিমেশন)?
এই অডিট আপনাকে অনাবশ্যক জিনিস প্রতিস্থাপন থেকে রক্ষা করবে এবং ‘ছদ্ম’ নির্ভরশীলতাগুলি যেমন $.ajax() ব্যবহারকারী প্লাগইনগুলো খুঁজে পেতে সাহায্য করবে।
2) সহজ জিনিসগুলো প্রথমে বদলান
সবার জন্য দ্রুত বিজয় আসে সাধারণ প্যাটার্নগুলো প্রতিস্থাপন করে:
- সিলেক্টর:
$(".card")→document.querySelectorAll(".card") - ক্লাস:
.addClass()/.removeClass()→classList.add()/classList.remove() - ইভেন্ট:
.on("click", ...)→addEventListener("click", ...)
ছোট PR করুন যাতে রিভিউ ও রোলব্যাক সহজ হয়।
3) Ajax‑এর পরিকল্পনা করুন
$.ajax() ব্যবহার করলে সেই কলগুলো এক এক করে fetch()‑এ স্থানান্তর করুন (অথবা একটি ছোট HTTP হেল্পার তৈরি করুন)। রেসপন্স ফর্মগুলো একই রাখুন যাতে বাকি UI একযোগে বদলাতে না হয়।
// jQuery
$.ajax({ url: "/api/items", method: "GET" }).done(renderItems);
// Modern JS
fetch("/api/items")
.then(r => r.json())
.then(renderItems);
4) টেস্ট ও স্টেজড রোলআউট দিয়ে ঝুঁকি কমান
jQuery সরানোর আগে যেখানে সেটা গুরুত্বপূর্ণ সেখানে কভারেজ যোগ করুন: মূল ইউজার ফ্লো, ফর্ম সাবমিশন, এবং কোনো ডাইনামিক UI। এমনকি হালকা‑ওজনের চেক (Cypress স্মোক টেস্ট বা QA চেকলিস্ট) রিগ্রেশন ধরতে সাহায্য করে। পরিবর্তনগুলো ফিচার ফ্ল্যাগের পেছনে শিপ করুন এবং নিশ্চিত করুন analytics/error রেট স্থিতিশীল থাকে।
রিফ্যাক্টরের সময় অতিরিক্ত নিরাপত্তার জন্য এমন টুল ব্যবহার করলে সুবিধা হয় যা স্ন্যাপশট ও রোলব্যাক সাপোর্ট করে। উদাহরণস্বরূপ, Legacy front‑ends আধুনিক করার সময় কিছু টিম Koder.ai‑র মত প্ল্যাটফর্মে প্রোটোটাইপ করে এবং স্ন্যাপশট/রোলব্যাক ওয়ার্কফ্লো দিয়ে ইন্টারেট করে নেয় যাতে “ন‑গুড” ভার্সন রাখার সুযোগ থাকে।
আপনি যদি সামগ্রিক পরিকল্পনা সাজাতে সাহায্য চান, তুলনা বেছে নিতে /blog/jquery-vs-vanilla-js দেখুন যাতে রিফ্যাক্টরের সময় ব্যবহারযোগ্য বেসলাইন পান।
সাধারণ মাইগ্রেশন ফাঁদ
jQuery থেকে সরে আসা সাধারণত “সিনট্যাক্স বদলানো” তা নয়—বরং বছরে গড়ে ওঠা অনেক অনুমানের উন্মোচন। নিচে কিছু জাল আছে যা টিমগুলোকে ধীর করে দেয়—এবং কিভাবে এ থেকে বাঁচবেন।
সব কিছু একসঙ্গে পুনরায় লিখে ফেলার চেষ্টা
একটি পূর্ণ রিরাইট শুদ্ধ মনে হতে পারে, কিন্তু তা প্রায়শই দীর্ঘ‑চলমান ব্রাঞ্চ, অনেক রিগ্রেশন এবং অসম্পূর্ণ কাজ শিপ করার চাপ সৃষ্টি করে। নিরাপদ পন্থা হলো ধাপে ধাপে: একটি ফিচার বা পেজ একবারে প্রতিস্থাপন করুন, আচরণ একই রাখুন, এবং যেগুলো স্পর্শ করছেন সেখানে টেস্ট যোগ করুন।
একই UI এলিয়াতে jQuery ও কম্পোনেন্ট ফ্রেমওয়ার্ক মিশানো
আপনি যদি React/Vue/Svelte (অথবা এমনকি একটি হালকা কম্পোনেন্ট সিস্টেম) যোগ করেন যখন jQuery এখনও একই DOM নোডগুলো সরাসরি পরিবর্তন করছে, আপনি “UI টাগ‑অফ‑ওয়ার” পেতে পারেন: ফ্রেমওয়ার্ক রিরেন্ডার করে jQuery পরিবর্তনগুলো ওভাররাইট করে দেয়, আবার jQuery পরিবর্তন করলে ফ্রেমওয়ার্ক যা কন্ট্রোল করে সেটিও গণ্ডগোল করে।
রুল অফ থাম্ব: পরিষ্কার একটি সীমানা বেছে নিন। অথবা:
- legacy কন্টেইনারে jQuery রাখুন এবং ফ্রেমওয়ার্ক অন্য কোথাও মাউন্ট করুন, অথবা
- ঐ উইজেট পুরোপুরি মাইগ্রেট করে তারপর নতুন আচরণ যোগ করুন।
ইভেন্ট ডেলিগেশনের পার্থক্য
অনেক আগের কোড নিচের মত ডেলিগেটেড ইভেন্টে নির্ভর করে:
$(document).on('click', '.btn', handler)
ন্যেটিভ DOM‑এ তা করা যায়, কিন্তু ম্যাচিং ও this/event.target প্রত্যাশা বদলে যেতে পারে। সাধারণ বাগগুলো: হ্যান্ডলার ভুল উপাদানের জন্য চালানো (nested icon/span থাকায়) অথবা ডাইনামিকভাবে যোগ করা আইটেমে হ্যান্ডলার না চলা কারণ লিসেনার ভুল ancestor‑এ সংযুক্ত করা হয়েছে। ডেলিগেটেড ইভেন্ট প্রতিস্থাপন করার সময় নিশ্চিত করুন:
- কোন এলিমেন্টকে “ক্লিক করা বাটন” ধরা হবে (
closest()প্রয়োজন হতে পারে) - ইভেন্ট আগে namespace করা ছিল কিনা (jQuery‑তে আছে; নেটিভ‑এ আলাদা কৌশল দরকার)
ইফেক্ট প্রতিস্থাপনের সময় অ্যাক্সেসিবিলিটি পিছনে পড়া
jQuery UI ইফেক্ট এবং কাস্টম অ্যানিমেশন মাঝে মাঝে দুর্ঘটনাবশত অ্যাক্সেসিবিলিটি ইস্যু ঢেকে রাখত—অথবা নতুন করে ভাঙত। যখন আপনি fade, slide ও toggle বদলাবেন, পুনরায় পরীক্ষা করুন:
- ফোকাস ম্যানেজমেন্ট
- ARIA স্টেট (
aria-expandedইত্যাদি) - reduced motion পছন্দ (
prefers-reduced-motion)
এই ফাঁদগুলো আগে ধরলে আপনার মাইগ্রেশন দ্রুত হবে এবং UI আরও নির্ভরযোগ্য হবে—এমনকি শেষ $() মুছে ফেলার আগে।
মূল সারাংশ ও পরবর্তী পদক্ষেপ
jQuery “খারাপ” নয়। এটি বাস্তবে সমস্যার সমাধান করেছিল—বিশেষ করে তখন যখন ব্রাউজার ভিন্ন আচরণ করত এবং ইন্টারঅ্যাকটিভ পেজ তৈরিতে অনেক পুনরাবৃত্ত DOM কোড লিখতে হতো। যা বদলেছে তা হলো: নতুন প্রজেক্টের জন্য সাধারণত আর এটি প্রয়োজনীয় নয়।
কেন jQuery কমে গেল
কয়েকটি শক্তি এটিকে ডিফল্ট পছন্দ থেকে লিগ্যাসি নির্ভরশীলতায় ঠেলে দিয়েছে:
- আধুনিক DOM API উন্নত হয়েছে: উপাদান সিলেকশন, ক্লাস পরিবর্তন, ইভেন্ট হ্যান্ডলিং এখন নেটিভ সহজ।
- ব্রাউজার অসামঞ্জস্য কমেছে: কম কিক‑কুইর্ক মানে কম কম্প্যাটিবিলিটি লেয়ারের চাহিদা।
- ফ্রেমওয়ার্কগুলো প্রত্যাশা বদলে দিয়েছে: React/Vue/Angular কম্পোনেন্ট‑ভিত্তিক UI ও স্টেট‑ড্রিভেন রেন্ডারিংকে উৎসাহিত করে, যেখানে সরাসরি DOM ম্যানিপুলেশন (jQuery‑এর শক্তি) কম কেন্দ্রীয়।
- পারফরম্যান্স ও রক্ষণাবেক্ষণের চাপ: টিমগুলো বান্ডল সাইজ, ডিপেনডেন্সি আপডেট এবং বড় অ্যাপগুলোতে “অজানা কোড” কমানোর দিকে নজর দিতে শুরু করেছে।
বাস্তবগত পরবর্তী ধাপ
আপনি যদি একটি পুরনো সাইট মেইনটেন করেন, jQuery এখনও একটি যৌক্তিক টুল হতে পারে—বিশেষ করে ছোট ফিক্স, স্থিতিশীল প্লাগইন, অথবা এমন পেজ যেখানে পূর্ণ রিবিল্ডকে ন্যায্যতা দেয়া হবে না। নতুন ফিচার বানালে প্রথমে নেটিভ JavaScript লক্ষ করুন এবং কেবল তখনই jQuery রাখুন যদি এটি স্পষ্টভাবে সময় বাঁচায়।
আরও শেখার জন্য:
- DOM মৌলিক বিষয়াবলী ও সাধারণ প্যাটার্ন: /blog/vanilla-js-dom-basics
- পুরনো AJAX প্যাটার্নগুলো আধুনিক অনুরোধে বদলানো: /blog/fetch-api-beginners
আপনি যদি দ্রুত আধুনিককরণ করতে চান, এমন টুল বিবেচনা করুন যা ইনক্রিমেন্টাল প্রোটোটাইপ ও শিপিং সহজ করে। Koder.ai এখানে কাজে লাগতে পারে: আপনি চ্যাটে যা আচরণ চান তা বর্ণনা করে একটি React‑ভিত্তিক UI এবং প্রয়োজনে Go/PostgreSQL ব্যাকএন্ড জেনারেট করতে পারেন, এবং প্রস্তুত হলে সোর্স কোড এক্সপোর্ট করতে পারবেন।
যদি টুলিং বা সাপোর্ট অপশন মূল্যায়ন করতে চান, এখানে দেখুন: /pricing
সাধারণ প্রশ্ন
সোজা কথায় jQuery কী?
jQuery একটি JavaScript লাইব্রেরি যা ব্রাউজারে সাধারণ কাজগুলোকে সহজ করে—উদাহরণস্বরূপ উপাদান নির্বাচন, ইভেন্ট হ্যান্ডলিং, Ajax অনুরোধ করা এবং সাধারণ ইফেক্ট (show/hide, fades, slides)। এর স্বাক্ষর প্যাটার্ন হল $() ফাংশন ব্যবহার করে উপাদান খুঁজে নিয়ে তাতে চেইন করা।
`$` চিহ্নটি jQuery কোডে কি বোঝায়?
$ কেবল একটি শর্টকাট ফাংশন (সাধারণত jQuery দ্বারা প্রদান করা) যা পেজ থেকে উপাদান খুঁজে বের করে—প্রায় document.querySelectorAll() এর মতো—এবং একটি jQuery অবজেক্ট ফেরত দেয় যার উপর আপনি চেইন করে মেথড চালাতে পারেন।
পুরনো কোডে $() দেখলে তা সাধারণত মানে: “কিছু সিলেক্ট কর, তারপর তার ওপর কিছু কর।”
ঐতিহাসিকভাবে jQuery এত বড় কেন ছিল?
এটি জনপ্রিয় হয়েছিল কারণ এটি অসামঞ্জস্যপূর্ণ ব্রাউজার আচরণকে এক ধাঁধা করে তুলে। আগের দিনে ইভেন্ট, DOM ট্র্যাভার্সাল এবং Ajax-এ প্রায়ই ব্রাউজারভিত্তিক ওয়ার্কঅ্যারাউন্ড লাগত।
jQuery একটি পূর্বাভাসযোগ্য API দিয়েছিল যার ফলে টিমগুলো দ্রুত এবং কম ক্রস‑ব্রাউজার সমস্যা নিয়ে কোড পাঠাতে পারে।
কেন মানুষ বলে jQuery “ভুলে ফেলা” বা কম ব্যবহৃত হচ্ছে?
মোটকথা, আধুনিক ব্রাউজার ও JavaScript সেইখানে এসেছিল। আজকাল অনেক ক্লাসিক jQuery কাজ আপনি বিল্ট‑ইন ফিচার দিয়ে বদলে দিতে পারেন:
querySelector/querySelectorAll— সিলেকশনclassList— ক্লাস পরিবর্তনaddEventListener— ইভেন্টfetch+async/await— অনুরোধ
সেজন্য নতুন প্রজেক্টগুলো প্রায়ই আর অতটা সচরাচর compatibility‑লেয়ার হিসেবে jQuery নেয় না।
jQuery কি মৃত?
না। বহু বিদ্যমান সাইট এখনো এটি ব্যবহার করে, এবং এটি এখনও কাজ করে। “লিগ্যাসি” বলতে সাধারণত বোঝানো হয়—নতুন কোডবেসে কম দেখা যায়, কিন্তু পুরনো কোডবেসে অনেক আছে।
প্র্যাকটিকালি প্রশ্ন হল: পারফরম্যান্স, রক্ষণাবেক্ষণ এবং আপনার বর্তমান নির্ভরশীলতাগুলি (বিশেষ করে প্লাগইনগুলো) লক্ষ্য করে এটিকে রাখা উচিত কিনা।
কেন আমি এখনও WordPress ও পুরনো সাইটে jQuery দেখি?
কারণ এটি পুরনো ইকোসিস্টেমগুলোর সঙ্গে গভীরভাবে ঢোকানো ছিল—বিশেষত থিম ও প্লাগইনগুলিতে। একটি সাধারণ উদাহরণ হল WordPress, যেখানে অনেক এক্সটেনশন ঐতিহ্যগতভাবে jQuery‑তে নির্ভর করত।
আপনার সাইট যদি একটি jQuery‑অনুভূতিশীল প্লাগইনের ওপর নির্ভর করে (স্লাইডার, ডেট পিকার, লাইটবক্স, ভ্যালিডেটর), তাহলে jQuery সরানো মানে সেই প্লাগইনটিকে প্রতিস্থাপন করা—শুধু কয়েক লাইন কোড বদলানো নয়।
আজকাল কখন jQuery ব্যবহার করা যৌক্তিক?
হ্যাঁ—কিছু বাস্তব পরিস্থিতিতে jQuery রাখা বা যোগ করা সবচেয়ে বাস্তবিক সিদ্ধান্ত হতে পারে:
- আপনি যদি লিগ্যাসি ব্রাউজার সমর্থন করতে বাধ্য থাকেন
- একটি প্রাচীন jQuery কোডবেসে দ্রুত ফিক্স করতে চান
- ছোট সাইট যেখানে কোনো বিল্ড স্টেপ নেই এবং দ্রুত ইন্টারঅ্যাকশন দরকার
- এমন একটি ব্যবসায়িকভাবে গুরুত্বপূর্ণ প্লাগইন আছে যা jQuery‑এ নির্ভরশীল
এই ক্ষেত্রে স্থিতিশীলতা ও দ্রুততা নির্ভরশীলতা কমানো চাইবার থেকে বেশি গুরুত্বপূর্ণ হতে পারে।
jQuery থেকে নিরাপদভাবে কিভাবে সরবো?
ধীরে ধীরে এবং প্রভাব মাপা অবস্থায় সরান:
- অডিট: কোন পেজে jQuery লোড হয়, কোন প্লাগইনগুলো নির্ভরশীল, কোন jQuery ফিচার ব্যবহার হচ্ছে।
- সহজ জিনিসগুলো বদলান: সিলেক্টর, class টগল, সাধারণ ইভেন্ট হ্যান্ডলারগুলো প্রথমে বদলান।
- Ajax স্থানান্তর:
$.ajax()কে এক এক করেfetch()এ মাইগ্রেট করুন। - তারপর সরান: যতক্ষণ না কোন কোড/প্লাগইন এটিকে প্রয়োজন, ততক্ষণ পর্যন্ত ধরে রাখুন।
ছোট PR এবং স্টেজড রোলআউট রিগ্রেশন ঝুঁকি কমায়।
jQuery ইভেন্ট হ্যান্ডলার পরিবর্তনের সময় কোন সাধারণ সমস্যা হয়?
ইভেন্ট ডেলিগেশন একটি সাধারণ জটিলতা। jQuery‑র মত কোড:
$(document).on('click', '.btn', handler)
ন্যেটিভ DOM‑এ এটি করা যায়, কিন্তু ম্যাচিং এবং this/event.target‑এর প্রত্যাশা বদলে যেতে পারে। সাধারণ সমস্যা হচ্ছে ভুল উপাদানের জন্য হ্যান্ডলার চালু হওয়া (nested icon/span থাকার কারণে) বা ডাইনামিকভাবে যোগ করা আইটেমে হ্যান্ডলার না চালা। ডেলিগেটেড ইভেন্ট বদলানোর সময় নিশ্চিত করুন:
- কোন এলিমেন্টকে “ক্লিক করা বাটন” ধরা হবে (
closest()প্রায়ই দরকার) - ইভেন্ট আগে কি namespace করা ছিল (jQuery এতে সাপোর্ট করে; নেটিভ‑এ আলাদা কৌশল লাগে)
ডাইনামিক কনটেন্ট কেসগুলো পরীক্ষা করুন।
jQuery সরালে accessibility বা UX কি খারাপ হতে পারে?
হ্যাঁ—ইফেক্ট ও DOM রিরাইট কখনো‑কখনো accessibility টপিকগুলো ভেঙে দিতে পারে। যখন আপনি hide()/show() বা slide/fade আচরণ পরিবর্তন করবেন, পুনরায় পরীক্ষা করুন:
- ফোকাস ম্যানেজমেন্ট (open/close করার পর কীবোর্ড ফোকাস কোথায় যায়)
- স্টেট অ্যাট্রিবিউট যেমন
aria-expanded - reduced motion পছন্দ (
prefers-reduced-motion)
চলতি আচরণ কেবল ভিজ্যুয়াল নয়; ইন্টারঅ্যাকশন এবং কীবোর্ড ফ্লোও ঠিক রাখতে হবে।