var hw = document.getElementById('hw');
hw.addEventListener('click', function(){
alert('Hello world');
})
script 파일 위치
script 파일을 head 태그에 위치시킬 땐 window.onload = function(){} 함수 안에 코드를 작성해야 함. window.onload = function(){} 함수는 웹 브라우저의 모든 구성요소에 대한 로드가 끝났을 때 브라우저에 의해 호출되는 함수임. 단, script를 body 하단에 사용하는 것이 로드할 때 가장 빠름.
정리
asynce, defer을 사용하지 않은 기본 모드의 브라우저는 문서를 파싱해 읽다가 JS를 만나면 진행하던 파싱을 멈추고 스크립트 다운 → 파싱 → 실행한 후 다시 문서를 파싱함. JS는 parser blocking resource(파서 차단 리소스)임.
이때 파싱이란 하나의 프로그램을 런타임 환경이 실제로 실행할 수 있는 내부 포맷으로 분석하고 변환하는 것을 의미.
JS의 이해
웹브라우저에서 동작하는 기술인 HTML은 정보를, CSS는 디자인을, JS는 프로그래밍 적으로 제어를 담당함. 이 셋이 유기적으로 결합해서 하나의 웹 페이지를 만드는 것임.
모듈
개발하는 애플리케이션의 크기가 커지면 언젠가 파일을 여러 개로 분리해야하는 시점이 오는데 이때 분리된 파일 각각을 모듈이라 함. 스크립트 하나는 모듈 하나.
모듈에 특수 지시자 export와 import를 적용하면 다른 모듈의 함수를 호출하는 것과 같은 기능 공유가 가능함.
- export : 변수, 함수 앞에 붙이면 외부 모듈에서 해당 변수나 함수에 접근 가능(외부에 공개하려는 모듈).
- import : 외부 모듈의 기능을 가져옴.
<script type="module">을 설정해 스크립트가 모듈이란 걸 브라우저에게 알려줌.
// 📁 sayHi.js
export function sayHi(user) {
alert(`Hello, ${user}!`);
}
insertAdjacentHTML(position, element) - HTML 같은 특정 텍스트를 파싱하고, 원하는 위치에 노드를 추가함.
innerHTML는 기존에 있는 부분을 덮어쓰는거고 insertAdjacentHTML는 지정한 곳에 노드가 추가 될 뿐 기존를 노드 건드리지 않는다는 게 가장 큰 차이점임.
appendChild() - 메소드는 한 노드를 특정 부모 노드의 자식 노드 리스트 중 마지막 자식으로 붙임.
HTML 파일마다 넣어줘야했던 코드가 간결해짐.
💡
다양한 메소드가 있다면 메소드를 선택할 때 선택 기준, 이유가 있어야 함.
addEventListener()
지정한 이벤트가 대상에 전달될 때마다 호출할 함수를 설정.
target.addEventListener(type, listener);
type - 반응할 이벤트 유형을 나타내는 대소문자 구분 문자열.
listener - 지정된 타입의 이벤트가 발생했을 때, 알림(Event 인터페이스를 구현하는 객체)을 받는 객체. EventListener 인터페이스 또는 JavaScript function를 구현하는 객체여야만 함.
onclick 기능 추가하기
classList의 add와 remove로 사용자가 로그인, 회원가입을 눌렀을 때, 보이고 가려지는 것을 결정함.
innerHTML로 로그인, 회원가입을 클릭했을 때 HTML을 삽입함.
visibility가 hidden인 클래스를 만들어 add, remove를 할 수 있도록 함.
로그인, 회원가입의 검은 영역을 클릭했을 때 hidden 클래스를 add함.
💡
전역에 쓰이는 함수인지 주의해야 함.
마치며
역시 JS는 어렵다.. 오랜만에 해서 낯선 것도 있지만 서비스를 만들어보는 건 처음이라 신경써야 할 것이 많았다. 작은 부분이라고 생각했던 기능도 구현할 줄 몰라 하루종일 헤매기도 하고 머리도 계속 아팠다. 좋은 구조를 만드는 게 우선일지, 시간 내 동작하는 사이트를 만드는 게 먼저일지 모르겠다.