나는 평소에 JQuery 에 익숙해져 있다가, 최근 들어서 pure javascript (=Vanila JS) 를 되도록 사용하기 위해 노력하고 있다.

왜냐? ES6 이후로 js 가 많이 좋아졌다고도 하고... Vue.js 를 앞으로 사용할일이 좀 있는데..

거기서도 JQuery를 같이 쓸거 같지도 않고...

 

여튼, 그래서 최근에는 Vanila JS로 엥간한 자바스크립트 코딩을 하려고 한다.

그래서, 어제 일을하다가 평소에 JQuery 로 내가 아주 즐겨쓰던 함수인 append() 를 어떻게 하면 Vanila JS 로 짤 수 있을까 생각하다가, 그냥 생각없이 element 의 innerHTML 에다가 다른 html string 을 덧붙여보았다.

 

얼추 UI 상으로 보았을때는 크게 문제가 없어보이는데...

이렇게 짯더니 문제점... 내가 할당했던 click 이벤트가 사라졌다는 것이다 !!!

 

그래서 innerHTML 에 대한 내용을 찾아봤다.

innerHTML : 요소(element)의 자손의 HTML 직렬화를 포함하는 DOMString 입니다. Setting the value of innerHTML 의 값을 설정(대입)하면 요소의 모든 자손이 제거되고, 문자열 htmlString에 지정된 HTML을 파싱하고, 생성된 노드로 대체합니다.

 

그리고 이런 말도 쓰여있었다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

요소(element)의 내용을 변경하는 대신 HTML을 문서(document)에 삽입하려면, insertAdjacentHTML() 메서드를 사용하십시오.

 

즉, innerHTML 을 사용하게되면 해당 태그(element) 의 모든 하위 html 이 새로운 html 로 통째로 재생성 된다는 뜻이다.

그래서, 본 element를 포함한 모든 자손 element 의 각종 속성(event 포함)이 사라지게 되는 것이다.

 

아래에 처음에 실수했던 코드와 수정 후 코드 예제를 첨부한다.

  <div id="div">
  <button id="btn1">btn1</button>
  </div>
   
  <script>
  document.addEventListener("DOMContentLoaded", function (evt) {
  document.querySelector("#btn1").addEventListener("click", function (evt1) {
  alert("btn1 clicked!");
  });
   
  // #div element 하위의 모든 HTML element를 삭제후 재할당
  document.querySelector("#div").innerHTML += "<button id='btn2'>btn2</button>";
  })
  </script>
view raw1_before.html hosted with ❤ by GitHub
  <div id="div">
  <button id="btn1">btn1</button>
  </div>
   
  <script>
  document.addEventListener("DOMContentLoaded", function (evt) {
  document.querySelector("#btn1").addEventListener("click", function (evt1) {
  alert("btn1 clicked!");
  });
   
  // #div element 노드의 특정 위치에 필요한 HTML 만 추가
  document.querySelector("#div")
  .insertAdjacentHTML("afterend", "<button id='btn2'>btn2</button>");
  })
  </script>
view raw2_after.html hosted with ❤ by GitHub

innerHTML 대신 insertAdjacentHTML 을 사용한 것이 보이는가?

이 함수는 삽입하고자 하는 html 을 이미 사용중인 element 는 건드리지 않고 원하는 위치에 넣어준다.

자세한 내용은 여기를 참고하도록 하자.

 

- End -



출처: https://oniondev.tistory.com/17 [양파개발자 SW의 IT블로그]

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
61 [web design][웹디자인][알아봅시다] 왕초보 피그마 기초 사용법???? 셀러님들 지금 당장 피그마 시작하세요! 그대로 따라만 해서 피그마 정복하기 졸리운_곰 2025.07.21 246
60 CSS selector 졸리운_곰 2024.08.02 689
59 [Web Design][웹 디자인] Sass(SCSS) 완전 정복! 졸리운_곰 2022.07.31 412
58 [HTML] HTML5 공간 분할 : 레이아웃(Layout) file 졸리운_곰 2021.09.06 552
57 [HTML5] HTML 공간 분할 file 졸리운_곰 2021.09.06 528
56 [웹제작][웹디자인] 시각화 대시보드 를 만들기 위해 고려해야 하는 4가지 file 졸리운_곰 2021.09.05 588
55 웹사이트 디자인하는 방법 file 졸리운_곰 2020.12.30 406
54 카드형 디자인/갤러리/리스트 코딩하기. file 졸리운_곰 2020.12.04 677
53 HTML DIV tag - 테두리 그리기 STYLE - BORDER 졸리운_곰 2020.08.26 241
52 CSS :: 버튼(Button) 예쁘게 꾸미기, 여러개의 버튼 그룹화 하기 file 졸리운_곰 2020.08.26 994
51 [button] CSS - Button - 버튼스타일 (버튼크기, 버튼색깔, 버튼비활성화, 버튼그룹, 이미지위버튼) 졸리운_곰 2020.08.26 2293
50 GUI 디자이너를 위한 색상 참고 사이트 file 졸리운_곰 2020.08.04 609
49 생산성을 빠르게 높여주는, 프런트엔드 개발 툴 10가지 file 졸리운_곰 2020.04.10 488
48 Mustache 공유 file 졸리운_곰 2019.12.29 344
47 Mustache 템플릿 문법 수많은 언어에서 지원되는 초간단 템플릿 문법 졸리운_곰 2019.12.29 273
46 HTML/CSS기초_drop down 메뉴 만들기 file 졸리운_곰 2019.12.21 1242
45 반응형이란 무엇인가? 졸리운_곰 2019.11.20 449
44 <인터넷, 블로그팁: 마진(margin)과 패딩(padding)의 차이점이 뭘까?> file 졸리운_곰 2019.11.01 504
43 CSS / 반응형 레이아웃 만들기 file 졸리운_곰 2019.02.08 572
42 Responsive Web ② - 반응형 웹을 위한 레이아웃 설계 방법 file 졸리운_곰 2019.02.08 634
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED