Intro for JS
왜 배워야 할까?
- 브라우저 화면을 동적으로 만들기 위함
- 브라우저를 조작할 수 있는 유일한 언어
브라우저
- 웹 서버에서 이동하며 클라이언트와 서버간 양방향으로 통신하고, ㅗ씌HTML문서나 파일을 출력하는 GUI 기반의 소프트웨어
- 인터넷 컨텐츠를 검ㅁ색 및 열람하도록 함
- 웹 브라우저 라고도 함
- 주요 브라우저
- 크롬, 파이어폭스, 엣지, 오페라, 사파리
Most Popular Programming Language in 2020 survey
History of JS
1. 핵심 인물
- 팀 버너스 리
- WWW, URL, HTTP, HTML 최초 설계자
- 웹의 아버지
- 브랜던 아이크
2. JS의 탄생
- 1994년 당시 넷스케이프 커뮤니케이션스사의 NN브라우저가 전 세계 점유율 80% 이상 독점하며 표준 역할을 함.
- 당시 넷스케이프에 재직중이던 브랜던 아이크가 HTML을 동적으로 동작하기 위한 회사 내부 프로젝트를 진행 중, JS 개발.
- JS 이름 변천사
- Mocha -> LiveScript -> JavaScript
- 그러나 1995년 경쟁사 마이크로 소프트에서 이를 채택해 자체적인 커스텀을 통해 Jscript를 만들어 IE 1.0에 탑재 -> 1차 브라우저 전쟁의 시작
3. 제 1차 브라우저 전쟁
- 넷스케이프 vs 마이크로소프트
- 빌게이츠 주도하에 MS는 1997년 IE 4를 발표하면서 시장을 장악하기 시작
- 당시 윈도우 시장 점유율 90%
- MS의 승리로 끝나며 2001년 부터 IE의 점유율은 90%를 상회
- 1998년 넷스케이프에서 나온 브랜던 아이크 외 후계자들이 모질라 재단을 설립
- 파이어폭스를 통해 IE에 대항하며 꾸준히 점유율을 올려감
4. 제 2차 브라우저 전쟁(2009~)
- MS vs Google
- 2008년 Google의 Chrome 브라우저 발표
- 2011년 3년 만에 파이어폭스의 점유율을 돌파 후 2012년 전세계 점유율 1위 탈환
- 크롬의 승리 요인
- 압도적인 속도
5. 파편화와 표준화
- 제 1차 브라우저 전쟁 이후 수 많은 브라우저에서 자체 자바스크립트 언어를 사용하게 됨
- 결국 서로 다른 모습의 자바스크립트가 만들어지면서 크로스 브라우징 이슈가 발생하여 웹 표준의 필요성이 제기
- 크로스 브라우징
- W3C에서 채택된 표준 웹 기술을 채택해 서로 다른 브라우저에서 다르게 구현되고 있는 기술을 비슷하게 만들며 웹 페이지를 제장하는 방법론(동일성이 아닌 동등성)
- 브라우저 마다 렌더링에 사용하는 엔진이 다르기 때문
- 1996년부터 넷스케이프는 표준 제정에 대한 필요성을 주장
- 1997 ECMAscript1(ES1) 탄생
- 제 1차 브라우저 전쟁 이후 문제된 언어의 파편화를 해결하기 위해 크롬의 등장 이후 각 브라우저 회사 및 재단은 표준화에 더욱더 적극적으로 힘을 모으기 시작
6. 현재의 JS
2015년 ES2015(ES6)탄생
- Next-gen of JS
- JS의 고질적인 문제들을 해결
- JS의 다음 시대라고 불리울 정도로 많은 혁신과 변화를 맞이한 버전
- 이때붙 버전 순서가 아닌 출시 년도를 붙이는 것이 공식 명칭이나 통상적으로 ES6라 부름
- 현재는 대부분의 표준이 ES6+로 넘어옴.
7. Vanilla JavaScript
- 크로스 브라우징, 간편한 활용 등을 위해 많은 라이브러리 등장
- 최근 표준화된 브라우저, ES6 이후의 다양한 도구의 등장으로 순수 자바스크립트 활용의 증대
DOM
브라우저에서 할 수 있는 일
- DOM (Document Object Model)
- BOM (Brower Object Model)
- JavaScript Core
DOM이란
- HTML, XML등과 같은 문서를 다루기 위한 언어 독립적인 문서 모델 인터페이스
- 문서를 구조화하고 구조화된 구성 요소를 하나로 취급하며 다루는 논리적 트리 모델
- 문서가 구조화되어 있으며 각 요소는 객체로 취급
- 단순한 속성 접근, 메서드 활용 뿐만 아니라 프로그래밍 언어적 특성을 활용한 조작 가능
- 주요 객체
- window: DOM을 표현하는 창. 가장 최상위 객체
- document: 페이지 콘텐트의 Entry Point역할을 하며,
<body>
등과 같은 수 많은 다른 요소들을 포함
- navigator, location, history, screen
DOM 해석
- parsing(파싱)
- 구문분석, 해석
- 브라우저가 문자열을 해석하여 DOM Tree로 만드는 과정
DOM 조작
개념
- Document는 문서 한 장에 해당하고 이를 조작
- 조작 순서
1. 선택
2. 변경
DOM 관련 객체의 상속 구조
- EventTarget
- EventListener를 가질 수 있는 객체가 구현하는 DOM 인터페이스
- Node
- Elemnt
- Document안의 모든 객체가 상속하는 가장 범용적인 기반 클래스
- 부모인 노드와 그 부모인 EventTarget의 속성을 상속
- Document
- 브라우저가 불러온 웹 페이지를 나타냄
- DOM트리의 진입점 역할을 수행
- HTMLElement
- 모든 종류의 HTML 요소
- 부모인 Element의 속성 상속
DOM 선택
Document.querySelector()
- 제공한 선택자와 일치하는 element 하나 선택
- 제공한 CSS selector를 만족하는 첫번째 element객체를 반환
Document.querySelectorAll()
- 제공한 선택자와 일치하는 여러 element를 선택
- 매칭할 하나 이상의 셀렉터를 포함하는 유효한 CSS selector를 인자로 받음
- 지정된 셀렉터에 일치하는 NodeList를 반환
getElementById()
getElemenetByTagName()
getElementsByClassName()
querySeector()
, querySelectorAll()
을 사용하는 이유
id, class, tag선택자 등을 모두 사용하기 때문에 더 구체적이고 유연하게 선택 가능
선택 메서드 별 반환 타입
- 단일 element
- getElementById()
- querySelector()
- HTMLCollection
- getElementsByTagName()
- getElementsByClassName()I
- NodeList
HTMLCollection & NodeList
- HTMLCollection
- name, id, 인덱스 속성으로 각 항목들에 접근 가능
- NodeList
- 인덱스 번호로만 각 항목들에 접근 가능
- 단, HTMLCollection과 달리 배열에서 사용하는 for each 함수 및 다양한 메서드 사용 가능
- 둘 다 배열과 같이 각 항목을 접근하기 위한 인덱스를 제공(유사 배열)
- 둘 다
Live Collection
으로 DOM의 변경사항을 실시간으로 반영하지만, querySelectorAll()에 의해 반환되는 NodeList는 Static Collection
collection
- live collection
- 문서가 바뀔 때 실시간으로 업데이트
- HTML collection, NodeList
- static collection(non-live)
- 돔이 변경되어도 collection 내용에는 영향을 주지 않음.
- querySelectorAll()의 반환 NodeList만 static collection
변경
- Document.createElement()
- 주어진 태그명을 사용해 HTML요소를 만들어 반환
- ParentNode.append()
- 특정 부모 노드의 자식 노드 리스트 중 마지막 자식 다음에 Node 객체나 DOMString을 삽입
- 여러 개의 Node 객체, DOMString을 추가 할 수 있음
- Node.appendChild()
- 한 노드를 특정 부모 노드의 자식 노드 리스트 중 마지막 자식으로 삽입(Node만 추가)
- 만약 주어진 노드가 이미 문서에 존재하는 다른 노드를 참조한다면 새로운 위치로 이동
- ChildNode.remove()
- Node.removeChild()
- DOM에서 자식 노드를 제거하고 제거 된 노드를 반환
- Node는 인자로 들어가는 자식 노드의 부모 노드
변경 관련 속성
- Node.innerText
- 노드와 그 자손의 텍스트 컨텐츠를 표현
- 즉, 줄 바꿈을 인식하고 숨겨진 내용을 무시하는 등 최종적으로 스타일링이 적용 된 모습으로 표현
- Element.innerHTML
- 요소 내에 포함 된 HTML 마크업을 반환
- XSS 공격에 취약점이 있으므로 사용시 주의
변경 관련 메서드
- Element.setAttribute(name, value)
- 지정된 요소의 값을 설정
- 값이 이미 존재하면 업데이트 되고, 아니면 새로 생성된다.
- Element.getAttribute()
EventListener
Event
- 네트워크 활동 혹은 사용자와의 상호작용 같은 사건의 발생을 알리기 위한 객체
- 이벤트는 마우스를 클릭하거나 키보드를 누르는 등 사용자 행동에 의해 발생할 수도 있고, 특정 메서드를 호출하여 프로그래밍적으로도 만들어낼 수 있음.
- 이벤트 처리기
- EventTarget.addEventListener()
- 해당 메서드를 통해 다양한 요소에서 이벤트를 붙일 수 있음
- removeEventListener()를 통해 이벤트를 제거 가능
Event handler
- EventTarget.addEventListener()
- 지정한 이벤트가 대상에 전달될 때마다 호출할 함수를 설정
- 이벤트를 지원하는 모든 객체를 대상으로 지정 가능
- target.addEventListener(type, listener[, options])
- type: 반응 할 이벤트 유형(대소문자 구분 문자열)
- listener: 지정된 타입의 이벤트가 발생 했을 때 알림을 받는 객체
EventListener 인터페이스 혹은 JS function 객체(콜백 함수)여야 함