๐Ÿ– WELL-DONE Project/Javascript

๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ์•Œ์•„๋ณด๊ธฐ.2

JJuice 2020. 12. 18. 13:50

๋ฐ”๋กœ ์ด์ „ ํฌ์ŠคํŠธ ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ์•Œ์•„๋ณด๊ธฐ.1์—์„œ

  • window ๊ฐ์ฒด
  • document ๊ฐ์ฒด
  • DOM๊ณผ DOMํŠธ๋ฆฌ
  • DOM์—์„œ์˜ ๋…ธ๋“œ๋ž€ ๋ฌด์—‡์ด๊ณ  ๋…ธ๋“œ ์ข…๋ฅ˜์™€ ๊ด€๊ณ„
  • DOM์—์„œ์˜ ๋…ธ๋“œ ์ด๋™ / ๋…ธ๋“œ ๊ฐ’์— ์ ‘๊ทผํ•ด์„œ ์ถœ๋ ค๊ฐ’์„ ์•Œ์•„๋ณด๊ณ  ๋…ธ๋“œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š”

  1. ์ƒˆ๋กญ๊ฒŒ ์š”์†Œ(element)๋…ธ๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๋ฒ•๊ณผ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด ์š”์†Œ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ
  2. ์š”์†Œ(element)๋…ธ๋“œ ์‚ญ์ œ์™€ ์ด๋™๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ
  3. ์š”์†Œ(element) ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด ์š”์†Œ์˜ ์ •๊ทœ ์†์„ฑ(attribute)๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ
  4. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ CSS ์ปจํŠธ๋กค ํ•˜๋Š” ๋ฐฉ๋ฒ•
  5. ์š”์†Œ์˜ ๋น„์ •๊ทœ ์†์„ฑ(attribue)๊ฐ’์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๐Ÿ”ถ์˜ˆ์ œ ์ฝ”๋“œ

<html>
<head>
    <title>JS ๋…ธ๋“œ ์ ‘๊ทผํ•ด๋ณด๊ธฐ</title>
</head>
<body>
    <h1>์บ๋ฆญํ„ฐ ์•Œ์•„๋ณด๊ธฐ</h1>
    <p>ํƒฑ์ปค ์บ๋ฆญํ„ฐ</p>
    <ul id="tanker-list" >
        <li>๋ผ์ธํ•˜๋ฅดํŠธ</li>
        <li>์ž๋ฆฌ์•ผ</li>
        <li>์‹œ๊ทธ๋งˆ</li>
        <a href="https://bossanovajju.tistory.com/">ํƒฑ์ปค ์บ๋ฆญํ„ฐ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ</a>  
    </ul>
    <p>ํž๋Ÿฌ ์บ๋ฆญํ„ฐ</p>
    <ul id="healer-list" href="www.overwatch/healer">
        <li>์•„๋‚˜</li>
        <li>๋ฉ”๋ฅด์‹œ</li>
        <li>๋ธŒ๋ฆฌ๊ธฐํ…Œ</li>
        <a href="https://bossanovajju.tistory.com/">ํž๋Ÿฌ ์บ๋ฆญํ„ฐ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ</a>  
    </ul>
    <script src='index.js'></script>
</body>
</html>

1.์ƒˆ๋กญ๊ฒŒ ์š”์†Œ(element)๋…ธ๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๋ฒ•๊ณผ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด ์š”์†Œ ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ

โ–  ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑํ•˜๊ธฐ

๊ธฐ์กด #tanker-list์—์„œ <li>๋ ˆํ‚น๋ณผ</li> ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
๋ฌผ๋ก  ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์กด ํฌ์ŠคํŠธ์—์„œ ํ™œ์šฉํ–ˆ๋˜ innerHTML์ด๋‚˜ outerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™œ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ๊ธฐ์กด์˜ ์š”์†Œ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด createElement๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.

@createElement ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•ด์„œ ๋…ธ๋“œ ์ƒ์„ฑ

