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

[JavaScript / jQuery] ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ์‘์šฉ๊ณผ dataset ํ™œ์šฉํ•˜๊ธฐ

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

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

  • ์˜ค๋Š˜์€ ์ด์ „์— ๋งŒ๋“ค์—ˆ๋˜ ํƒญ ๊ธฐ๋Šฅ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๊ฐœ์„ ํ•ด๋ณด์•˜๋‹ค.

๐Ÿ’œ JavaScript : ๊ธฐ์กด

for (let i = 0; i < $('.tab-button').length; i++){
        $('.tab-button').eq(i).on('click', function(){
            $('.tab-button').removeClass('active');
            $('.tab-content').removeClass('show');
            $('.tab-button').eq(idx).addClass('active');
            $('.tab-content').eq(idx).addClass('show');
    })
}
  • ๊ธฐ์กด์˜ JavaScript ์ฝ”๋“œ๋Š” for ๋ฌธ ์•ˆ์— ๋„ฃ์„ ๊ธฐ๋Šฅ๋“ค์„ ๋‹จ์ˆœํžˆ ๋‚˜์—ดํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

๐Ÿ’œ JavaScript : 1์ฐจ ์ˆ˜์ •

function openTab(idx){
    $('.tab-button').removeClass('active');
    $('.tab-content').removeClass('show');
    $('.tab-button').eq(idx).addClass('active');
    $('.tab-content').eq(idx).addClass('show');
}

for (let i = 0; i < $('.tab-button').length; i++){
        $('.tab-button').eq(i).on('click', function(){
            openTab(i);
    })
}
  • 1์ฐจ๋กœ ์ˆ˜์ •ํ•œ ๋ฒ„์ „์€ ์–ผํ•๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์กŒ์ง€๋งŒ... ํƒญ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•œ ํ›„, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ  for ๋ฌธ ์•ˆ์— ๋„ฃ์–ด์„œ ํ•จ์ˆ˜๋ช…์„ ๋ณด๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์ธ์ง€ ๋ฐ”๋กœ ์ถ”์ธก์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ข€ ๋” ๋ช…๋ฃŒํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

๐Ÿ’œ JavaScript : 2์ฐจ ์ˆ˜์ •

  • 2์ฐจ๋กœ ์ˆ˜์ •ํ•œ ๋ฒ„์ „์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ํ˜„์ƒ๊ณผ dataset์„ ํ™œ์šฉํ•˜์˜€๋‹ค.
  • ์šฐ์„  ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ์ •์˜ํ•˜์ž๋ฉด, ํŠน์ • ํ™”๋ฉด ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ƒ์œ„์— ํ•ด๋‹นํ•˜๋Š” ํ™”๋ฉด ์š”์†Œ๋“ค๋กœ ์—ฐ๋‹ฌ์•„ ์ „๋‹ฌ๋˜์–ด ๊ฐ€๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค. (์ฐธ๊ณ ๋กœ ์ด๋ฒคํŠธ ์บก์ฒ˜๋ง์€ ์ด ๋ฐ˜๋Œ€ํ˜„์ƒ์„ ์˜๋ฏธํ•œ๋‹ค.)
    <div class="container mt-5">
        <ul class="list">
            <li class="tab-button active" data-id="0">Products</li>
            <li class="tab-button" data-id="1">Information</li>
            <li class="tab-button" data-id="2">Shipping</li>
        </ul>
    
        <div class="tab-content show">
            <p>์ƒํ’ˆ์„ค๋ช…์ž…๋‹ˆ๋‹ค. Product</p>
        </div>
        <div class="tab-content">
            <p>์ƒํ’ˆ์ •๋ณด์ž…๋‹ˆ๋‹ค. Info</p>
        </div>
        <div class="tab-content">
            <p>๋ฐฐ์†ก์ •๋ณด์ž…๋‹ˆ๋‹ค. Shipping</p>
        </div>
    </div>
  • ์ฆ‰, tab-button ์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ tab-button ํด๋ž˜์Šค๋ฅผ ๋ฌถ๊ณ  ์žˆ๋Š” list ํด๋ž˜์Šค๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , ๋˜ ๊ทธ ์œ„์˜ container ํด๋ž˜์Šค์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
