๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Lect & Tip/bootstrap

bootstrap selectpicker multiple js ์ˆ˜์ •: ์ „์ฒด ์„ ํƒ์ด ์ฒดํฌ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ํ•˜๋‚˜๋ผ๋„ ์ฒดํฌ ํ•ด์ œ๋  ๊ฒฝ์šฐ ์ „์ฒด ์„ ํƒ๋„ ๊ฐ™์ด ์ฒดํฌ ํ•ด์ œ ๋˜๊ฒŒ

by st๊ณต๊ฐ„ 2024. 8. 23.

bootstrap selectpicker multiple js ์ˆ˜์ •: ์ „์ฒด ์„ ํƒ์ด ์ฒดํฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ํ•˜๋‚˜๋ผ๋„ ์ฒดํฌ ํ•ด์ œ๋  ๊ฒฝ์šฐ ์ „์ฒด ์„ ํƒ๋„ ๊ฐ™์ด ์ฒดํฌ ํ•ด์ œ๋˜๊ฒŒ

Bootstrap์€ ์›น ๊ฐœ๋ฐœ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋‹ค์–‘ํ•œ UI ์ปดํฌ๋„ŒํŠธ์™€ ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ bootstrap-select๋Š” ๊ธฐ๋ณธ HTML <select> ์š”์†Œ๋ฅผ ๋”์šฑ ์„ธ๋ จ๋˜๊ฒŒ ๋ณด์ด๋„๋ก ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ selectpicker๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ(dropdown) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ, "์ „์ฒด ์„ ํƒ(Select All)" ์˜ต์…˜๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ข…์ข… ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” bootstrap-selectpicker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ, "์ „์ฒด ์„ ํƒ" ์˜ต์…˜์ด ์„ ํƒ๋œ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ํ•˜๋‚˜๋ผ๋„ ํ•ด์ œ๋  ๊ฒฝ์šฐ, "์ „์ฒด ์„ ํƒ" ์˜ต์…˜๋„ ํ•จ๊ป˜ ํ•ด์ œ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…

๊ธฐ๋ณธ์ ์œผ๋กœ bootstrap-select ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ "์ „์ฒด ์„ ํƒ" ์˜ต์…˜์€ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค๋ฌด์—์„œ๋Š” "์ „์ฒด ์„ ํƒ"์ด ์ฒดํฌ๋œ ์ƒํƒœ์—์„œ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ์„ ํƒ ํ•ด์ œํ•  ๋•Œ, "์ „์ฒด ์„ ํƒ"๋„ ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜๊ธธ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ JavaScript ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋กœ์ง์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ "์ „์ฒด ์„ ํƒ"์„ ํด๋ฆญํ•˜์—ฌ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์ดํ›„ ํŠน์ • ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ์„ ํƒ ํ•ด์ œํ•˜๋ฉด, "์ „์ฒด ์„ ํƒ" ๋˜ํ•œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ๊ธ€์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

JavaScript๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋จผ์ €, ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” bootstrap-select์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— JavaScript๋ฅผ ํ™œ์šฉํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. JavaScript ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์˜ ์„ ํƒ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , "์ „์ฒด ์„ ํƒ" ํ•ญ๋ชฉ์˜ ์ฒดํฌ ์ƒํƒœ๋ฅผ ์ ์ ˆํžˆ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. HTML ์ฝ”๋“œ

์šฐ์„ , ๊ธฐ๋ณธ์ ์ธ bootstrap-select HTML ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— "์ „์ฒด ์„ ํƒ" ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

<select id="mySelect" class="selectpicker" multiple data-actions-box="true">
    <option value="select-all">์ „์ฒด ์„ ํƒ</option>
    <option value="option1">์˜ต์…˜ 1</option>
    <option value="option2">์˜ต์…˜ 2</option>
    <option value="option3">์˜ต์…˜ 3</option>
</select>