const newTanker = document.createElement('li');
newTanker.textContent = '๋ ˆํ‚น๋ณผ';

โ–  ์š”์†Œ ๋…ธ๋“œ์— ์ƒ์„ฑํ•œ <li> ๋…ธ๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ

๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž

  • prepend ๋ฉ”์†Œ๋“œ : ํ•ด๋‹น ์š”์†Œ ๊ฐ€์žฅ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • append ๋ฉ”์†Œ๋“œ : ํ•ด๋‹น ์š”์†Œ ๊ฐ€์žฅ ๋’ค์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • before ๋ฉ”์†Œ๋“œ : ํ•ด๋‹น ์š”์†Œ ๋ฐ”๋กœ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
  • after ๋ฉ”์†Œ๋“œ : ํ•ด๋‹น ์š”์†Œ ๋ฐ”๋กœ ๋’ค์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • const tankerList = document.querySelector('#tanker-list');
    tankerList.prepend(newTanker); 

    <ul id='tankerList'>์˜ ์ž์‹ ์ฒซ๋ฒˆ์งธ <li>์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ โ›”์ฃผ์˜ํ• ์ ์€ ๋ฉ”์†Œ๋“œ (์š”์†Œ1, ์š”์†Œ2) ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์‹ค์ œ ์ถœ๋ ฅ๋˜๋Š” ์ˆœ์„œ๋Š” ์š”์†Œ2๊ฐ€ ์ฒซ๋ฒˆ์งธ, ์š”์†Œ1์ด ๋‘๋ฒˆ์งธ๋กœ ๋ณด์—ฌ์งˆ๊ฑฐ ๊ฐ™์€๋ฐ ์‹ค์ œ๋กœ๋Š” ๋ฉ”์†Œ๋“œ ์•ž์— ๋„ฃ์€ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

const newTanker1 = document.createElement("li");
newTanker1.textContent = "๋ ˆํ‚น๋ณผ";
const newTanker2 = document.createElement("li");
newTanker2.textContent = "๋กœ๋“œํ˜ธ๊ทธ";


const tankerList = document.querySelector("#tanker-list");
tankerList.prepend(newTanker1,newTanker2); 

๊ทธ๋ž˜์„œ ์œ„์˜ ์ฝ”๋“œ์˜ ์‹ค์ œ ์ถœ๋ ฅ๋œ ๋ชจ์Šต์€

  • ๋ ˆํ‚น๋ณผ
  • ๋กœ๋“œํ˜ธ๊ทธ
  • ๋ผ์ธํ•˜๋ฅดํŠธ ..

์ˆœ์„œ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค.

2.์š”์†Œ(element)๋…ธ๋“œ ์‚ญ์ œ์™€ ์ด๋™๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

โ–  ์š”์†Œ ๋…ธ๋“œ ์‚ญ์ œํ•˜๊ธฐ

์š”์†Œ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. remove๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const healerList = document.querySelector('#healer-list');
healerList.firstElementChild.remove(); //<li>์•„๋‚˜</li>์š”์†Œ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

โ–  ์š”์†Œ ๋…ธ๋“œ ์ด๋™ํ•˜๊ธฐ

์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ž์—์„œ ํ™œ์šฉํ–ˆ๋˜ append,prepend,before,afeter ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const tankerList = document.querySelector('#tanker-list');
const healerList = document.querySelector('#healer-list');
tankerList.prepend(healerList.firstElementChild); 

#healder-list์˜ ์ฒซ๋ฒˆ์งธ ์ž์‹ <li>์•„๋‚˜</li> ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด์„œ #tanker-list์˜ ์ฒซ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.

-์•„๋‚˜

-๋ผ์ธํ•˜๋ฅดํŠธ

3.์š”์†Œ(element) ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด ์š”์†Œ์˜ ์ •๊ทœ ์†์„ฑ(attribute)๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ

โ–  <a> ์š”์†Œ ๋…ธ๋“œ์˜ href ์†์„ฑ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

getAttribute ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

const healerList = document.querySelector('#healer-list');
console.log(healerList.lastElementChild.getAttribute('href')); //outputs: https://bossanovajju.tistory.com/

์œ„์™€ ๊ฐ™์ด ์š”์†Œ์˜ ํ‘œ์ค€ ์†์„ฑ์€ ๋ฌธ์ œ์—†์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„ํ‘œ์ค€ ์†์„ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ ์–ด๋–จ๊นŒ?
์•„๋ž˜์™€ ๊ฐ™์ด <ul> ์š”์†Œ ๋…ธ๋“œ ์•ˆ์— href="..." ๋งž์ง€ ์•Š๋Š” ๋น„ํ‘œ์ค€ ์†์„ฑ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

<ul id='healer-list' href='www.overwatch/healer'></ul>

๋˜‘๊ฐ™์ด getAttribute ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ณด์ž.

const healerList = document.querySelector('#healer-list');
console.log(healerList.getAttribute('href'); //outputs:www.overwatch/healer

์—ฌ๊ธฐ์„œ ๋‚˜์˜จ ์ถœ๋ ฅ๊ฐ’์ฒ˜๋Ÿผ ์š”์†Œ ๋…ธ๋“œ์˜ ์†์„ฑ์ด ํ‘œ์ค€์ด๋“  ๋น„ํ‘œ์ค€์ด๋“  getAttribute๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ์ถœ๋ ค๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

โ–  <a> ์š”์†Œ ๋…ธ๋“œ์˜ href ์†์„ฑ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

setAttribute ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

const tankerList = document.querySelector("#tanker-list");
tankerList.lastElementChild.setAttribute("href", "www.google.com");
console.log(tankerList.lastElementChild.getAttribute("href")); //outputs: www.google.com

4.์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ CSS ์ปจํŠธ๋กค ํ•˜๋Š” ๋ฐฉ๋ฒ•

โ–  HTML ์š”์†Œ ๋…ธ๋“œ ์†์„ฑ๊ฐ’์œผ๋กœ CSS style์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•

ex)๋‚ด๊ฐ€ ํƒฑ์ปค ์บ๋ฆญํ„ฐ ์ค‘ ๊ฐ€์žฅ ์ž˜ ๋‹ค๋ฃจ๋Š” '์ž๋ฆฌ์•ผ'์ธ๋งŒํผ ์œ„์˜ HTML ์˜ˆ์ œ์—์„œ <li>์ž๋ฆฌ์•ผ</li>๋ถ€๋ถ„์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒ‰์ƒ์„ pink๋กœ ํ…์ŠคํŠธ๋ฅผ ๊ตต๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค.

const tankerList = document.querySelector('#tanker-list');
tankerList.children[1].style.backgroundColor = 'pink';
tankerList.children[1].style.fontWeight = 'bold'; 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ํ•ด๋‹น๋…ธ๋“œ์š”์†Œ:tankerList.children[1] . styleํ”„๋กœํผํ‹ฐ:style . CSS์†์„ฑ:backgroundColor = ์›ํ•˜๋Š” css์†์„ฑ๊ฐ’:pink ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

โ›”์ฃผ์˜ํ• ์ : styleํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ๊ธฐ์กด์˜ background-color๊ฐ€ ์•„๋‹Œ backgroundColor ์ฒ˜๋Ÿผ ์นด๋ฉœ(Camel) ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ styleํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ž์œ ๋กญ๊ฒŒ CSS๋ฅผ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์กฐ์‹ฌํ•ด์•ผ ํ•  ์ ์€ ์•„๋ž˜์™€ ๊ฐ™์ด HTML ์š”์†Œ ๋…ธ๋“œ ์†์„ฑ๊ฐ’์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํ•œ CSS์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ CSS์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค๋ฉด HTML๊ฐ€๋…์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