function openTab(idx){
    $('.tab-button').removeClass('active');
    $('.tab-content').removeClass('show');
    $('.tab-button').eq(idx).addClass('active');
    $('.tab-content').eq(idx).addClass('show');
}

$('.list').click(function(e){
    openTab(e.target.dataset.id);
})

// e.target : ์ง€๊ธˆ ์‹ค์ œ๋กœ ํด๋ฆญํ•œ ์š”์†Œ, JavaScript ๋ฌธ๋ฒ•
// e.currentTarget : ์ง€๊ธˆ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋‹ฌ๋ ค์žˆ๋Š” ์š”์†Œ, JavaScript ๋ฌธ๋ฒ•
// this : e.currentTarget ๊ณผ ๋™์ผ, JavaScript ๋ฌธ๋ฒ•
// $(this) : e.currentTarget ๊ณผ ๋™์ผ, jQuery ๋ฌธ๋ฒ•
// e.preventDefault() : ๊ธฐ๋ณธ๋™์ž‘์„ ๋ง‰๋Š” ํ•จ์ˆ˜, JavaScript ๋ฌธ๋ฒ•
  • ๊ทธ๋ž˜์„œ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ์‘์šฉํ•˜์ž๋ฉด tab-button ์„ ํด๋ฆญํ•˜๋ฉด ์–ด์ฐจํ”ผ list ํด๋ž˜์Šค๊ฐ€ ํด๋ฆญ๋ ํ…Œ๋‹ˆ, ์•„์˜ˆ list ํด๋ž˜์Šค์— ํด๋ฆญ์ด๋ผ๋Š” ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‹ฌ์•„๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  list ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ tab-button ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํด๋ฆญํ•œ tab-button ์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ํƒญ์„ openTab ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ด ์ƒ๊ธด๋‹ค. ์™œ ๊ตณ์ด.. tab-button ํด๋ž˜์Šค์— ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‹ฌ๋ฉด ๋  ๊ฒƒ์„, list ํด๋ž˜์Šค์— ๋‹ค๋Š” ๊ฒƒ์ผ๊นŒ?
    • ๊ทธ ์ด์œ ๋Š” tab-button ์— ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‹ค๋Š” ๊ฒฝ์šฐ ์ด 3๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ list ํด๋ž˜์Šค์— ๋‹ฌ๋ฉด 1๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ค„์ด๋ฉด ์šฐ์„ ์ ์œผ๋กœ ์ฝ”๋“œ์–‘์ด ์ค„๊ณ , ๋ฐ˜๋ณต๋ฌธ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๋žจ์„ ๋œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ์—ฌ๊ธฐ๋‹ค dataset ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
    • ์šฐ์„  html ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ํƒœ๊ทธ์— data-์ž‘๋ช…="๊ฐ’" ์„ ์ ๋Š”๋‹ค. (์ด ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ž๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.)
    • ์‚ฌ์šฉํ•˜๊ณ ์žํ•  ๋•Œ๋Š” JavaScript ๋กœ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ฐพ์€ ๋‹ค์Œ ๋’ค์— .dataset.์ž‘๋ช… ์„ ๋ถ™์ด๋ฉด ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๋ฅธ ํƒญ์ด ์ฒซ๋ฒˆ์งธ ํƒญ์ด๋ผ๋ฉด, e.target ์€ document.querySelectorAll('.tab-button')[0]์ด ๋˜๊ณ  ๊ทธ๊ฒƒ์˜ dataset.id ๋Š” 0 ์ด๋ฏ€๋กœ openTab(0) ์ด ์‹คํ–‰๋˜์–ด ์ฒซ๋ฒˆ์งธ ํƒญ์˜ ํƒ€์ดํ‹€์ด ํ™œ์„ฑํ™”๋˜๋ฉด์„œ ํ•ด๋‹น ๋‚ด์šฉ์ด ๋ณด์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 
728x90
๋ฐ˜์‘ํ˜•