PopupModal

맨땅헤딩! ㅣ 2023. 5. 9. 10:30

해당 포스트는 제로베이스 오프라인스쿨 진행 과정 중 JS PairProgramming과제를 진행하며 회고를 정리하는 글이다.

 

05 PopupModal TIL
1. submit event를 받았을 때 버튼이 target이 되지 않는 현상

<form class="popup-form">
  <input type="text" class="popup-input" />
  <button class="popup-button-ok">OK</button>
  <button class="popup-button-cancel">Cancel</button>
  <button class="popup-button-x">X</button>
</form>
;


위 코드에서는 popup을 종료하는 button이 submit 안에 들어 있다. 이 상태에서 submit 이벤트를 받아서 종료하려고 하면 submit에서 button이 e.target이 되지 않는다. 따라서 submit 이벤트가 필요한 부분과 필요하지 않는 부분을 나누었다.

<form class="popup-form">
  <input type="text" class="popup-input" />
  <button class="popup-button-ok">OK</button>
</form>
<div class="popup-delete">
  <button class="popup-button-cancel">Cancel</button>
  <button class="popup-button-x">X</button>
</div>


popup-form 에서는 submit event가 발생하면 입력 필드의 텍스트를 입력받아 화면에 출력한다. 그리고 popup-delete 에서는 click event가 발생하면 hidden 클래스를 추가해 popup을 없앤다.

2. 리펙토링
위 방법에서는 div 태그 안에서 2개의 버튼이 있었다. 두 버튼은 공통된 기능을 가지고 있었지만, 배치구조대로 html을 바꾸어야 할 필요를 느꼈다.

<form class="popup-form">
  <input type="text" class="popup-input" />
  <button class="popup-button-ok">OK</button>
  <button class="popup-button-cancel">Cancel</button>
</form>
<button class="popup-button-cancel button-x">X</button>


위와 같이 하게 된다면 cancel 버튼을 클릭했을 시, submit event가 발생하게 된다. 이를 위해서, button에 type을 주어 submit event가 필요한 버튼과 구분했다.

<form class="popup-form">
  <input type="text" class="popup-input" />
  <button type="submit" class="popup-button-ok">OK</button>
  <button type="button" class="popup-button-cancel">Cancel</button>
</form>
<button class="popup-button-cancel button-x">X</button>


그리고 popup-button-cancel 클래스를 주어 querySelectorAll로 묶일 수 있도록 한 뒤, event listener를 달아주었다.

const $popupButtonCancel = document.querySelectorAll('.popup-button-cancel');

[...$popupButtonCancel].forEach($button => {
  $button.addEventListener('click', closeModal);
});


<배운점>
++ HTML구조에 따라서 Javascript의 코드 방식이 바뀌는 것을 체감했다. 앞으로 HTML에 JS 의존성을 줄이는 방식을 추구해야 겠다.

'JavaScript > PairProgramming1 회고' 카테고리의 다른 글

Tabs  (0) 2023.05.09
StopWatch  (0) 2023.05.09
DarkMode  (0) 2023.05.09
Is Palindrome  (0) 2023.05.09
Counter  (0) 2023.05.09