innerHTML

1. κ°œμš”

textContent ν”„λ‘œνΌν‹°, innerText ν”„λ‘œνΌν‹°λŠ” HTML λ§ˆν¬μ—…μ΄ νŒŒμ‹±λ˜μ§€ μ•Šμ€ 채 ν…μŠ€νŠΈμ˜ ν˜•νƒœλ‘œ μΆ”κ°€λœλ‹€. κ·Έλ ‡λ‹€λ©΄ ν…μŠ€νŠΈ λ…Έλ“œμ— HTML λ§ˆν¬μ—…μ„ νŒŒμ‹±ν•˜μ—¬ μΆ”κ°€ν•˜λŠ” 방법은 λ¬΄μ—‡μΌκΉŒ? λ°”λ‘œ innerHTML ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

innerHTML ν”„λ‘œνΌν‹°λŠ” μš”μ†Œ λ…Έλ“œμ˜ HTML λ§ˆν¬μ—…μ„ μ·¨λ“ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.


2. innerHTML ν”„λ‘œν”Όν„° λ°˜ν™˜ κ°’

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      console.log($foo.innerHTML);
    </script>
  </body>
</html>

μœ„μ˜ μ½”λ“œμ—μ„œ μ½˜μ†” κ°’μœΌλ‘  "Hello <span>world</span>"이 좜λ ₯λœλ‹€.


3. innerHTML ν”„λ‘œν”Όν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ‹ λ…Έλ“œ μˆ˜μ •ν•˜κΈ°

μš”μ†Œ λ…Έλ“œμ˜ innerHTML ν”„λ‘œνΌν‹°μ— λ¬Έμžμ—΄μ„ ν• λ‹Ήν•˜λ©΄ μš”μ†Œ λ…Έλ“œμ˜ λͺ¨λ“  μžμ‹ λ…Έλ“œκ°€ 제거되고 ν• λ‹Ήν•œ λ¬Έμžμ—΄μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” HTML λ§ˆν¬μ—…μ΄ νŒŒμ‹±λ˜μ–΄ μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ‘œ DOM에 λ°˜μ˜ν•œλ‹€.

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      $foo.innerHTML = "Hi <span>everyone</span>";
    </script>
  </body>
</html>
innerHTML1

innerHTML ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„λž˜μ˜ μ˜ˆμ‹œμ²˜λŸΌ λ…Έλ“œ μΆ”κ°€, ꡐ체, μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.

<!DOCTYPE html>
<html lang="en">
  <body>
    <ul id="animal">
      <li>dog</li>
    </ul>
    <script>
      const $foo = document.getElementById("animal");
      // λ…Έλ“œ μΆ”κ°€
      $foo.innerHTML += "<li>cat</li>";
      $foo.innerHTML += "<li>lion</li>";

      // λ…Έλ“œ ꡐ체
      $foo.innerHTML = "<li>tiger</li>";

      // λ…Έλ“œ μ‚­μ œ
      $foo.innerHTML = "";
    </script>
  </body>
</html>

4. innerHTML ν”„λ‘œνΌν‹°μ˜ 단점

4-1. μ·¨μ•½ν•œ 크둜슀 μ‚¬μ΄νŠΈ μŠ€νŠΈλ¦½νŒ… 곡격

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      $foo.innerHTML = `<img src="x" onerror="alert(document.cookie)">`;
    </script>
  </body>
</html>

크둜슀 μ‚¬μ΄νŠΈ μŠ€νŠΈλ¦½νŒ… 곡격을 ν•΄κ²°ν•˜λŠ” 방법은 HTML μƒˆλ‹ˆν‹°μ œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 것이닀. μ΄λŠ” μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 데이터에 μ˜ν•΄ λ°œμƒν•  수 μžˆλŠ” 크둜슀 μ‚¬μ΄νŠΈ μŠ€ν¬λ¦½νŒ… 곡격을 μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ 잠재적 μœ„ν—˜μ„ μ œκ±°ν•˜λŠ” κΈ°λŠ₯을 λ§ν•œλ‹€.

λŒ€ν‘œμ μΈ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” DOMPurifyκ°€ μžˆλ‹€.


4-2. λͺ¨λ“  μžμ‹ λ…Έλ“œλ₯Ό μ œκ±°ν•˜κ³  DOM을 λ³€κ²½

<!DOCTYPE html>
<html lang="en">
  <body>
    <ul id="animal">
      <li>dog</li>
    </ul>
    <script>
      const $foo = document.getElementById("animal");
      $foo.innerHTML += "<li>cat</li>";
    </script>
  </body>
</html>

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ <li>dog</li>λŠ” 변경이 μ—†μœΌλ―€λ‘œ λ‹€μ‹œ 생성할 ν•„μš”κ°€ μ—†λ‹€. ν•˜μ§€λ§Œ $foo.innerHTML += "<li>cat</li>";으둜 인해 <li>dog</li>λŠ” μ‚­μ œλ˜μ—ˆλ‹€κ°€ λ‹€μ‹œ μƒμ„±λœλ‹€.

즉, innerHTML ν”„λ‘œνΌν‹°μ— HTML λ§ˆν¬μ—… λ¬Έμžμ—΄μ„ ν• λ‹Ήν•˜λ©΄ μœ μ§€λ˜μ–΄λ„ 쒋은 기쑴의 μžμ‹ λ…Έλ“œκΉŒμ§€ λͺ¨λ‘ μ œκ±°ν•˜κ³  λ‹€μ‹œ μ²˜μŒλΆ€ν„° μƒˆλ‘­κ²Œ μžμ‹ λ…Έλ“œλ₯Ό μƒμ„±ν•˜μ—¬ DOM에 λ°˜μ˜ν•œλ‹€. 이λ₯Ό νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€.


4-3. λΆˆκ°€λŠ₯ν•œ μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•  λ•Œ μ‚½μž…λ  μœ„μΉ˜ μ§€μ •

<ul id="animal">
  <li>dog</li>
  <li>cat</li>
</ul>

innerHTML ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ dog와 cat 사이에 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•  수 μ—†λ‹€.

innerHTML ν”„λ‘œνΌν‹°λŠ” λ³΅μž‘ν•˜μ§€ μ•Šμ€ μš”μ†Œλ₯Ό μƒˆλ‘­κ²Œ μΆ”κ°€ν•  λ•Œ μœ μš©ν•˜μ§€λ§Œ κΈ°μ‘΄ μš”μ†Œλ₯Ό μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄ μœ„μΉ˜λ₯Ό μ§€μ •ν•΄ μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•΄μ•Ό ν•  λ•ŒλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.


5. Conclusion

innerText ν”„λ‘œνΌν‹°μ™€ innerHTML ν”„λ‘œνΌν‹°λŠ” μ–Έλœ» 보기엔 λΉ„μŠ·ν•œ 역할을 ν•œλ‹€κ³  생각할 수 μžˆλ‹€. κ·Έλž˜μ„œ μ˜ˆμ „μ—λŠ” 두 개λ₯Ό 거의 κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  μ‚¬μš©μ„ ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ μ—„μ—°νžˆ 차이점이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 상황에 맞게 잘 μ‚¬μš©μ„ ν•΄μ•Ό κ² λ‹€. λ˜ν•œ innerHTML ν”„λ‘œνΌν‹°μ˜ 단점도 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 단점이 λ“€μ–΄λ‚˜λŠ” 상황이 였면 λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œ λ…Έλ“œλ‚΄μ— μžμ‹μ„ μΆ”κ°€ν•˜λ„λ‘ ν•˜μž.


μ°Έκ³ 

λ„μ„œ - λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리


πŸ“… 2022-10-13

Last updated