λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
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, μ›Ή 개발, λ“œλ‘­λ‹€μš΄, μ‚¬μš©μž κ²½ν—˜, ν”„λ‘ νŠΈμ—”λ“œ

    λ°˜μ‘ν˜•

    λŒ“κΈ€