🤔 문제
바닐라 자바스크립트로 프로젝트를 진행하던 중
html에 자바스크립트 파일을 연결하던 부분을 변경하게 되었다.
단순히 타입을 모듈로 변경한 것이었다.
<script type="module" src="app.js" defer></script>
그런데 이렇게 타입을 지정하니까
js 파일에서 삽입한 코드의 이벤트 함수를 인식하지 못했다.
버튼을 눌러도 아무런 반응이 없었다.
// box 안에 버튼 넣어주기
const box = document.querySelector(".box");
box.innerHTML = `
<button onClick="handleClick()">Click!</button>
`;
// 버튼의 이벤트 함수
const handleClick = () => {
console.log("hi");
};
🔑 해결
이 문제는 전역에서 해당 handleClick 함수를 찾지 못해 생기는 것이었다.
타입을 모듈로 지정하면 해당 파일만의 스코프가 만들어진다.
그러므로 모듈로 지정하기 전에는
handleClick
=== window.handleClick
이었다면 모듈로 지정한 후에는 아닌 것이다.
해결 방법은 두 가지가 있다.
1. 이벤트 함수를 전역 함수로 선언하기
window.handleClick = () => {
console.log("hi");
};
2. 해당 버튼을 찾아 이벤트리스너로 이벤트 함수 부여하기
const button = box.querySelector("button");
button.addEventListener("click", () => {
alert("hi");
});
역시 전자가 훨씬 간편하다.
앞으로 유의해서 코드를 짜야겠다.
'Programming > Client' 카테고리의 다른 글
[Javascript] formData로 이미지, 문자열 묶어서 전달하기 (0) | 2023.01.08 |
---|---|
[React] 전역에서 사용 가능한 모달 만들기 (0) | 2023.01.08 |
[Javascript] array.reduce() 콜백함수 속 증감연산자 (0) | 2022.05.03 |
[Javascript] Array.fill()로 2차원 배열을 만들면 안되는 이유 (0) | 2022.05.02 |
[Javascript] 객체 매핑하기 (0) | 2022.03.25 |