์ด HTML ์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ ๋“œ๋กญ๋‹ค์šด์„ ์ •์˜ํ•˜๋ฉฐ, "์ „์ฒด ์„ ํƒ" ์˜ต์…˜์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋“œ๋กญ๋‹ค์šด์˜ ๋™์ž‘์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด JavaScript๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. JavaScript ์ฝ”๋“œ

๋‹ค์Œ์œผ๋กœ, JavaScript๋ฅผ ์ด์šฉํ•ด "์ „์ฒด ์„ ํƒ" ์˜ต์…˜๊ณผ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

$(document).ready(function () {
    $('#mySelect').on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) {
        var selectedOptions = $(this).val();
        var selectAllValue = 'select-all';

        // "์ „์ฒด ์„ ํƒ"์ด ์ฒดํฌ๋œ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์„ ํƒ ํ•ด์ œ๋œ ๊ฒฝ์šฐ
        if (clickedIndex !== null && selectedOptions !== null && selectedOptions.indexOf(selectAllValue) !== -1) {
            if (!isSelected && clickedIndex !== 0) {
                // ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์ด ์„ ํƒ ํ•ด์ œ๋œ ๊ฒฝ์šฐ "์ „์ฒด ์„ ํƒ"์„ ์ฒดํฌ ํ•ด์ œ
                $(this).find('option[value="' + selectAllValue + '"]').prop('selected', false);
                $(this).selectpicker('refresh');
            }
        }

        // "์ „์ฒด ์„ ํƒ"์ด ํด๋ฆญ๋œ ๊ฒฝ์šฐ
        if (clickedIndex === 0) {
            if (isSelected) {
                // ๋ชจ๋“  ์˜ต์…˜ ์„ ํƒ
                $(this).selectpicker('selectAll');
            } else {
                // ๋ชจ๋“  ์˜ต์…˜ ํ•ด์ œ
                $(this).selectpicker('deselectAll');
            }
        }
    });
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” changed.bs.select ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด selectpicker์˜ ์„ ํƒ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋กœ์ง์ด ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. clickedIndex๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, isSelected๋Š” ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ๋กœ์ง์˜ ํ•ต์‹ฌ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ํ•ด์ œํ•  ๋•Œ, "์ „์ฒด ์„ ํƒ"์ด ์„ ํƒ๋œ ์ƒํƒœ๋ผ๋ฉด "์ „์ฒด ์„ ํƒ" ๋˜ํ•œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜๋„๋ก ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ฌ์šฉ์ž๊ฐ€ "์ „์ฒด ์„ ํƒ"์„ ํด๋ฆญํ–ˆ์„ ๋•Œ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์„ ํƒ๋˜๊ฑฐ๋‚˜ ํ•ด์ œ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” bootstrap-selectpicker๋ฅผ ํ™œ์šฉํ•ด ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ ๋“œ๋กญ๋‹ค์šด์—์„œ "์ „์ฒด ์„ ํƒ" ์˜ต์…˜์„ ํด๋ฆญํ•œ ํ›„, ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ์„ ํƒ ํ•ด์ œํ•  ๋•Œ "์ „์ฒด ์„ ํƒ" ๋˜ํ•œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, JavaScript๋ฅผ ํ™œ์šฉํ•ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์›น ํ”„๋กœ์ ํŠธ์—์„œ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ํ•„์ˆ˜์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ด๋ณด์„ธ์š”. ์ž‘์€ ๋ณ€๊ฒฝ์ด์ง€๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ: bootstrap selectpicker, ์ „์ฒด ์„ ํƒ ํ•ด์ œ, JavaScript, ๋ฉ€ํ‹ฐ ์…€๋ ‰ํŠธ, selectpicker ์ˆ˜์ •, bootstrap, ์›น ๊ฐœ๋ฐœ, ๋“œ๋กญ๋‹ค์šด, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ํ”„๋ก ํŠธ์—”๋“œ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€