[JS] ์‹ค์Šต-DatePicker

์ •์„ธ์€ยท2022๋…„ 11์›” 29์ผ

training

๋ชฉ๋ก ๋ณด๊ธฐ
4/5

๐Ÿ“Œ Date-picker ๊ตฌํ˜„

  • ํ˜„์žฌ ๋…„๋„์™€ ๋‹ฌ์˜ ์ด๋ฆ„์„ ํ‘œ์‹œํ•œ๋‹ค.
  • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ด์ „ ๋‹ฌ๊ณผ ๋‹ค์Œ ๋‹ฌ๋กœ ์ด๋™ํ•œ๋‹ค.
  • ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ธ ๋‹ฌ์— ์˜ค๋Š˜ ๋‚ ์งœ๊ฐ€ ์žˆ์œผ๋ฉด ๊ตฌ๋ถ„ํ•ด ์ค€๋‹ค.
  • ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ธ ๋‹ฌ์˜ 1์ผ ์•ž๊ณผ ๋ง์ผ ๋’ค์— ์ด์ „ ๋‹ฌ๊ณผ ๋‹ค์Œ ๋‹ฌ์˜ ๋‚ ์งœ๋กœ ์ฑ„์šด๋‹ค.
  • ๋‚ ์งœ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๋‚ ์งœ๋ฅผ 'yyyy-mm-dd'ํ˜•์‹์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค.
  • ์บ˜๋ฆฐ๋” ์ด์™ธ์˜ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด ์บ˜๋ฆฐ๋”๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
  • Date picker์˜ ๊ฐ’์ด ์กด์žฌํ•  ๋•Œ Date picker๋ฅผ ๋‹ค์‹œ ํด๋ฆญํ•˜๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์บ˜๋ฆฐ๋”๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

Date picker๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋˜ ์ค‘์— ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊ฒผ๋‹ค.
calendarNavElement์— appendChild๋กœ ์™ผ์ชฝ ํ™”์‚ดํ‘œ ๋ฒ„ํŠผ์„ ๋„ฃ์–ด์ฃผ๊ณ ,
innerHTML์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์™ผ์ชฝ ํ™”์‚ดํ‘œ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

const leftNavElement = document.createElement("div");
leftNavElement.className = "triangle-left";

leftNavElement.addEventListener('click', function () {
	const calendar = Calendar(new Date(nowDate.setMonth(nowDate.getMonth() - 1)));
	calendar.classList.remove("hidden");
	element.replaceWith(calendar);
});

calendarNavElement.appendChild(leftNavElement);

calendarNavElement.innerHTML=`
  <div class="view-month-year">
    <div class="month">${monthList}</div>
    <div class="year">${nowYear}</div>
  </div>
`;
์ดํ•˜ ์ƒ๋žต ...

๊ทธ๋ž˜์„œ ๋‚˜๋Š” innerHTML ๋Œ€์‹  insertAdjacentHTML์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค.

โ“insertAdjacentHTML์ด๋ž€?

โœ”๏ธ ๋จผ์ €, insertAdjacentHTML์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์ด๋‹ค.

element.insertAdjacentHTML(position, text);
  • position์€ ์•„๋ž˜์— ์žˆ๋Š” ๋‹จ์–ด๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

    • 'beforebegin' : element ์•ž์—
    • 'afterbegin' : element ์•ˆ์— ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ child
    • 'beforeend' : element ์•ˆ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ child
    • 'afterend' : element ๋’ค์—
  • text๋Š” ํ•ด๋‹น ์œ„์น˜์— ์‚ฝ์ž… ๋  HTML์š”์†Œ์˜ text ๊ฐ’์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

โœ”๏ธ insertAdjacentHTML์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ๋…ธ๋“œ๋Š” ๊ฑด๋“ค์ง€ ์•Š๊ณ  ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด๊ฒƒ์ด innerHTML๊ณผ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค.

innerHTML ์†์„ฑ์€ ๊ธฐ์กด์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ํ›„์— ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— innerHTML์— ๊ฐ’์ด ํ• ๋‹น๋  ๋•Œ ๋งˆ๋‹ค DOM Tree๋Š” ์ƒˆ๋กœ ๊ทธ๋ ค์ง€๊ฒŒ ๋œ๋‹ค.
ํ•˜์ง€๋งŒ insertAdjacentHTML ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ธ element๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํŠน์ • ์œ„์น˜์— DOM Tree ์•ˆ์— ์›ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด์„œ, innerHTML์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด์— ์žˆ๋Š” ๊ฒƒ์€ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋˜๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
์•„๋ž˜์— insertAdjacentHTML ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์™€ ๊ฒฐ๊ณผ ํ™”๋ฉด์ด๋‹ค.

const leftNavElement = document.createElement("div");
leftNavElement.className = "triangle-left";

leftNavElement.addEventListener('click', function () {
	const calendar = Calendar(new Date(nowDate.setMonth(nowDate.getMonth() - 1)));
	calendar.classList.remove("hidden");
	element.replaceWith(calendar);
});

calendarNavElement.appendChild(leftNavElement);

// innerHTML -> insertAdjacentHTML ๋ณ€๊ฒฝ
calendarNavElement.insertAdjacentHTML('beforeend', `       
  <div class="view-month-year">
    <div class="month">${monthList}</div>
    <div class="year">${nowYear}</div>
  </div>
`);
์ดํ•˜ ์ƒ๋žต ...

calendarNavElement์— appendChild๋กœ ๋„ฃ์–ด์ค€ leftNavElement๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ  : https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML

Github Repository ์ด๋™

0๊ฐœ์˜ ๋Œ“๊ธ€