๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/JavaScript jQuery

[JavaScript / jQuery] ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ form ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 3. 7.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์ด๋ฒˆ์—๋Š” ์ƒํ’ˆ์„ ํƒ ํผ์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
  • ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๋กœ๋Š” ์…”์ธ ์™€ ๋ฐ”์ง€๊ฐ€ ์žˆ๊ณ , ๊ฐ๊ฐ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์ด์ฆˆ ์„ ํƒ์ฐฝ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์ด์ฆˆ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค.

๐Ÿ’œ HTML

<form class="container my-5">
    <div class="form-group">

      <p>์ƒํ’ˆ ์„ ํƒ</p>
      <select class="form-control" id="option1">
        <option>์…”์ธ </option>
        <option>๋ฐ”์ง€</option>
      </select>
      <div class="size-select">
        <p class="mt-4">์‚ฌ์ด์ฆˆ ์„ ํƒ</p>
        <select class="form-control" id="option2">
        </select>
      </div>
      
    </div>
</form>
  • JavaScript ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒŒ ๋ชฉ์ ์ด๋ฏ€๋กœ ๋””์ž์ธ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ Bootstrap ์—์„œ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐํ–ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ์„ ํ•ด์„œ html ํŒŒ์ผ์— ๋„ฃ์—ˆ์—ˆ์ง€๋งŒ, ์ถ”ํ›„ JavaScript ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด์„œ ์‚ฌ์ด์ฆˆ ์„ ํƒ ๋ถ€๋ถ„์€ ์ˆ˜์ •ํ•ด๋ณด์•˜๋‹ค. 

๐Ÿ’œ JavaScript

// * input ์ด๋ฒคํŠธ
// ๊ฐ’์„ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ๋ฐœ์ƒ

// * change ์ด๋ฒคํŠธ
// ์š”์†Œ ๋ณ€๊ฒฝ์ด ๋๋‚˜๋ฉด ์ด๋ฒคํŠธ ๋ฐœ์ƒ
// ํ…์ŠคํŠธ ์ž…๋ ฅ ์š”์†Œ์˜ ๊ฒฝ์šฐ focus ๋ฅผ ์žƒ์œผ๋ฉด ์ด๋ฒคํŠธ ๋ฐœ์ƒ
// select, input type=checkbox, input type=radio ์ธ ๊ฒฝ์šฐ ์„ ํƒ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„์— ์ด๋ฒคํŠธ ๋ฐœ์ƒ


// * ๋ฐ์ดํ„ฐ
let shirtSize = [80, 85, 90, 95, 100, 105];
let pantsSize = [24, 26, 28, 30, 32, 34, 36];

// * ์ดˆ๊ธฐ ํ™”๋ฉด
shirtSize.forEach(size => {
    let template = `<option>${size}</option>`
    $('#option2').append(template);
})

// * ์‚ฌ์ด์ฆˆ ์„ ํƒ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ๊ธฐ๋Šฅ
$('#option1').on('change', function(e){

    $('#option2').html('');

    if($('#option1').val() === "์…”์ธ "){
        shirtSize.forEach(size => {
            let template = `<option>${size}</option>`
            $('#option2').append(template);
        })
    } else if($('#option1').val() === "๋ฐ”์ง€"){
        pantsSize.forEach(size => {
            let template = `<option>${size}</option>`
            $('#option2').append(template);
        })
    }

})
  • ์ด๋ฒˆ ์‹œ๊ฐ„์— ๋ฐฐ์šด ์ด๋ฒคํŠธ๋กœ๋Š” input ์ด๋ฒคํŠธ์™€ change ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค. ๋‘˜์€ ๋น„์Šทํ•˜๋ฉด์„œ๋„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ค๋ฅธ๋ฐ
    • ๋จผ์ € input ์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฐ˜๋ฉด, change ์ด๋ฒคํŠธ๋Š” ํ…์ŠคํŠธ ์ž…๋ ฅ ์š”์†Œ์ธ ๊ฒฝ์šฐ focus ๋ฅผ ์žƒ์„ ๋•Œ, select ํƒœ๊ทธ๋‚˜ input ํƒœ๊ทธ ์ค‘ type ์ด checkbox, radio ์ธ ๊ฒฝ์šฐ์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„์— ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋จผ์ €, ์‚ฌ์ด์ฆˆ ์„ ํƒ ๋ฆฌ์ŠคํŠธ์— ๋‚˜์˜ฌ ์…”์ธ  ์‚ฌ์ด์ฆˆ์™€ ๋ฐ”์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„์ค€๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, id ๊ฐ€ option1 ์ธ ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ change ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ, id ๊ฐ€ option1 ์ธ ํƒœ๊ทธ์˜ ๋‚ด์šฉ์ด ์…”์ธ ์ธ ๊ฒฝ์šฐ์™€ ๋ฐ”์ง€์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์ด์ฆˆ๋“ค์„ html ํ˜•์‹์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  • html ํ˜•์‹์œผ๋กœ ๋„ฃ์–ด์ค„ ๋•Œ๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ๋“ค์ด shirtsSize ๋ฐฐ์—ด์ด๋“ , pantsSize ๋ฐฐ์—ด์ด๋“  ๋ฐฐ์—ด ์š”์†Œ๋“ค์— ์ฐจ๋ก€์ฐจ๋ก€ ์ ์šฉ๋˜๋„๋ก forEach ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ์ด ๋•Œ, template ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฐ์—ด์— ๋‹ด๊ธด ์ˆœ์„œ๋Œ€๋กœ ์˜ต์…˜๊ฐ’์„ option ํƒœ๊ทธ์— ๋‹ด์•„์ค€๋‹ค.
    • template ๋ณ€์ˆ˜๋ฅผ id ๊ฐ€ option2 ์ธ ํƒœ๊ทธ์— ๋ถ™์—ฌ์ค€๋‹ค.
  • ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•˜๋ฉด ๊ฐ’์€ ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์ง€๋งŒ ์ƒํ’ˆ ์„ ํƒ์„ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ์ ์  ๋Š˜์–ด๋‚˜๋Š” ์˜ต์…˜๊ฐ’์„ ๋ณด๊ฒŒ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋‹ค๋ฅธ ์ƒํ’ˆ์„ ์„ ํƒํ–ˆ์„ ๋•Œ๋Š” ์ƒํ’ˆ ๋ชฉ๋ก์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ์˜ต์…˜๊ฐ’๋“ค์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก  $('#option2').html(''); ์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋งˆ๋ฌด๋ฆฌ๋กœ, html ํŒŒ์ผ ๋‚ด ํ•˜๋“œ์ฝ”๋”ฉ ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ์ดˆ๊ธฐํ™”๋ฉด์—์„œ ์…”์ธ ์˜ ์‚ฌ์ด์ฆˆ ์„ ํƒ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ๋„๋ก JavaScript ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ข€ ๋” ์ˆ˜์ •ํ•˜๋ฉด ํ™•์žฅ์„ฑ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๊ฑด ์ข€ ๋” ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹œ๋„ํ•ด๋ด์•ผ๊ฒ ๋‹ค. ์•„์ง ๊ณต๋ถ€ํ•ด์•ผํ•  ๊ฒŒ ๋งŽ์•„์„œ ์ง€๊ธˆ ๋‹น์žฅํ•˜๊ธฐ์—”..ใ…œใ…œ
728x90
๋ฐ˜์‘ํ˜•