본문으로 바로가기

이벤트

category JavaScript 2020. 10. 10. 01:45

이벤트라는 웹페이지에서 일어나는 모든 사건을 말한다

우리는 자바스크립트에서 일어날 사건에 대응하는 함수를 미리 준비해 놓고

사건을 감지해서 그에 맞게 준비해 놓은 함수를 실행시키도록 할 수 있다

<h1>JS EVENT</h1>

<div class="container">
    <div class="test a">A</div>
    <div class="test b">B</div>
    <div class="test c">C</div>
</div>

웹페이지에서 가장 흔하게 일어나는 이벤트는 무엇일까?

바로 클릭 이벤트이다

a박스를 클릭하면 박스에 빨간테두리를 생성하는 간단한 코드를 만들어보자

이전 포스팅에서 자바스크립트로 클래스 이름을 추가하는 것이 응용된다

.apply {
    border: red solid 2px;
}

빨간색 테두리를 만드는 apply코드

const boxA = document.querySelector('.a');

boxA.addEventListener('click', function(){
    boxA.classList.add('apply');
})

이 스트립트 코드는 html마크업의 body의 하단에 추가했다

우선은 a박스를 조작하기위해서 자바스크립트의 변수에 담아야한다

그리고 addEventListener를 메소드를 이용하면되는데

첫번째 인자에는 발생할 이벤트의 이름을 문자열로 넣고

두번째 인자에는 그 이벤트가 발생했을 때 실행할 함수를 넣어주면 된다

여기서는 박스A에 apply를 추가하는 익명 함수를 넣었다

제대로 작동한다


위에서 스크립트 코드를 body밑에 넣고 실행했는데

head에 넣고 실행할 경우

와 같은 에러가 난다

const boxA = document.querySelector('.a');

부분에서 querySelector가 .a클래스를 찾지 못하기 때문인데

그 이유는 html파싱이 되기 전에 자바스크립트 코드를 만났기 때문에 자바스크립트에서 접근할 dom트리가 만들어지지 않은 것

이를 해결하기 위해선

    window.addEventListener('load',function () {
        const boxA = document.querySelector('.a');

        boxA.addEventListener('click', function(){
            boxA.classList.add('apply');
        })
    })

load이벤트는 로드가 끝났을 때 발생하는 이벤트로

전역 객체인 window의 로딩이 끝나면 위에서 만들어본 클릭 이벤트를 다시 익명 함수로 감싸 실행하게 만들었다

이 경우에 약간의 문제점이 있는데

window에 로딩하는데 매우 오래걸리는 리소스가 있다면 그 로딩이 끝나기 전까지 이벤트가 적용이 되지 않는 것

예를 들어서

다음 페이지로 넘어가는 버튼과 본문에 로딩하는데 10초가 걸리는 리소스가 있다고 가정하면

이번 페이지의 내용이 필요없어서 다음 페이지로 바로 넘어가려해도 그 내용이 로드되는 10초동안은 버튼을 눌러도 다음 페이지로 넘어갈 수 없다는 것

이런 상황을 방지하기 위해

    window.addEventListener('DOMContentLoaded',function () {
        const boxA = document.querySelector('.a');

        boxA.addEventListener('click', function(){
            boxA.classList.add('apply');
        })
    })

load이벤트가 아닌 DOMContentLoaded이벤트로 대체한다

DOMContentLoaded이벤트는 window의 용량이 큰 동영상이나 이미지의 로드를 기다리지 않고 DOM트리가 만들어지면 발생하는 이벤트이다


저렇게 전역 객체에 이벤트를 부여하는 귀찮음을 피하기 위해서

head에 스크립트 코드를 넣기보단 body밑에 스크립트 코드를 넣어서 html를 다 불러 온 뒤에 스크립트 코드가 작동하게 만들어주었다

'JavaScript' 카테고리의 다른 글

공 움직이기  (0) 2020.10.13
scroll event  (0) 2020.10.12
이벤트 위임  (0) 2020.10.12
전역 변수 줄이기  (0) 2020.10.11
DOM 조작  (0) 2020.10.08