자바스크립트
DOM과 BOM
그레고리력
2021. 7. 16. 00:01
DOM(Document Object Model)
- 웹페이지를 자바스크립트로 제어하기 위한 객체 모델(문서에 대한 모든 내용을 담고 있음)
- 텍스트 파일의 문서를 브라우저가 이해할 수 있는 구조로 구성한 것 → HTML 요소의 관계를 반영하여 모든 노드들을 트리구조로 구성한 것
- HTML뿐 아니라 다양한 마크업 언어를 제어하기 위한 모델, 문서의 구조화된 표현으로 프로그래밍 언어가 DOM구조에 접근해 문서 구조, 스타일 등을 변경할 수 있도록 함
- Document 객체는 윈도우에 로드된 문서를 의미한다고 할 수 있다.
- 웹에서 발생하는 수많은 이벤트(Event)는 모두 자바스크립트의 객체, 이런 Document 객체(요소)로 구성된 하나의 웹 페이지는 Window를 최상위로 하는 트리를 생성, 각각의 이벤트(객체)는 전파 경로(propagation path)를 따라 전파
제어의 대상에 해당되는 객체를 찾는 것
- document.getElementsByTagName : 태그명에 해당하는 객체들을 찾아서 그 리스트를 NodeList라는 유사 배열에 담아서 반환
- 만약 조회의 대상을 좁히려면 특정 객체를 지정(ul.getElementsByTagName('li'))
- document.getElementsByClassName : class 속성의 값을 기준으로 객체를 조회
- document.getElementById: id 값을 기준으로 객체를 조회
- document.querySelector : css 선택자의 문법을 이용해서 객체를 조회
- document.querySelectorAll : 모든 객체를 조회
jQuery
- DOM을 내부에 감추고 보다 쉽게 웹페이지를 조작할 수 있도록 돕는 도구
- $()는 jQuery의 함수이다. 이 함수의 인자로 CSS 선택자(li)를 전달하면 jQuery 객체라는 것을 리턴
- $('li').css('color', 'red');
HTMLElement
- 객체를 조회했다면 구체적인 작업을 처리하기 위해서 획득한 객체가 무엇인지 알아야 한다.
- document.getElementById : 리턴 데이터 타입은 HTMLLIELement
- document.getElementsByTagName : 리턴 데이터 타입은 HTMLCollection(유사배열, 리턴 결과가 복수일 때 )
- HTMLCollection의 목록은 실시간으로 변경(일부 원소를 제거한 후 재조회할 필요 없이 자동 반영)
- 태그의 성격과 쓰임에 따라 객체가 다르다 →
HTMLLIElement, HTMLAnchorElement, HTMLInputElement
- DOM Tree: 모든 엘리먼트는 HTMLElement의 자식
- HTMLElement는 Element의 자식이고 Element는 Node의 자식이다. Node는 Object의 자식이다. 이러한 관계를 DOM Tree라고 한다.
jQuery 객체
- jQuery 함수의 리턴값, jQuery 함수를 이용해서 선택한 엘리먼트들에 대해서 처리할 작업을 프로퍼티로 가지고 있는 객체
- 암시적 반복 : 선택된 엘리먼트 전체에 대해서 동시에 작업이 처리
- 두 번째 인자가 있으면 설정, 없으면 가져오는 것
- 값을 가져올 때는 선택된 엘리먼트 중 첫번째에 대한 값만을 반환
- 체이닝 : chainig이란 선택된 엘리먼트에 대해서 연속적으로 작업을 처리할 수 있는 방법
- map은 jQuery 객체의 엘리먼트를 하나씩 순회, 첫번째 인자로 엘리먼트의 인덱스, 두번째 인자로 엘리먼트 객체(DOM)이 전달
Element 객체
- 엘리먼트를 추상화한 객체
- DOM은 HTML만을 제어하기 위한 모델이 아니다. HTML이나 XML, SVG, XUL과 같이 마크업 형태의 언어를 제어하기 위한 규격
- 주요기능 : 식별자, 조회, 속성
- 식별자
- Element.tagName
- Element.id
- Element.className
- Element.classList
- 조회 API: 엘리먼트를 조회하는 기능
- Element 객체의 조회 메소드는 해당 엘리먼트의 하위 엘리먼트를 대상으로 조회를 수행
- 속성: HTML에서 태그명만으로는 부족한 부가적인 정보
- setAttribute('class', 'important')와 className = 'important'는 같은 결과를 만든다. 하지만 전자는 attribute 방식(속성이라고 부르겠다)이고 후자는 property 방식
- property 방식은 좀 더 간편하고 속도도 빠르지만 실제 html 속성의 이름과 다른 이름을 갖는 경우가 있다
Attribute와 property 차이
- attribute 는 html 문서에서 elements 에 추가적인 정보를 넣을 때 사용되는 요소
- 예를 들어,
<div class= ‘my-class’></div>
라는 ‘my-class’라는 클래스 속성을 가진 div 요소에서 div 는 element(요소) 이고 class 는 attribute(속성) 가 되며 ‘my-class’ 는 class attribute의 value(값) - property는 html DOM 안에서 attribute 를 가리키는(혹은 대신하는) 표현
- attribute는 html document/file 안에서 property 는 html DOM tree안에서 존재
- attribute는 정적으로 변하지 않고 property는 동적으로 그 값이 변할 수 있다는 것을 내포
- 예를 들어 체크박스 태그가 있을 때 유저가 체크박스에 체크를 하면 attribute의 상태는 변하지 않지만 property의 상태는 checked로 변하게 됩니다.
- attribute 는 html 문서 안에서의 정적인(바뀌지 않는) 속성 그 자체를 의미하고, property 는 html DOM 안에서 동적인(바뀌는) 속성(또는 그 값)을 의미
Node 객체
- 모든 DOM 객체는 Node 객체를 상속 받는다
- Node 관계 API : Node.childNodes, Node.firstChild(공백, 줄바꿈 등 영향), Node.lastChild, Node.nextSibling, Node.previousSibling
- 노드 종류 API : nodeType, nodeName
- 노드의 종류에 따라서 정해진 상수가 존재
- 노드 변경 API
- 노드를 추가하기 위해서는 추가할 엘리먼트를 생성해야 함 : document.createElement(tagname), document.createTextNode(data)
- appendChild(child) : 노드의 마지막 자식으로 주어진 엘리먼트 추가
- insertBefore(newElement, referenceElement) : 두번째 인자로 엘리먼트를 전달 했을 때 이것 앞에 엘리먼트가 추가
- removeChild(child), replaceChild(newChild, oldChild)
- jQuery 노드 변경 API : Manipulation 카테고리
- 추가, 제거, 바꾸기, 이동, 복사
Document 객체
- window 객체의 property
- Document 객체는 DOM의 스팩이고 이것이 웹브라우저에서는 HTMLDocument 객체로 사용된다.
- HTMLDocument 객체는 문서 전체를 대표하는 객체, DOM 트리 최상위 객체
- document 객체의 주요 임무는 새로운 노드를 생성해주는 역할 : createElement(), createTextNode()
- 문서 정보 API
Text 객체
- 텍스트 노드에 대한 DOM 객체로 CharcterData를 상속 받는다.
- DOM에서는 공백이나 줄바꿈도 텍스트 노드
- 값 API : data, nodeValue
- 조작 API : appendData(), deleteData(), insertData(), replaceData(), subStringData()
문서의 기하학적 특성
- 요소(element)의 크기와 위치, Viewport, 스크롤, 스크린의 크기
DOM API
- 브라우저에서 제공하는 api 중 하나로 자바스크립트로 웹 페이지를 동적으로 조작 가능
랜더링 과정
- css 태그를 상단에 위치하는 이유 : 스타일 시트를 최대한 빨리 다운 받고 cssom 트리가 구성되어야 랜더링을 하기 때문에 흰 화면 응시 시간을 줄이기 위해
- script 태그가 하단인 이유 : 스트립트 태그를 만나면 파싱을 멈추고 스크립트를 읽기 때문, 생성되지 않은 DOM 노드를 조작하는 것이 불가능하기 때문
BOM(Browser Object Model)
- 웹브라우저의 창이나 프래임을 추상화해서 프로그래밍적으로 제어할 수 있도록 제공하는 수단
- 즉 닫기 창이나 검색창 등 브라우저 틀에 관련된 부분을 제어
- 전역객체인 Window의 프로퍼티와 메소드들을 통해서 제어
Window 객체
- 모든 객체가 소속된 객체이고, 전역객체이면서, 창이나 프레임을 의미
HTML
- form을 통해서 사용자와 커뮤니케이션할 수 있는 기능을 제공
- prompt : 사용자에게 값을 입력받음
Location 객체
- 문서의 주소와 관련된 객체로 Window 객체의 프로퍼티
- console.log(location.protocol, location.host, location.port, location.pathname, location.search, location.hash)
- URL 변경하기 가능(다른 url로 이동)
Navigator 객체
- 브라우저의 정보를 제공하는 객체
- console.dir(navigator);
- appName, appVersion, userAgent, platform
창 제어
- window.open 메소드는 새 창을 생성