본문 바로가기

UI개발

DOM - Document 노드

Document 노드 개요

 

HTMLDocument 생성자는 DOM 내에 DOCUMENT_NODE를 생성한다.

이를 확인하려면, document 노드 개체 생성에 사용되는 생성자가 무엇인지를 물어보면 된다.

 

<script>

console.log(window.document.constructor); // function HTMLDocument() { [native code] }

console.log(window.document.nodeType); // DOCUMENT_NODE에 대한 숫자 키 매핑인 9가 출력

</script>

 

Document 및 HTMLDocument 생성자는 보통 HTML 문서를 로드 시 브라우저에 의해 인스턴스가 만들어진다.

하지만 document.implementation.createHTMLDocument()를 사용하면, 브라우저 내에 현재 로드된 문서 외부에 직접 HTML 문서를 생성할 수 있다.

createHTMLDocument() 외에, createDocument()를 사용하여 HTML 문서로 설정된 document 개체를 생성할 수 있다.

이 메서드들을 사용하는 예로, 프로그래밍적인 방법으로 iframe에 HTML 문서를 제공하는 것을 들 수 있다.

 

 

HTMLDocument의 속성 및 메서드 (상속된 것 포함)

 

<script>

//document 고유 속성

console.log(Object.keys(document).sort());

 

//document 고유 속성 및 상속받은 속성

var documentPropertiesIncludeInherited = [];

for (var p in document) {

    documentPropertiesIncludeInherited.push(p);

}

console.log(documentPropertiesIncludeInherited.sort());

 

//documment가 상속받은 속성만

var documentPropertiesOnlyInherited = [];

for (var p in document) {

    if (!document.hasOwnProperty(p)) {

        documentPropertiesOnlyInherited.push(p);

    }

}

console.log(documentPropertiesOnlyInherited.sort());

</script>

 

 

주목해야 할 속성과 메서드.

 

- doctype

- documentElement

- implementation.*

- activeElement

- body

- head

- title

- lastModified

- referrer

- URL

- defaultview

- compatMode

- ownerDocument

- hasFocus()

 

 

일반적인 HTML 문서 정보 얻기 (제목, url, referrer, 최종 수정일, 호환 모드)

 

<script>

var d = document

console.log(d.title);

console.log(d.URL);

console.log(d.referrer);

console.log(d.lastModified);

console.log(d.compatMode); // BackCompat (quirks 모드) 또는 css1Compat (strict 모드) 중 하나가 출력.

</script>

 

 

document 자식 노드

document 노드는 DocumentType 노드 개체 하나와 Element 노드 개체 하나를 가질 수 있다.

 

document는 <!DOCTYPE>, <html lang="ko">, <head>, <body>에 대한 바로가기를 제공한다.

- document.doctype은 <!DOCTYPE>을 참조한다.

- document.documentElement는 <html lang="ko">을 참조한다.

- document.head는 <head>를 참조한다.

- document.body는 <body>를 참조한다.

 

 

document.implementation.hasFeature()를 사용하여 DOM 사양/기능 탐지하기

 

현재 문서에 대해 브라우저가 구현/지원하는 기능 및 수준에 대해 물어볼 수 있다.

예를 들어, 브라우저가 Core DOM Level3 사양을 구현했는지를 물어보려면, hasFeature() 메서드에 기능 명칭과 버전을 전달한다.

 

console.log(document.implementation.hasFeature("Core","2.0"));

 

 

문서 내에서 포커스를 가지고 있거나 활성 상태인 노드에 대한 참조를 얻기.

 

document.activeElement를 사용하면, 문서 내에서 포커스를 가지고 있거나 활성 상태인 노드에 대한 참조를 바로 얻을 수 있다.

 

<textarea></textarea>

 

<script>

document.querySelector("textarea").focus(); // textarea에 포커스 설정.

console.log(document.activeElement); // textarea 출력.

</script>

 

문서 혹은 문서 내의 특정 노드가 포커스를 가지고 있는지 판별하기.

document.hasFocus() 메서드를 사용하면, 사용자가 현재 해당 HTML 문서가 로드된 창에 포커스를 두고 있는지를 알 수 있다.

 

<script>

// 문서가 로드된 창/탭에 계속 포커스를 두면 true가 반환. 그렇지 않을 경우 false가 반환.

setTimeout(function(){console.log(documnet.hasFocus())}, 5000);

</script>

 

 

document.defaultView는 최상위/전역 개체에 대한 바로가기.

 

웹 브라우저에서 최상위 개체는 window 개체이므로, 

자바스크립트 브라우저 환경에서 defaultView는 이 개체를 가리킨다.

 

console.log(document.defaultView) // 최상위 js 개체에 대한 참조. 브라우저에서는 window 개체다.

 

최상위 개체가 없는 DOM이나 웹 브라우저 내에서 실행되지 않은 자바스크립트 환경의 경우 

이 속성은 최상위 개체 영역에 접근할 수 있게 해준다.

 

 

Element에서 ownerDocument를 사용하여 Documnet에 대한 참조 얻기.

 

ownerDocument 속성을 호출하면, 노드가 포함된 document에 대한 참조를 반환한다.

다음 코드에서는 HTML 문서 내의 <body>에서 document에 대한 참조를 얻고, 

iframe 내에 포함된 <body> element에서 document 노드를 얻어낸다.

 

<body>

<iframe src=""></iframe>

</body>

<script>

// body가 포함된 window.document를 얻음.

console.log(document.body.ownerElement);

 

//iframe 내의 <body>가 포함된 window.document를 얻음.

console.log(window.frames[0].document.body.ownerElement);

</script>

 

document 노드에서 dwnerDocument를 호출하면 null 값이 반환된다.