๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ ํšŒ์›๊ฐ€์ž…, ์•ฝ๊ด€ ๋™์˜ ์˜ˆ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด jQuery๋ฅผ ์ด์šฉํ•œ ์˜ˆ์ œ๊ฐ€ ๋งŽ์€๋ฐ, ์š”์ฆ˜์—๋Š” jQuery๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ถ”์„ธ์ด๊ณ , ์ˆœ์ˆ˜ Vanilla ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— jQuery ์—†์ด ์ˆœ์ˆ˜ Vanilla ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์™„์„ฑ ํ™”๋ฉด 

HTML ๊ตฌ์„ฑ

<div class="wrap">
      <div class="logo">
        <h1>JUN</h1>
      </div>
      <div class="contents">
        <form action="/" method="POST" id="form__wrap">
          <div class="terms__check__all">
            <input type="checkbox" name="checkAll" id="checkAll"" />
            <label for="checkAll"
              >JUN ์ด์šฉ์•ฝ๊ด€, ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ด์šฉ, ํ”„๋กœ๋ชจ์…˜ ์ •๋ณด ์ˆ˜์‹ (์„ ํƒ)์—<br />๋ชจ๋‘ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.</label
            >
          </div>
          <ul class="terms__list">
            <li class="terms__box">
              <div class="input__check">
                <input type="checkbox" name="agreement" id="termsOfService" value="termsOfService" required />
                <label for="termsOfService" class="required">JUN ์ด์šฉ์•ฝ๊ด€ ๋™์˜</label>
              </div>
              <div class="terms__content">
                ์—ฌ๋Ÿฌ๋ถ„์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. JUN ์„œ๋น„์Šค ๋ฐ ์ œํ’ˆ(์ดํ•˜ ‘์„œ๋น„์Šค’)์„ ์ด์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์•ฝ๊ด€์€ ๋‹ค์–‘ํ•œ JUN
                ์„œ๋น„์Šค์˜ ์ด์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ JUN ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” JUN ์ฃผ์‹ํšŒ์‚ฌ(์ดํ•˜ ‘JUN’)์™€ ์ด๋ฅผ ์ด์šฉํ•˜๋Š” JUN ์„œ๋น„์Šค
                ํšŒ์›(์ดํ•˜ ‘ํšŒ์›’) ๋˜๋Š” ๋น„ํšŒ์›๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ์•„์šธ๋Ÿฌ ์—ฌ๋Ÿฌ๋ถ„์˜ JUN ์„œ๋น„์Šค ์ด์šฉ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”
                ์œ ์ตํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JUN ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์‹œ๊ฑฐ๋‚˜ JUN ์„œ๋น„์Šค ํšŒ์›์œผ๋กœ ๊ฐ€์ž…ํ•˜์‹ค ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ณธ
                ์•ฝ๊ด€ ๋ฐ ๊ด€๋ จ ์šด์˜ ์ •์ฑ…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋™์˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ž ์‹œ ์‹œ๊ฐ„์„ ๋‚ด์‹œ์–ด ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ด ์ฃผ์‹œ๊ธฐ
                ๋ฐ”๋ž๋‹ˆ๋‹ค.
              </div>
            </li>
            <li class="terms__box">
              <div class="input__check">
                <input type="checkbox" name="agreement" id="privacyPolicy" value="privacyPolicy" required />
                <label for="privacyPolicy" class="required">๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ด์šฉ ๋™์˜</label>
              </div>
              <div class="terms__content">
                ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ•์— ๋”ฐ๋ผ JUN์— ํšŒ์›๊ฐ€์ž… ์‹ ์ฒญํ•˜์‹œ๋Š” ๋ถ„๊ป˜ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด์˜ ํ•ญ๋ชฉ, ๊ฐœ์ธ์ •๋ณด์˜ ์ˆ˜์ง‘ ๋ฐ
                ์ด์šฉ๋ชฉ์ , ๊ฐœ์ธ์ •๋ณด์˜ ๋ณด์œ  ๋ฐ ์ด์šฉ๊ธฐ๊ฐ„, ๋™์˜ ๊ฑฐ๋ถ€๊ถŒ ๋ฐ ๋™์˜ ๊ฑฐ๋ถ€ ์‹œ ๋ถˆ์ด์ต์— ๊ด€ํ•œ ์‚ฌํ•ญ์„ ์•ˆ๋‚ด ๋“œ๋ฆฌ์˜ค๋‹ˆ
                ์ž์„ธํžˆ ์ฝ์€ ํ›„ ๋™์˜ํ•˜์—ฌ ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.1. ์ˆ˜์ง‘ํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด ์ด์šฉ์ž๋Š” ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š์•„๋„ ์ •๋ณด ๊ฒ€์ƒ‰,
                ๋‰ด์Šค ๋ณด๊ธฐ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ๋„ค์ด๋ฒ„ ์„œ๋น„์Šค๋ฅผ ํšŒ์›๊ณผ ๋™์ผํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์šฉ์ž๊ฐ€ ๋ฉ”์ผ, ์บ˜๋ฆฐ๋”, ์นดํŽ˜,
                ๋ธ”๋กœ๊ทธ ๋“ฑ๊ณผ ๊ฐ™์ด ๊ฐœ์ธํ™” ํ˜น์€ ํšŒ์›์ œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์›๊ฐ€์ž…์„ ํ•  ๊ฒฝ์šฐ, ๋„ค์ด๋ฒ„๋Š” ์„œ๋น„์Šค ์ด์šฉ์„
                ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
              </div>
            </li>
            <li class="terms__box">
              <div class="input__check">
                <input type="checkbox" name="agreement" id="allowPromotions" value="allowPromotions" />
                <label for="allowPromotions">ํ”„๋กœ๋ชจ์…˜ ์ •๋ณด ์ˆ˜์‹  ๋™์˜</label>
              </div>
              <div class="terms__content">
                JUN์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฒคํŠธ/ํ˜œํƒ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํœด๋Œ€์ „ํ™”(JUN์•ฑ ์•Œ๋ฆผ ๋˜๋Š” ๋ฌธ์ž), ์ด๋ฉ”์ผ๋กœ ๋ฐ›์•„๋ณด์‹ค ์ˆ˜
                ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์„œ๋น„์Šค(๋ณ„๋„ ํšŒ์› ์ฒด๊ณ„๋กœ ์šด์˜ํ•˜๊ฑฐ๋‚˜ JUN ๊ฐ€์ž… ์ดํ›„ ์ถ”๊ฐ€ ๊ฐ€์ž…ํ•˜์—ฌ ์ด์šฉํ•˜๋Š” ์„œ๋น„์Šค ๋“ฑ)์˜
                ๊ฒฝ์šฐ, ๊ฐœ๋ณ„ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋ณ„๋„ ์ˆ˜์‹  ๋™์˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ์—๋„ ์ˆ˜์‹  ๋™์˜์— ๋Œ€ํ•ด ๋ณ„๋„๋กœ ์•ˆ๋‚ดํ•˜๊ณ 
                ๋™์˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
              </div>
            </li>
          </ul>
          <button type="submit" class="next-button" disabled>ํ™•์ธ</button>
        </form>
      </div>
    </div>

* ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ์ฒดํฌ๋ฐ•์Šค์—  id์™€ value๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๊ธ€์˜ ๋ชฉ์ ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์˜ˆ์ œ๋ฅผ ์™„์„ฑํ•˜๋Š” ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— CSS ์Šคํƒ€์ผ๋ง์€ ๊ตณ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ œ ์™„์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํ•ด์„ํ•ด๊ฐ€๋ฉด์„œ ์ •๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฝ๊ด€ ๋™์˜ ์˜ˆ์ œ์˜ ๋กœ์ง์€

1. ๋ชจ๋‘ ๋™์˜๊ฐ€ ์ฒดํฌ๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํฌ๊ฐ€ ๋˜๊ณ  ํ•ด์ œ๋˜๋ฉด ๋ชจ๋‘ ํ•ด์ œ๊ฐ€ ๋˜์–ด์•ผ ํ•จ.

2. ํ•„์ˆ˜ ๋™์˜(2๊ฐœ)๊ฐ€ ์ฒดํฌ๋˜์–ด์•ผ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๊ณ  ํ•˜๋‚˜๋ผ๋„ ์ฒดํฌ๊ฐ€ ์•ˆ๋˜๋ฉด ๋ฒ„ํŠผ์€ ๋น„ํ™œ์„ฑํ™”.

3. ๋ชจ๋‘ ๋™์˜๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ‘์— 3๊ฐœ์˜ ์ฒดํฌ๋ฐ•์Šค๋กœ ์ผ์ผ์ด ์ฒดํฌํ–ˆ์„ ๋•Œ ๋ชจ๋‘ ๋™์˜ ์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•จ.

4. ๋ฐ˜๋Œ€๋กœ ๋ชจ๋‘ ์ฒดํฌ๋˜์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ ์ฒดํฌ๋ฐ•์Šค ํ•˜๋‚˜๋ผ๋„ ํ•ด์ œ๊ฐ€ ๋˜๋ฉด ๋ชจ๋‘ ๋™์˜ ์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋˜์–ด์•ผ ํ•จ.

์™„์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ

'use strict';

const form = document.querySelector('#form__wrap');
const checkAll = document.querySelector('.terms__check__all input');
const checkBoxes = document.querySelectorAll('.input__check input');
const submitButton = document.querySelector('button');

const agreements = {
  termsOfService: false,
  privacyPolicy: false,
  allowPromotions: false,
};

form.addEventListener('submit', (e) => e.preventDefault()); // ์ƒˆ๋กœ๊ณ ์นจ(submit) ๋˜๋Š” ๊ฒƒ ๋ง‰์Œ

checkBoxes.forEach((item) => item.addEventListener('input', toggleCheckbox));

function toggleCheckbox(e) {
  const { checked, id } = e.target;  
  agreements[id] = checked;
  this.parentNode.classList.toggle('active');
  checkAllStatus();
  toggleSubmitButton();
}

function checkAllStatus() {
  const { termsOfService, privacyPolicy, allowPromotions } = agreements;
  if (termsOfService && privacyPolicy && allowPromotions) {
    checkAll.checked = true;
  } else {
    checkAll.checked = false;
  }
}

function toggleSubmitButton() {
  const { termsOfService, privacyPolicy } = agreements;
  if (termsOfService && privacyPolicy) {
    submitButton.disabled = false;
  } else {
    submitButton.disabled = true;
  }
}

checkAll.addEventListener('click', (e) => {
  const { checked } = e.target;
  if (checked) {
    checkBoxes.forEach((item) => {
      item.checked = true;
      agreements[item.id] = true;
      item.parentNode.classList.add('active');
    });
  } else {
    checkBoxes.forEach((item) => {
      item.checked = false;
      agreements[item.id] = false;
      item.parentNode.classList.remove('active');
    });
  }
  toggleSubmitButton();
});

1. DOM

์šฐ์„  ์ฝ”๋“œ ์ƒ๋‹จ์— DOM ์š”์†Œ๋“ค์„ ์žก์•„์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

const form = document.querySelector('#form__wrap'); // ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” Form 
const checkAll = document.querySelector('.terms__check__all input'); // ๋ชจ๋‘ ๋™์˜ ์ฒดํฌ๋ฐ•์Šค
const checkBoxes = document.querySelectorAll('.input__check input'); // ๋ชจ๋‘ ๋™์˜๋ฅผ ์ œ์™ธํ•œ 3๊ฐœ์˜ ์ฒดํฌ๋ฐ•์Šค
const submitButton = document.querySelector('button'); // ํ™•์ธ ๋ฒ„ํŠผ

์•„๊นŒ ์œ„์—์„œ ๋งํ•œ ๋กœ์ง๋Œ€๋กœ 

์ฆ‰, ์ฒดํฌ๋ฐ•์Šค์— ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์„œ ๋ณ€ํ™”๋ฅผ ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ฒดํฌ๋˜๋Š” ์ฒดํฌ ๋ฐ•์Šค๋“ค์˜ True & False ๊ฐ’์œผ๋กœ ์ œ์–ด๋ฅผ ํ•˜๋ฉฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด Object๋ฅผ ์ด์šฉํ•ด HTML์—์„œ ์ž‘์„ฑํ•œ ์ฒดํฌ๋ฐ•์Šค ๊ฐ๊ฐ์˜ id์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•œ ํ›„ Default ๊ฐ’์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ๋Š”์ง€๋Š” ๊ณง ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

(์ฒดํฌ ๋ฐ•์Šค์˜ ์ฒดํฌ ์—ฌ๋ถ€(true & false)๋ฅผ ์ €์žฅํ•˜๋Š” ์ž„์‹œ ์ €์žฅ ๊ณต๊ฐ„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ผ๋‹จ ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

const agreements = {
  termsOfService: false, // ์ฒซ๋ฒˆ์งธ ํ•„์ˆ˜๋™์˜ ์ฒดํฌ๋ฐ•์Šค
  privacyPolicy: false, // ๋‘๋ฒˆ์งธ ํ•„์ˆ˜๋™์˜ ์ฒดํฌ๋ฐ•์Šค
  allowPromotions: false, // ์ด๋ฒคํŠธ ์ˆ˜์‹  ๋™์˜ ์ฒดํฌ๋ฐ•์Šค
};

2. ๋ชจ๋‘ ๋™์˜ CheckBox

์ด์ œ ํ•ด์•ผ ํ• ๊ฒƒ์€ '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํฌ๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  ์ฒดํฌ๋ฐ•์Šค์˜  ์ฒดํฌ๋ฅผ ํ•˜๊ณ , '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋˜๋ฉด ๋ชจ๋“  ์ฒดํฌ ๋ฐ•์Šค์˜ ์ฒดํฌ์ƒํƒœ๋ฅผ ํ•ด์ œ๋˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ๋ฒ„ํŠผ๋„ ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๋Š” ์กฐ๊ฑด์€ 'ํ•„์ˆ˜ ๋™์˜'๊ฐ€ ๋ชจ๋‘ ์ฒดํฌ๋˜์–ด์•ผ ํ™œ์„ฑํ™”๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๋จผ์ € ์„ค๋ช…ํ•˜๋ฉด '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌ ๋˜๋Š” ํ•ด์ œํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  ์ฒดํฌ ๋ฐ•์Šค๋“ค์„ ์ฒดํฌ ๋˜๋Š” ํ•ด์ œํ•˜๊ณ  ๊ทธ ์ฒดํฌ ์ƒํƒœ๋ฅผ ์œ„์— ์ž‘์„ฑํ•œ Object์— ๋ณด๋‚ด์ฃผ๊ณ  ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

checkAll.addEventListener('click', (e) => {
  const { checked } = e.target;
  if (checked) {
    checkBoxes.forEach((item) => {
      item.checked = true;
      agreements[item.id] = true;
      item.parentNode.classList.add('active');
    });
  } else {
    checkBoxes.forEach((item) => {
      item.checked = false;
      agreements[item.id] = false;
      item.parentNode.classList.remove('active');
    });
  }
  toggleSubmitButton();
});

'๋ชจ๋‘ ๋™์˜' ์ฒดํฌ ๋ฐ•์Šค์— click event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

click์„ ํ•˜๋ฉด event๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์š”์†Œ๊ฐ€ event์˜ target์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, e.target์€ '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ๋ฐ•์Šค ์š”์†Œ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

 

e.target์˜ ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๊ฑฐ๋‚˜ ๋” ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

developer.mozilla.org/ko/docs/Web/API/Event/target

 

Event.target - Web API | MDN

Event interface์˜ target ์†์„ฑ์€  event๊ฐ€ ์ „๋‹ฌํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฒคํŠธ์˜ ๋ฒ„๋ธ”๋ง ๋˜๋Š” ์บก์ฒ˜ ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Event.currentTarget์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.event.target ์†์„ฑ์„ ์‚ฌ์šฉ

developer.mozilla.org

const { checked } = e.target;

๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด ES6 ๋ฌธ๋ฒ•์ธ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ target์˜ checked ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ–ˆ๋Š”๋ฐ

(CheckBox์˜ ์ฒดํฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” checked๋Š” true(์ฒดํฌใ…‡) & false(์ฒดํฌ x ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.)

const checked = e.target.checked;

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

yong-nyong.tistory.com/4

 

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(Destructuring) | ES6+

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ ๋‚ด๊ฐ€ ์ตœ๊ทผ์— Vanilla JavaScript๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ES6 ๋ฌธ๋ฒ•์ธ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(Destructuring)์ด๋‹ค. ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(Destructuring)์„ ์ด์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด,

yong-nyong.tistory.com

์ด์ œ '์ฒดํฌ'๊ฐ€ ๋˜๋ฉด ์ˆ˜ํ–‰๋ฌธ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋‹ˆ๊น ์•„๋ž˜์™€ ๊ฐ™์ด if๋ฌธ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

if (checked) {
    checkBoxes.forEach((item) => {
      item.checked = true;
      agreements[item.id] = true;
      item.parentNode.classList.add('active');
    });
  } else {
    checkBoxes.forEach((item) => {
      item.checked = false;
      agreements[item.id] = false;
      item.parentNode.classList.remove('active');
    });
  }

event target์—์„œ ๋ฐ›์€ checked์˜ ๊ฐ’์ด True (์ฒดํฌ) ๋ฉด forEach๋ฌธ์„ ํ†ตํ•ด ์ฒดํฌ ๋ฐ•์Šค ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๋Œ๋ ค์„œ ์ˆ˜ํ–‰์„ ํ•ฉ๋‹ˆ๋‹ค.

 

(forEach์— ๋Œ€ํ•ด ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์•„๋ž˜์˜ ๋งํฌ ์ฐธ๊ณ )

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

 

Array.prototype.forEach() - JavaScript | MDN

forEach() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด ์š”์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://git

developer.mozilla.org

 if (checked) {
    checkBoxes.forEach((item) => {
      item.checked = true;
      agreements[item.id] = true;
      item.parentNode.classList.add('active');
    });
  }

item(์ฒดํฌ๋ฐ•์Šค)์˜ checked๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ( checked๋ฅผ true๋ฅผ ์ฃผ๋ฉด ์ฒดํฌ ๋ฐ•์Šค๋Š” ์ฒดํฌ๊ฐ€ ๋จ.)

๊ทธ๋‹ค์Œ ์œ„์—์„œ ์ž‘์„ฑํ•œ Object์—์„œ ์ฒดํฌ๋ฐ•์Šค์˜ id๊ฐ’๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ item์˜ id๊ฐ’์„ ๋ฐ›์•„์™€์„œ Object์—์„œ ์ž‘์„ฑํ•œ id๊ฐ’๊ณผ ๋™์ผํ•œ ๋ถ€๋ถ„์— true ๊ฐ’์„ ๋„ฃ์–ด ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

agreements[item.id] = true;

์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ฃผ๋Š” ์ด์œ ๋Š” if๋ฌธ์„ ์ˆ˜ํ–‰ํ•œ ํ›„,

์ฒดํฌ๋ฐ•์Šค์˜ ์ฒดํฌ ์—ฌ๋ถ€(true & false)๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”ํ• ์ง€ ๋น„ํ™œ์„ฑํ™”ํ• ์ง€ ์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ด์ œ else ๋ถ€๋ถ„์€ ๋ฐ˜๋Œ€๋กœ ์ฒดํฌ๊ฐ€ ํ•ด์ œ๋˜๋ฉด ๋ฐ˜๋Œ€๋กœ ์ฒดํฌ๋ฐ•์Šค ์š”์†Œ๋“ค์„ forEach๋ฌธ์„ ๋Œ๋ ค ์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ์š”์†Œ์˜ id์˜ Objcet ๊ฐ’๋“ค์„ false๋กœ ๋ณด๋‚ธ๋‹ค๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

else {
    checkBoxes.forEach((item) => {
      item.checked = false;
      agreements[item.id] = false;
      item.parentNode.classList.remove('active');
    });
  }
  toggleSubmitButton();

์ด์ œ if๋ฌธ์ด ๋๋‚˜๊ฒŒ ๋˜๋ฉด ๋ฐ”๋กœ toggleSubmitButton(); ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

3. ํ•„์ˆ˜ ๋™์˜ ์ฒดํฌ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” or ๋น„ํ™œ์„ฑํ™”

์ด ํ•จ์ˆ˜๋Š” 'ํ•„์ˆ˜ ๋™์˜' ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ ๋’ค ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”, ๋น„ํ™œ์„ฑํ™” ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

function toggleSubmitButton() {
  const { termsOfService, privacyPolicy } = agreements;
  if (termsOfService && privacyPolicy) {
    submitButton.disabled = false;
  } else {
    submitButton.disabled = true;
  }
}

์œ„์—์„œ ์ž‘์„ฑํ•œ agreements Object์˜ 'ํ•„์ˆ˜ ๋™์˜' ์š”์†Œ๋“ค์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ณ€์ˆ˜์— ๋‹ด์Šต๋‹ˆ๋‹ค.

 const { termsOfService, privacyPolicy } = agreements;

์ด 'ํ•„์ˆ˜ ๋™์˜' ์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ๋‘˜ ๋‹ค true(์ฒดํฌ) ์ด๋ฉด ๋ฒ„ํŠผ์˜ disabled๋ฅผ false๋กœ ๋ฐ”๊พธ์–ด ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

if (termsOfService && privacyPolicy) {
    submitButton.disabled = false; // ๋ฒ„ํŠผ ํ™œ์„ฑํ™”
  } else {
    submitButton.disabled = true; // ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
  }

'๋ชจ๋‘ ๋™์˜' ์ฒดํฌ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ์ž‘์„ฑ์ด ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4. 3๊ฐœ์˜ ์ฒดํฌ ๋ฐ•์Šค์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ

์ด์ œ ๋‚˜๋จธ์ง€ 3๊ฐœ์˜ ์ฒดํฌ ๋ฐ•์Šค์˜ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

checkBoxes.forEach((item) => item.addEventListener('input', toggleCheckbox));

function toggleCheckbox(e) {
  const { checked, id } = e.target;  
  agreements[id] = checked;
  this.parentNode.classList.toggle('active');
  checkAllStatus();
  toggleSubmitButton();
}

 ์ฒดํฌ ๋ฐ•์Šค์— input ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค toggledCheckbox(); ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.

checkBoxes.forEach((item) => item.addEventListener('input', toggleCheckbox));

์—ฌ๊ธฐ์„œ input ์ด๋ฒคํŠธ๋Š” <input>, <select> ๋ฐ <textarea> ์š”์†Œ์˜ value ์†์„ฑ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

input ์ด๋ฒคํŠธ์— ๋” ๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜, input ์ด๋ฒคํŠธ์™€ change ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ฐจ์ด๊ฐ€ ๊ถ๊ธˆํ•˜๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

developer.mozilla.org/ko/docs/Web/API/HTMLElement/input_event

 

HTMLElement: input event - Web API | MDN

input ์ด๋ฒคํŠธ๋Š” ,   ๋ฐ  ์š”์†Œ์˜ value ์†์„ฑ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ํ•œ, ์ด ์ด๋ฒคํŠธ๋Š” ์•„๋ฌด ์š”์†Œ์˜ contenteditable ์†์„ฑ ๋ฐ designMode ์†์„ฑ์ด ํ™œ์„ฑํ™” ๋˜์–ด๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ, contenteditable

developer.mozilla.org

toggleCheckbox ํ•จ์ˆ˜๋Š” input ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ์š”์†Œ๋ฅผ ๋ฐ›์•„์™€ id์™€ checked(์ฒดํฌ ์ƒํƒœ) ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋‹ด๊ณ  agreements Object์— id๊ฐ’๊ณผ ๋™์ผํ•œ ๊ณณ์— checked ๊ฐ’์„ ๋„ฃ์–ด์ค€ ๋‹ค์Œ์— checkAllStatus()๋ฅผ ์‹คํ–‰ํ•˜๊ณ  toggleSubmitButton() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

function toggleCheckbox(e) {
  const { checked, id } = e.target; 
  agreements[id] = checked;
  this.parentNode.classList.toggle('active'); // ์—ฌ๊ธฐ์„  ์ค‘์š”ํ•˜์ง€ ์•Š์Œ
  checkAllStatus();
  toggleSubmitButton();
}

checkAllStatus() ํ•จ์ˆ˜๋Š” 3๊ฐœ์˜ ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์„œ '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ ๋ฐ•์Šค์˜ ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ ์ •ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

function checkAllStatus() {
  const { termsOfService, privacyPolicy, allowPromotions } = agreements;
  if (termsOfService && privacyPolicy && allowPromotions) {
    checkAll.checked = true;
  } else {
    checkAll.checked = false;
  }
}

 agreements Object์˜ ์š”์†Œ๋“ค์„ ๋ณ€์ˆ˜๋กœ ๋‹ด๊ณ  

const { termsOfService, privacyPolicy, allowPromotions } = agreements;

3๊ฐœ์˜ ์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ๋ชจ๋‘ ์ฒดํฌ ์ƒํƒœ์ด๋ฉด '๋ชจ๋‘ ๋™์˜' ์ฒดํฌ ๋ฐ•์Šค์˜ ์ฒดํฌ ์ƒํƒœ๋ฅผ true(์ฒดํฌ)๋กœ ํ•ด์ฃผ๊ณ  ํ•˜๋‹ˆ๋ฉด false(์ฒดํฌ ํ•ด์ œ)ํ•ฉ๋‹ˆ๋‹ค.

if (termsOfService && privacyPolicy && allowPromotions) {
    checkAll.checked = true;
  } else {
    checkAll.checked = false;
  }

๊ทธ๋ฆฌ๊ณ , toggleSubmitButton(); ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(์ด ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•จ (๋ฒ„ํŠผ ํ™œ์„ฑํ™”, ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜)

 

์ด๋กœ์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ํ™•์ธํ•ด ๋ณด๋ฉด ์ƒ๊ฐํ•œ ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“• ๋งˆ๋ฌด๋ฆฌ

+ ๋งŽ์€ ๋ถ„๋“ค์ด ํ•„์š”๋กœ ํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ฝ”๋“œ ์˜ˆ์ œ๋„ ์ฝ”๋“œ ์ƒŒ๋“œ๋ฐ•์Šค ๋งํฌ ์ฒจ๋ถ€ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

(ํ™•์ธ ๊ฒฐ๊ณผ ๋ฐ”๋กœ ์ ‘์†ํ•ด์„œ ํ™•์ธํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งํฌ ๋“ค์–ด๊ฐ€์…”์„œ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจ ํ•œ๋ฒˆ ํ•ด์ฃผ์‹œ๋ฉด ์ •์ƒ ์ž‘๋™ ํ•  ๊ฒ๋‹ˆ๋‹ค.)

codesandbox.io/s/agreement-l5uc6

 

Agreement - CodeSandbox

Agreement by Yongveloper using parcel-bundler

codesandbox.io

์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค€ ํ›„, ์ฝ”๋“œ์˜ ๋™์ž‘ ์›๋ฆฌ, ์ˆœ์„œ, ๋กœ์ง์— ๋Œ€ํ•ด์„œ ์„ค๋ช…์„ ํ•˜๋ฉด์„œ Vanilla ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์ž‘์„ฑํ•œ  ํšŒ์›๊ฐ€์ž…, ์•ฝ๊ด€ ๋™์˜ ์˜ˆ์ œ์˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ฆฌ๋Š” ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

 

 

(๋ณธ ๊ธ€์€ ์œ ํŠœ๋ฒ„ '๊น€๋ฒ„๊ทธ' ๋‹˜์˜ ์˜ˆ์ œ๋ฅผ ํ™œ์šฉ, ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!