<li style="backgrond-color: pink; font-weight: bold;">
  ์ž๋ฆฌ์•ผ
</li>

โ–  className๊ณผ classList ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์•ž์—์„œ ์ฒ˜๋Ÿผ '์ž๋ฆฌ์•ผ' ํ…์ŠคํŠธ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒ‰์ƒ๊ณผ ํฐํŠธ ๊ตต๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
์›ํ•˜๋Š” ์Šคํƒ€์ผ์„ css์— class๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

.font-pinkBold {
    background-color: pink;
    font-weight : bold;
}

โ–ทclassName ํ™œ์šฉํ•˜๊ธฐ

const tankerList = document.querySelector('#tanker-list');
tankerList.children[1].className = 'font-pinkBold';

โ–ทclassList์˜ ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ ํ™œ์šฉํ•˜๊ธฐ

  • classList.add('ex') : ํ•ด๋‹น css ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.(์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋„ ๊ฐ€๋Šฅ)

  • classList.remove('ex') : ํ•ด๋‹น css ํด๋ž˜์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.(์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋„ ๊ฐ€๋Šฅ)

  • classList.toggle('ex') : ํ•ด๋‹น css ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ œ๊ฑฐํ•˜๊ณ  ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

    const tankerList = document.querySelector('#tanker-list');
    tankerList.children[1].classList.add('font-pinkBold');

์š”์†Œ(element) ๋…ธ๋“œ ๋น„ํ‘œ์ค€ ์†์„ฑ(attribute) ๋‹ค๋ฃจ๊ธฐ

HTML์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ํ‘œ์ค€ ์†์„ฑ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ•œ ์†์„ฑ๊ณผ ์†์„ฑ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์•„๋ž˜์˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

๐Ÿ”ถ์˜ˆ์ œ

์˜ˆ์ œimg

์—ฌ๊ธฐ ํžŒํŠธ๋ฅผ ๋ณด๊ณ  ์˜ค๋ฒ„์›Œ์น˜ ์บ๋ฆญํ„ฐ์˜ ์ง์—… ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งž์ถฐ๋ณด๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

<html>
<head>
  <title>JS ๋…ธ๋“œ ์ ‘๊ทผํ•ด๋ณด๊ธฐ</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>์˜ค๋ฒ„์›Œ์น˜ ์บ๋ฆญํ„ฐ ์ง์—…๊ตฐ ๋งž์ถฐ๋ณด๊ธฐ</h1>
    <p>
      ํŠน์ง•: <b field="point"></b>
    </p>
    <p>
      ๊ถ๊ทน๊ธฐ: <b field="ultimate"></b>
    </p>
    <p>
        ์ •๋‹ต:์ง์—…๊ตฐ์€ ๋ญ์ฃ ?<b field="status"></b>
    </p>
  </div>
  <div>
    <button status="ํƒฑ์ปค">ํƒฑ์ปค</button>
    <button status="๋”œ๋Ÿฌ">๋”œ๋Ÿฌ</button>
    <button status="ํž๋Ÿฌ">ํž๋Ÿฌ</button>
  </div>
  <script src="index.js"></script>
</body>
</html>
/*style.css*/
[status] {
  margin: 10px;
  padding: 10px;
  color: white;
}

[status="ํƒฑ์ปค"] {
  background-color: indigo;
}

[status="๋”œ๋Ÿฌ"] {
  background-color: magenta;
}

[status="ํž๋Ÿฌ"] {

  background-color: green;
}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ index.js์—์„œ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ธฐ๋Šฅ์€

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํžŒํŠธ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐ์ดํ„ฐ obj๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ์‹œํ‚จ๋‹ค.

