آموزش جامع Select2
jQuery Plugin برای Dropdown پیشرفته — جستجو، چند انتخابی، Ajax و RTL.
📚معرفی و نصب
Select2 یک jQuery Plugin است که المانهای <select> معمولی را به Dropdownهای پیشرفته با جستجو، چند انتخابی، گروهبندی و بارگذاری Ajax تبدیل میکند.
| ویژگی | Select معمولی | Select2 |
|---|---|---|
| جستجو در گزینهها | ✗ | ✅ |
| چند انتخابی زیبا | محدود | ✅ با Tag |
| گروهبندی | محدود | ✅ |
| Ajax / Infinite Scroll | ✗ | ✅ |
| Template سفارشی | ✗ | ✅ |
| RTL فارسی | نسبی | ✅ کامل |
نصب
<!-- ۱. jQuery (اجباری) --> <script src="jquery.min.js"></script> <!-- ۲. Select2 CSS --> <link rel="stylesheet" href="css/select2.min.css"> <!-- ۳. Select2 JS --> <script src="js/select2.min.js"></script>
فعالسازی
// سادهترین روش $('select').select2(); // با تنظیمات کامل $('#my-select').select2({ placeholder: 'یک گزینه انتخاب کنید...', allowClear: true, // دکمه × برای پاک کردن dir: 'rtl', // راست به چپ width: '100%' });
ⓘ نکته: Select2 به jQuery نیاز دارد — حتماً قبل از Select2 لود کنید. همچنین
<option></option> خالی در ابتدای select برای placeholder لازم است.
🔍Select پایه با جستجو
$('#city').select2({ placeholder: 'شهر را انتخاب کنید...', allowClear: true, dir: 'rtl', width: '100%' });
🔍 دمو: انتخاب شهر با جستجو
گزینهای انتخاب نشده
🏷چند انتخابی و Tags
// Multiple — چند گزینه از لیست $('#skills').select2({ placeholder: 'مهارتها را انتخاب کنید...', dir: 'rtl', maximumSelectionLength: 5 // حداکثر ۵ گزینه }); // Tags — ورودی آزاد + Enter $('#keywords').select2({ tags: true, tokenSeparators: [',', ' '], // جدا کردن با کاما یا فاصله placeholder: 'کلمه کلیدی وارد کنید...', dir: 'rtl' });
🏷 دمو: چند انتخابی — مهارتهای برنامهنویسی
هیچ مهارتی انتخاب نشده
🔖 دمو: Tags Mode — کلمات کلیدی دلخواه
تگها اینجا نمایش داده میشوند...
📁گروهبندی گزینهها
<!-- HTML با optgroup --> <select id="lang"> <option></option> <optgroup label="Frontend"> <option value="js">JavaScript</option> <option value="ts">TypeScript</option> </optgroup> <optgroup label="Backend"> <option value="python">Python</option> </optgroup> </select> // JavaScript — مثل همیشه $('#lang').select2({ placeholder: 'زبان انتخاب کنید...', dir: 'rtl' });
📁 دمو: زبانهای برنامهنویسی گروهبندیشده
گزینهای انتخاب نشده
📋داده محلی (Local Data)
به جای <option> های HTML، میتوان داده را از یک آرایه JavaScript به Select2 داد:
// آرایه ساده var cities = [ { id: 1, text: 'تهران' }, { id: 2, text: 'اصفهان' }, { id: 3, text: 'مشهد' } ]; $('#s2-local').select2({ data: cities, placeholder: 'جستجو...', dir: 'rtl' }); // با اطلاعات اضافه (data customization) var users = [ { id: 1, text: 'علی محمدی', role: 'Admin', avatar: '👤' }, { id: 2, text: 'سارا رضایی', role: 'Editor', avatar: '👤' }, ]; // جستجو در دادههای محلی با matcher $('#s2-local').select2({ data: users, matcher: function(params, data) { if (!params.term) return data; if (data.text.toLowerCase().includes(params.term.toLowerCase())) return data; return null; } });
📋 دمو: داده از آرایه JavaScript
انتخابی نشده
🌐Ajax Search
$('#user-select').select2({ ajax: { url: '/api/search-users', dataType: 'json', delay: 250, // تأخیر بعد از توقف تایپ data: function(params) { return { q: params.term, page: params.page || 1 }; }, processResults: function(data, params) { return { results: data.items.map(function(item) { return { id: item.id, text: item.name }; }), pagination: { more: data.hasMore } }; }, cache: true }, minimumInputLength: 2, // حداقل ۲ کاراکتر برای جستجو placeholder: 'نام کاربر را جستجو کنید...', dir: 'rtl' });
شبیهسازی Ajax با داده محلی
// شبیهسازی Ajax با transport سفارشی $('#s2-ajax-sim').select2({ ajax: { transport: function(params, success, failure) { var filtered = localUsers.filter(function(u) { return u.text.includes(params.data.q || ''); }); setTimeout(function() { success({ results: filtered }); }, 300); // شبیهسازی تأخیر شبکه }, delay: 300, data: function(p) { return { q: p.term }; }, processResults: function(d) { return d; } }, minimumInputLength: 1, placeholder: 'جستجو کنید...', dir: 'rtl' });
🌐 دمو: شبیهسازی Ajax — حداقل ۱ کاراکتر تایپ کنید
انتخابی نشده
⚠ نکته: Ajax واقعی نیاز به سرور دارد. دموی بالا با
transport سفارشی شبیهسازی شده تا رفتار Ajax را آفلاین نمایش دهد.
⚡API و Events
| متد / رویداد | توضیح |
|---|---|
| $('#el').val() | دریافت مقدار انتخابشده |
| $('#el').val('x').trigger('change') | تنظیم مقدار از کد |
| $('#el').val(null).trigger('change') | پاک کردن |
| $('#el').select2('open') | باز کردن dropdown |
| $('#el').select2('close') | بستن dropdown |
| $('#el').select2('destroy') | حذف Select2 (برگشت به select معمولی) |
| change | هر بار که مقدار تغییر کند |
| select2:open / :close | باز/بسته شدن dropdown |
| select2:select | هنگام انتخاب یک گزینه |
| select2:unselect | هنگام حذف یک گزینه (multiple) |
| select2:clear | هنگام پاک کردن با دکمه × |
⚡ دمو: کنترل کامل API
منتظر تعامل...
// رویداد change $('#my-select').on('change', function() { console.log('مقدار:', $(this).val()); }); // هنگام انتخاب — اطلاعات کامل گزینه $('#my-select').on('select2:select', function(e) { var data = e.params.data; console.log('id:', data.id, 'text:', data.text); });
🎨Template سفارشی
با templateResult و templateSelection میتوان ظاهر گزینهها را کاملاً تغییر داد:
function formatOption(option) { if (!option.id) return option.text; var emoji = $(option.element).data('emoji') || ''; var desc = $(option.element).data('desc') || ''; return $('<div style="padding:4px 0">' + '<span style="font-size:18px;margin-left:8px">' + emoji + '</span>' + '<strong>' + option.text + '</strong>' + (desc ? '<br><small style="color:#888;margin-right:26px">'+desc+'</small>' : '') + '</div>'); } $('#s2-template').select2({ templateResult: formatOption, templateSelection: formatOption, dir: 'rtl' });
🎨 دمو: Template با Emoji و توضیحات
وضعیتی انتخاب نشده
🎨 دمو: Template با Progress Bar
⚙تنظیمات پیشرفته
| گزینه | پیشفرض | توضیح |
|---|---|---|
| placeholder | '' | متن راهنما هنگام خالی بودن |
| allowClear | false | نمایش دکمه × برای پاک کردن |
| dir | 'ltr' | جهت متن — برای فارسی 'rtl' |
| width | 'resolve' | عرض — معمولاً '100%' |
| minimumInputLength | 0 | حداقل کاراکتر برای شروع جستجو |
| minimumResultsForSearch | 0 | اگر Infinity باشد، جستجو پنهان |
| maximumSelectionLength | 0 | حداکثر انتخاب در multiple (0=نامحدود) |
| tags | false | ورودی آزاد + Enter |
| tokenSeparators | [] | کاراکترهای جداکننده در Tags |
| disabled | false | غیرفعال کردن |
| dropdownParent | $('body') | parent element برای dropdown |
| language | 'en' | زبان متنهای پیشفرض |
تنظیم زبان فارسی داخلی
// تنظیم دستی پیامهای فارسی $('#s2').select2({ language: { noResults: function() { return 'نتیجهای یافت نشد'; }, searching: function() { return 'در حال جستجو...'; }, inputTooShort: function(args) { return 'حداقل '+args.minimum+' کاراکتر'; }, maximumSelected: function(args) { return 'حداکثر '+args.maximum+' گزینه'; }, loadingMore: function() { return 'در حال بارگذاری...'; }, removeAllItems: function() { return 'حذف همه'; } }, dir: 'rtl' });
🏳 دمو: Select با پیامهای فارسی + حداقل ۲ کاراکتر
🏆فرم کامل ثبتنام
ترکیب Select2 با یک فرم واقعی — اعتبارسنجی و نمایش خروجی:
📋 دمو: فرم ثبتنام کامل
💡 خلاصه Select2:
$('#el').select2({...})— فعالسازیplaceholder + allowClear: true— راهنما + دکمه پاکmultiple="multiple"روی select — چند انتخابیtags: true— ورودی آزادoptgroupدر HTML — گروهبندیtemplateResult— ظاهر سفارشی گزینههاdir: 'rtl'— فارسی RTL.val('x').trigger('change')— تنظیم از کد
🚀زمین بازی کد (Playground)
با Select2 یک منوی کشویی پیشرفته (جستجو، چندانتخابی، Tags) بساز. تنظیمات را تغییر بده و ▶ اجرا را بزن. jQuery و Select2 نسخهٔ ۴.۰.۱۳ آفلاین بارگذاری میشوند.