[JS 오류] Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')

728x90
반응형

1. 오류 발생

1. Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')

> 콘솔에서 undefined 출력

document.querySelector('#searchBtn2').addEventListener('click', function () {
    alert('버튼 클릭');
});

2. 해결방법

1. window.onload 사용

window.onload = function () {
    document.querySelector('#searchBtn').addEventListener('click', function () {
        alert('버튼 클릭');
    });
};

2. index.html 파일에서 <body>태그 제일 하단에 위치

<body>
~~~~~~~~~~~~~~~~~~~~~내용 ~~~~~~~~~~~~~~~
   <script src="index.js"></script>
</body>

* <bod>태그 제일 상단에 위치했을때도, 작동이 안되서 제일 하단으로 위치 변경

* html과 script 읽는 속도의 차이에서 발생했음 => 그래서 <head>태그에 넣는 방법에 대해 공부해봄.

 

3. [선택] <head> 태그에 defer속성 사용

<head>
   <script defer src="index.js"></script>
</head>

<head> 태그 <script> 태그 포함하는 경우

: 분석 &중지 > 스크립트 다운 실행 > 다시 분석 => 인터넷 속도가 느리거나 js 파일이 크면 시간오래걸림

=> 결국 head 포함 안 하는게 좋음

 

(1) async 속성 : boolean 타입 (기본: true) : html분석과 js다운을 병렬로 진행

=> html 분석 전 js에서 쿼리셀렉트를 이용해서 dom요소 조작하면 그 시점에서 html이 정의 되지 않을 수 있음

 

(2) defer 속성 : html 파싱하다가 js다운만 받아놓자 하고 html 파싱 끝나면 다운로드 된 js 실행

=> 여러개의 script를 <head>태그에 넣을 경우, 각각의 js 다운 받은 후 순서대로 실행 

(제일 효율적이고 안전함)

 

<body>태그 <script>태그 제일 하단에 위치

: html분석 완료 > 스크립트 다운 받아서 진행 > 사용자가 js 받기 전에 페이지 컨텐츠 볼 수 있음

=> (단점) js에 의존성이 높은 페이지라면 정상 페이지 보기 전에 js 다운 받고 실행하는 시간 기다려야함

 

 

 

반응형