const dataObj = {
point: '์Šค๋‚˜์ดํผ ์ด',
ultimate: '๋‚˜๋…ธ๊ฐ•ํ™”์ œ'
}
  1. ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ์— ์ ‘๊ทผํ•œ ํ›„์ƒ์„ฑ๋œ obj์˜ ์†์„ฑํ‚ค์™€ ์†์„ฑ ๊ฐ’์„ HTML์—์„œ ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์†์„ฑํ‚ค์™€ ์†์„ฑ๊ฐ’์„ ์ผ์น˜์‹œ์ผœ ์‹ค์ œ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ฒŒ ๋งŒ๋“ ๋‹ค.
const fields = document.querySelectorAll('[field]');
for(let fieldNode of fields) {
    const fieldAttribute = fieldNode.getAttribute('field');
    fieldNode.textContent = dataObj[fieldAttribute];
}
  1. ์•„๋ž˜์˜ 3๊ฐœ์˜ ์นดํ…Œ๊ณ ๋ฆฌ(ํƒฑ์ปค,๋”œ๋Ÿฌ,์ง€์›๊ฐ€) button ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ํ›„.๋ณด์—ฌ์ง€๋Š” ํžŒํŠธ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์‚ฌ์šฉ์ž 3๊ฐœ์˜ ์นดํ…Œ๊ณ ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ํด๋ฆญํ•˜๋ฉด '์ •๋‹ต'๋ž€์— ํด๋ฆญ๋œ ๋ฒ„ํŠผ์˜ ํ…์ŠคํŠธ์™€ css์Šคํƒ€์ผ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์ง„๋‹ค.
const buttons = document.querySelectorAll('[status]');
for(let buttonNode of buttons) {
  const buttonStatusAttribute = buttonNode.getAttribute('status');
  buttonNode.onclick = function () {
      fields[2].textContent = statusAttribute;
      fields[2].setAttribute('status', buttonStatusAttribute);
  }
}

์—ฌ๊ธฐ์„œ status์†์„ฑ์„ ๊ฐ€์ง„ ๋ฒ„ํŠผ์ด ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด fields[2].setAttribute('status',buttonStatusAttribute);๋Š” ์‹ค์ œ์ ์œผ๋กœ <b field="status" ์š”์†Œ์— status="์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ๋œ ํ•ด๋‹น status๊ฐ’(ํƒฑ์ปคor๋”œ๋Ÿฌorํž๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

๋งŒ์•ฝ 'ํƒฑ์ปค'๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์‹ค์ œ์ ์ธ ์š”์†Œ ๋…ธ๋“œ ์†์„ฑ๊ฐ’์ด <b class="" field="status" status="ํƒฑ์ปค">ํƒฑ์ปค</b>๊ฐ’์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

//์ตœ์ข… index.js์ฝ”๋“œ
const dataObj = {
  point: '์Šค๋‚˜์ดํผ ์ด',
  ultimate: '๋‚˜๋…ธ๊ฐ•ํ™”์ œ'
}

const fields = document.querySelectorAll('[field]');
for(let fieldNode of fields) {
    const fieldAttribute = fieldNode.getAttribute('field');
    fieldNode.textContent = dataObj[fieldAttribute];
}

const buttons = document.querySelectorAll('[status]');
for(let buttonNode of buttons) {
    const buttonStatusAttribute = buttonNode.getAttribute('status');
    buttonNode.onclick = function () {
        fields[2].textContent = statusAttribute;
        fields[2].setAttribute('status', buttonStatusAttribute);
  }
}

์ตœ์ข… ๊ฒฐ๊ณผimg

๋ฌผ๋ก  ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์ฃผ์˜ํ•  ์ ์ด ํ•œ๊ฐ€์ง€ ์žˆ๋‹ค.

โ›”์ฃผ์˜ํ•ด์•ผํ• ์  : ์œ„์—์„œ์ฒ˜๋Ÿผ status๋ผ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์†์„ฑ์„ ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜์„œ ๊ณต์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜‘๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ statusํ‘œ์ค€ ์†์„ฑ์ด ๋‚˜์™”๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์š”์†Œ ๋…ธ๋“œ์— ์†์„ฑ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด data- ์†์„ฑ์ด๋‹ค.

