[miniProjects] 13_Random Choice Picker

๋ณด๋ฆฌยท2023๋…„ 6์›” 16์ผ
0

miniProjects

๋ชฉ๋ก ๋ณด๊ธฐ
14/47

13_Random Choice Picker

๐Ÿ’ป ์ฃผ์ œ : ์ž…๋ ฅ๋ž€์— ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•˜๋‹จ์— ํƒœ๊ทธ๊ฐ€ ์ƒ๊น€. ์ฝค๋งˆ(,)๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

  • ๋ฌด์ž‘์œ„๋กœ ํ•˜์ด๋ผ์ดํŠธ๋ฅผ ๋„ฃ์„ ํƒœ๊ทธ๋ฅผ ๊ณ ๋ฆ„.
  • classList์˜ add, remove๋กœ ํ•˜์ด๋ผ์ดํŠธ๋ฅผ ์ค€๋‹ค.


const tagsEl = document.getElementById('tags');
const textarea = document.getElementById('textarea');

// ํ…์ŠคํŠธ ์˜์—ญ : ํŽ˜์ด์ง€๋กœ ๊ฐ€๋ฉด ์ž๋™์œผ๋กœ ์ปค์„œ๊ฐ€ ๋‚˜์˜ค๊ณ  ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Œ.
textarea.focus();

textarea.addEventListener('keyup', (e) => {
  createTags(e.target.value)

  if(e.key === 'Enter') {
      setTimeout(() => {
          e.target.value = ''
      }, 10)

      randomSelect()
  }
})

function createTags(input) {
  // ํƒœ๊ทธ๋ฅผ ์‰ผํ‘œ๋กœ ๋‚˜๋ˆ”.
  // ๋นˆ์นธ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š๋„๋ก trim ํ•จ์ˆ˜๋ฅผ ์”€.
  const tags = input.split(',').filter(tag => tag.trim() !== '').map(tag => tag.trim())
  
  tagsEl.innerHTML = ''

  tags.forEach(tag => {
      const tagEl = document.createElement('span')
      tagEl.classList.add('tag')
      tagEl.innerText = tag
      tagsEl.appendChild(tagEl)
  })
}
  • textarea.focus()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ…์ŠคํŠธ ์˜์—ญ์— ํฌ์ปค์Šค๋ฅผ ์คŒ.
  • textarea.addEventListener('keyup', (e) => { ... })๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ์˜์—ญ์˜ ํ‚ค ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ์ด๋ฒคํŠธ๋Š” ํ‚ค๊ฐ€ ๋ˆŒ๋ ค์งˆ ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋ฉฐ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” e๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์œผ๋ฉฐ, ํ‚ค ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” createTags(e.target.value)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. e.target.value๋Š” ํ…์ŠคํŠธ ์˜์—ญ์˜ ์ž…๋ ฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • if(e.key === 'Enter') { ... }๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Enter ํ‚ค๊ฐ€ ๋ˆŒ๋ ธ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ฒ˜๋ฆฌ. setTimeout(() => { e.target.value = '' }, 10)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 10ms ํ›„์— ํ…์ŠคํŠธ ์˜์—ญ์˜ ๊ฐ’์„ ๋น„์šด๋‹ค. ๊ทธ ํ›„, randomSelect() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž„์˜์˜ ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • createTags(input) ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋จผ์ €, ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•œ๋‹ค. filter() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๋ฐฑ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š๋„๋ก ๊ฐ ํƒœ๊ทธ์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํƒœ๊ทธ๋งŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ๊ทธ ํ›„, map() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํƒœ๊ทธ์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • tagsEl.innerHTML = ''๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „์— ์ƒ์„ฑ๋œ ํƒœ๊ทธ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ.
  • tags.forEach(tag => { ... })๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํƒœ๊ทธ์— ๋Œ€ํ•ด span ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ํ…์ŠคํŠธ๋กœ ์„ค์ •ํ•œ ํ›„ tagsEl ์š”์†Œ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ƒ์„ฑ๋œ ํƒœ๊ทธ๋Š” tag ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •๋œ๋‹ค.

โ—์ฝœ๋ฐฑํ•จ์ˆ˜

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜(callback function)๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌ๋˜์–ด ๋‚˜์ค‘์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜. ์ฆ‰, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์„œ ์ „๋‹ฌ๋˜์–ด ํŠน์ • ์‹œ์ ์ด๋‚˜ ์กฐ๊ฑด์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋‹ค.

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠนํžˆ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ํƒ€์ด๋จธ ์ œ์–ด, AJAX ์š”์ฒญ ๋“ฑ์—์„œ ์ž์ฃผ ํ™œ์šฉ๋œ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์€ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค์Œ ์ž‘์—…์ด ์ง„ํ–‰๋˜์–ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•œ๋ฐ, ์ด๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๐Ÿ‘๐Ÿป์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ต๋ช… ํ•จ์ˆ˜(anonymous function)๋กœ ์ „๋‹ฌ๋˜๊ธฐ๋„ ํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

profile
์ •์‹ ์ฐจ๋ ค ์ด ๊ฐ๋ฐ•ํ•œ ์„ธ์ƒ์†์—์„œ

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