رویداد change در jQuery یکی از رویدادهای کاربردی برای تشخیص تغییر مقدار کنترلهای فرم است. در این راهنما، نحوه استفاده از این رویداد، تفاوت آن با رویدادهای دیگر، مثالهای عملی و نکات مهم پیادهسازی را بررسی میکنیم.
رویداد change در jQuery چیست؟
رویداد change در jQuery زمانی اجرا میشود که مقدار یک عنصر فرم تغییر کند. این رویداد معمولا برای فیلدهای متنی، کادرهای انتخاب، گزینههای رادیویی و منوهای کشویی به کار میرود. با استفاده از آن میتوانید پس از تغییر مقدار، کارهایی مانند اعتبارسنجی، نمایش پیام یا بهروزرسانی بخشی از صفحه را انجام دهید.
در این بخش از آموزش JQuery، رویداد change را در طراحی سایت بررسی میکنیم. این رویداد کمک میکند برنامه به انتخاب یا ورودی کاربر واکنش نشان دهد، بدون اینکه لازم باشد برای هر کنترل، منطق جداگانه و پیچیدهای بنویسید.
💡کاربرد اصلی
فرض کنید کاربر استان محل سکونت خود را از یک فهرست انتخاب میکند. میتوانید با رویداد تغییر، فهرست شهرها را متناسب با استان انتخابشده بهروزرسانی کنید. همین الگو برای محاسبه قیمت، کنترل فرم و نمایش محتوای وابسته نیز کاربرد دارد.
چه زمانی رویداد change اجرا میشود؟
زمان اجرای این رویداد به نوع کنترل بستگی دارد. در منوی کشویی و کنترلهای انتخابی، معمولا پس از تغییر گزینه، رویداد اجرا میشود. اما در فیلد متنی، اغلب تغییر مقدار زمانی تشخیص داده میشود که کاربر پس از ویرایش، تمرکز را از فیلد خارج کند.
بنابراین، رویداد change برای تشخیص تغییر نهایی مقدار مناسب است، نه لزوما برای دنبال کردن تکتک کلیدهایی که کاربر تایپ میکند. اگر لازم است با هر بار تایپ واکنش نشان دهید، رویدادهایی مانند input یا keyup را نیز بررسی کنید.
نحوه استفاده از رویداد change در jQuery
برای اتصال رویداد به یک عنصر، ابتدا عنصر مورد نظر را با selector انتخاب میکنیم و سپس تابعی را به رویداد change اختصاص میدهیم. تابع در زمان وقوع رویداد اجرا میشود و میتواند دستورات مورد نیاز را در خود داشته باشد.
$("selector").change(function() {
// some code
});
در این ساختار، selector مشخص میکند رویداد روی کدام عنصر یا عناصر اجرا شود. تابعی که به change() میدهید، کد مورد نظر را هنگام تغییر مقدار اجرا میکند. اگر چند عنصر با selector انتخاب شوند، رویداد به همه آنها متصل خواهد شد.
روش پیشنهادی با on
در نسخههای جدید jQuery بهتر است برای اتصال رویدادها از متد on() استفاده کنید. این روش خوانا و انعطافپذیر است و در پروژههایی که عناصر فرم به صورت پویا اضافه میشوند، امکان استفاده از اتصال رویداد واگذارشده را نیز فراهم میکند.
$("selector").on("change", function() {
// کد مورد نظر پس از تغییر مقدار
});
متد کوتاه change() برای اتصال تابع همچنان در بسیاری از کدهای موجود دیده میشود. با این حال، در کدهای تازه استفاده از on("change", ...) انتخاب مناسبی است؛ بهویژه زمانی که میخواهید الگوی یکسانی برای مدیریت رویدادهای مختلف داشته باشید.
مثال کاربردی رویداد change در jQuery
مثال زیر یک فیلد متنی را انتخاب میکند و پس از تغییر مقدار آن، یک پیام نمایش میدهد. برای دیدن نتیجه، متن را ویرایش کنید و سپس از فیلد خارج شوید.
$("input").on("change", function() {
alert("The text has been changed.");
});
در این مثال، selector برابر با input است؛ بنابراین تمام ورودیهای صفحه انتخاب میشوند. اگر فقط یک فیلد خاص مد نظر باشد، بهتر است برای آن شناسه یا کلاس مشخصی تعریف کنید تا سایر ورودیها به اشتباه تحت تاثیر قرار نگیرند.
$("#username").on("change", function() {
alert("The username has changed.");
});
در نمونه بالا، رویداد فقط به عنصری متصل میشود که شناسه آن username است. استفاده از شناسه یا کلاس اختصاصی، خوانایی کد را بیشتر میکند و احتمال اجرای ناخواسته تابع روی کنترلهای دیگر را کاهش میدهد.
خواندن مقدار جدید عنصر
برای دریافت مقداری که کاربر وارد یا انتخاب کرده است، میتوانید داخل تابع رویداد از $(this).val() استفاده کنید. عبارت this به عنصری اشاره میکند که رویداد روی آن اتفاق افتاده است.
$("#city").on("change", function() {
const selectedCity = $(this).val();
$("#result").text("شهر انتخاب شده: " + selectedCity);
});
در این کد، مقدار انتخابشده از عنصر با شناسه city خوانده میشود و سپس در عنصر result نمایش داده میشود. متد text() متن عنصر مقصد را تغییر میدهد. هنگام نمایش دادههای واردشده توسط کاربر، انتخاب روش مناسب برای درج محتوا اهمیت دارد؛ برای متن ساده، استفاده از text میتواند از تفسیر ناخواسته کد HTML جلوگیری کند.
استفاده از change در کنترلهای مختلف فرم
رویداد change محدود به فیلدهای متنی نیست. هر کنترل فرم که مقدار یا وضعیت قابل تغییر دارد، میتواند با این رویداد مدیریت شود. البته زمان و شیوه اجرای رویداد ممکن است با توجه به نوع کنترل و مرورگر کمی متفاوت باشد.
| نوع کنترل |
کاربرد رویداد change |
نکته اجرایی |
| فیلد متنی |
بررسی مقدار نهایی یا اعتبارسنجی پس از ویرایش |
معمولا پس از خروج تمرکز از فیلد اجرا میشود. |
| منوی کشویی |
بهروزرسانی محتوا بر اساس گزینه انتخابی |
برای انتخاب استان، دستهبندی یا روش ارسال مناسب است. |
| checkbox |
واکنش به فعال یا غیرفعال شدن گزینه |
وضعیت کنترل را میتوان با ویژگی checked بررسی کرد. |
| radio |
تشخیص گزینه انتخابشده از میان چند گزینه |
مقدار گزینه انتخابشده را از گروه مربوط بخوانید. |
تغییر مقدار منوی کشویی
یکی از رایجترین کاربردهای رویداد change، واکنش به انتخاب یک گزینه در منوی کشویی است. برای مثال، میتوانید پس از انتخاب روش ارسال، هزینه آن را محاسبه کنید یا توضیحات مرتبط را نمایش دهید.
$("#shipping").on("change", function() {
const method = $(this).val();
$("#shipping-result").text("روش انتخاب شده: " + method);
});
در این نمونه، با تغییر گزینه، مقدار جدید در متغیر method ذخیره میشود. سپس نتیجه در بخشی از صفحه نمایش داده میشود. در پروژه واقعی، میتوانید همین مقدار را برای محاسبه هزینه نهایی یا ارسال درخواست به سرور استفاده کنید.
بررسی checkbox و radio
برای کادرهای انتخاب و گزینههای رادیویی نیز میتوان از change استفاده کرد. در checkbox علاوه بر مقدار، معمولا باید وضعیت انتخابشدن کنترل را بررسی کنید. ویژگی checked مشخص میکند گزینه فعال است یا خیر.
$("#accept-terms").on("change", function() {
if ($(this).is(":checked")) {
$("#submit-button").prop("disabled", false);
} else {
$("#submit-button").prop("disabled", true);
}
});
این الگو برای فعالکردن دکمه ارسال پس از پذیرش قوانین کاربرد دارد. در طراحی فرم، بهتر است وضعیت اولیه دکمه نیز با همین منطق هماهنگ باشد تا کاربر پیش از انتخاب گزینه، نتواند عملی را انجام دهد که هنوز مجاز نیست.
تفاوت change با input و keyup
انتخاب رویداد مناسب به زمانی بستگی دارد که میخواهید واکنش برنامه اجرا شود. رویداد change برای زمانی مناسب است که مقدار کنترل تغییر کرده و کاربر تغییر خود را نهایی کرده باشد. در مقابل، input میتواند هنگام تغییر مقدار در فیلد متنی، واکنش سریعتری ایجاد کند.
| رویداد |
زمان استفاده |
نمونه کاربرد |
| change |
پس از تغییر مقدار و نهاییشدن آن |
ثبت گزینه انتخابی یا اعتبارسنجی پس از خروج از فیلد |
| input |
همزمان با تغییر مقدار فیلد متنی |
جستجوی زنده یا نمایش تعداد نویسهها |
| keyup |
پس از رهاکردن یک کلید صفحهکلید |
واکنش به صفحهکلید، با درنظرگرفتن تفاوت آن با تغییرهای دیگر ورودی |
برای جستجوی زنده، رویداد input معمولا انتخاب مناسبتری است؛ زیرا تغییر مقدار را در حین تایپ تشخیص میدهد. رویداد keyup فقط به صفحهکلید وابسته است و ممکن است تغییرهایی را که با جایگذاری متن، ابزارهای کمکی یا روشهای دیگر انجام میشوند به شکل مطلوب پوشش ندهد.
اتصال رویداد به عناصر پویا
اگر عنصری بعد از بارگذاری صفحه و با کد جاوااسکریپت به سند اضافه شود، اتصال مستقیم رویداد به آن ممکن است کافی نباشد؛ چون عنصر هنگام اجرای کد هنوز وجود نداشته است. در چنین شرایطی، میتوانید رویداد را به یک عنصر والد ثابت واگذار کنید.
$("#form-container").on("change", ".dynamic-select", function() {
const value = $(this).val();
console.log(value);
});
در این مثال، عنصر form-container باید هنگام اتصال رویداد در صفحه وجود داشته باشد. هر بار که یک عنصر با کلاس dynamic-select داخل آن تغییر کند، تابع اجرا میشود. بهتر است والد انتخابشده تا حد ممکن نزدیک به عناصر پویا باشد تا رویدادهای غیرمرتبط در بخشهای دیگر صفحه مدیریت نشوند.
نکات مهم و خطاهای رایج
برای استفاده درست از رویداد change در jQuery، فقط نوشتن تابع کافی نیست. باید به انتخاب عنصر، زمان اجرای رویداد و شیوه خواندن مقدار توجه کنید. رعایت نکات زیر از رفتارهای ناخواسته و خطاهای رایج جلوگیری میکند.
- selector را دقیق انتخاب کنید: استفاده از selector عمومی مثل input ممکن است تابع را به کنترلهای ناخواسته متصل کند. برای هدفگیری دقیق، از شناسه یا کلاس اختصاصی استفاده کنید.
- رویداد مناسب را انتخاب کنید: اگر واکنش باید با هر تغییر تایپی انجام شود، input را بررسی کنید؛ اگر تغییر نهایی کافی است، change انتخاب مناسبی خواهد بود.
- مقدار عنصر را درست بخوانید: در تابع رویداد، استفاده از
$(this).val() مقدار کنترل تغییرکرده را در دسترس قرار میدهد.
- به عناصر پویا توجه کنید: برای کنترلهایی که بعدا به صفحه اضافه میشوند، از رویداد واگذارشده با on استفاده کنید.
- از اجرای کارهای سنگین در هر تغییر پرهیز کنید: اگر عملیات زمانبر است، اجرای مکرر آن میتواند تجربه کاربری را ضعیف کند. در این حالت، مدیریت تعداد درخواستها یا تاخیر کوتاه را در نظر بگیرید.
- نسخه jQuery را بررسی کنید: پیش از استفاده از روشهای قدیمی، نسخه کتابخانه و سازگاری کد را با ساختار پروژه خود بسنجید.
بررسی علت اجرا نشدن رویداد
اگر تابع اجرا نمیشود، ابتدا مطمئن شوید فایل jQuery پیش از کد شما بارگذاری شده است. سپس بررسی کنید selector با شناسه یا کلاس واقعی عنصر مطابقت داشته باشد و کد پس از آمادهشدن سند اجرا شود. خطاهای کنسول مرورگر نیز میتوانند علت مشکل را مشخص کنند.
همچنین به یاد داشته باشید که تغییر مقدار یک کنترل با کد، همیشه به معنای اجرای خودکار رویداد change نیست. اگر پس از تغییر برنامهای مقدار، نیاز دارید همان منطق اجرا شود، میتوانید رویداد را بهصورت صریح فعال کنید؛ اما از اجرای ناخواسته یا تکراری تابع جلوگیری کنید.
$("#city").val("tehran").trigger("change");
جمعبندی
رویداد change در jQuery راهی ساده و موثر برای واکنش به تغییر مقدار کنترلهای فرم است. از آن میتوانید برای مدیریت منوهای کشویی، checkbox، radio و تغییرهای نهایی فیلدهای متنی استفاده کنید. شناخت تفاوت آن با input و keyup به شما کمک میکند رویدادی را انتخاب کنید که با نیاز رابط کاربری هماهنگ باشد.
در کدهای جدید، استفاده از on("change", ...)، انتخاب selector دقیق و توجه به عناصر پویا، ساختار قابلاعتمادتری ایجاد میکند. با رعایت این نکات میتوانید رویداد change را در فرمهای ساده و پروژههای بزرگتر به شکل روشن و قابل نگهداری به کار ببرید.
سوالات متداول رویداد change در jQuery
رویداد change در jQuery چه کاری انجام میدهد؟
این رویداد زمانی اجرا میشود که مقدار یک کنترل فرم تغییر کند. میتوانید از آن برای واکنش به انتخاب کاربر، اعتبارسنجی مقدار یا بهروزرسانی محتوای صفحه استفاده کنید.
رویداد change در فیلد متنی چه زمانی اجرا میشود؟
معمولا پس از آن اجرا میشود که کاربر مقدار فیلد را تغییر دهد و از آن خارج شود. اگر لازم است همزمان با تایپ واکنش نشان دهید، رویداد input را بررسی کنید.
برای اتصال رویداد change از change() استفاده کنیم یا on()؟
هر دو روش برای اتصال رویداد به عناصر موجود قابل استفاده هستند؛ اما در کدهای جدید، on("change", ...) روشی انعطافپذیر و مناسب است. این متد برای رویدادهای واگذارشده به عناصر پویا نیز کاربرد دارد.
چطور مقدار جدید کنترل را در تابع change بخوانیم؟
داخل تابع رویداد از $(this).val() استفاده کنید. this به عنصری اشاره میکند که تغییر کرده است و val مقدار فعلی آن را برمیگرداند.
چرا رویداد change برای عنصری که با کد اضافه شده اجرا نمیشود؟
اگر عنصر پس از اتصال مستقیم رویداد به صفحه اضافه شده باشد، هنگام اتصال هنوز وجود نداشته است. رویداد را با on به یک والد ثابت واگذار کنید و selector عنصر پویا را به عنوان آرگومان دوم بنویسید.