์ด data-์†์„ฑ์€ -๋’ค์— ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ชจ๋“  ์†์„ฑ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
data-field , data-status ๋“ฑ ๊ทธ๋ฆฌ๊ณ  ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก dataset์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ ์ ์šฉ์‹œ์ผœ ๋ณธ๋‹ค๋ฉด

const fields = document.querySelectorAll('[field]');
for(let fieldNode of fields) {
    const fieldAttribute = fieldNode.getAttribute('field');
    fieldNode.textContent = dataObj[fieldAttribute];
}

์—์„œ getAttribute()๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์†์„ฑ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ, ๋งŒ์•ฝ HTML์—์„œ
field์†์„ฑ์ด ์•„๋‹Œ data-filed์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด

<p>
  ํŠน์ง•:
  <b data-field="point"></b>
</p>
<p>
  ๊ถ๊ทน๊ธฐ:
  <b data-field="ultimate"></b>
</p>
<p class="">
    ์ •๋‹ต:์ง์—…๊ตฐ์€ ๋ญ์ฃ ?
    <b data-field="status"></b>
</p>

์•„๋ž˜์™€ ๊ฐ™์ด fieldNode.getAttribute('field'); ์ฝ”๋“œ ๋Œ€์‹ fieldNode.dataset.field๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

const fields = document.querySelectorAll('[field]');
for(let fieldNode of fields) {
    const fieldAttribute = fieldNode.dataset.field;
    fieldNode.textContent = dataObj[fieldAttribute];
}

dataset์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ตœ์ข…์ ์œผ๋กœ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

<html>
<head>
  <title>JS ๋…ธ๋“œ ์ ‘๊ทผํ•ด๋ณด๊ธฐ</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>์˜ค๋ฒ„์›Œ์น˜ ์บ๋ฆญํ„ฐ ์ง์—…๊ตฐ ๋งž์ถฐ๋ณด๊ธฐ</h1>
    <p>
      ํŠน์ง•:
      <b data-field="point"></b>
    </p>
    <p>
      ๊ถ๊ทน๊ธฐ:
      <b data-field="ultimate"></b>
    </p>
    <p class="">
      ์ •๋‹ต:์ง์—…๊ตฐ์€ ๋ญ์ฃ ?
      <b data-field="status"></b>
    </p>
  </div>
  <div>
    <button data-status="ํƒฑ์ปค">ํƒฑ์ปค</button>
    <button data-status="๋”œ๋Ÿฌ">๋”œ๋Ÿฌ</button>
    <button data-status="ํž๋Ÿฌ">ํž๋Ÿฌ</button>
  </div>
  <script src="index.js"></script>
</body>
</html>
[data-status] {
  margin: 10px;
  padding: 10px;
  color: white;
}

[data-status="ํƒฑ์ปค"] {
  background-color: indigo;
}

[data-status="๋”œ๋Ÿฌ"] {
  background-color: magenta;
}

[data-status="ํž๋Ÿฌ"] {

  background-color: green;
}
const dataObj = {
  point: '์Šค๋‚˜์ดํผ ์ด',
  ultimate: '๋‚˜๋…ธ๊ฐ•ํ™”์ œ'
}

const fields = document.querySelectorAll('[data-field]');
for(let fieldNode of fields) {
  const fieldAttribute = fieldNode.dataset.field;
  fieldNode.textContent = dataObj[fieldAttribute];
}


const buttons = document.querySelectorAll('[data-status]');
for(let buttonNode of buttons) {
  const statusAttribute = buttonNode.dataset.status;
  buttonNode.onclick = function () {
    fields[2].textContent = statusAttribute;
    fields[2].dataset.status = statusAttribute;
  }
}
๋Œ“๊ธ€์ˆ˜0