다루는 내용
- 선택자 API 에 대한 이해
- HTML5 DOM 확장 사용
- 브라우저 전용 DOM 확장 사용
1. 선택자 API
- CSS 선택자로 패턴을 만들고 그에 맞는 DOM 요소를 선택하는 능력
- (Ex. jQuery)
1-1 querySelector()
CSS 쿼리를 받고 패턴에 일치하는 첫 번째 자손 요소를 반환 없으면 null
var body = document.querySelector('body'); // ID 가 'div1' 인 요소 var div1 = document.querySelector('#div1'); // 클래스가 selected 인 것 중 첫 번째 var selected = document.querySelector('.selected')
Document 타입에서 호출하면 패턴에 맞는 요소를 문서에서 찾으며 Element 타입에서 호출하면 해당 요소의 자손에서만 쿼리
1-2 querySelectorAll()
querySelector() 와 비슷하나 일치하는 노드 전체를 반환
처음 접근한 상태의 NodeList 의 정적 인스턴스 반환
var ems = document.getElementById('myDiv').querySelectorAll('em'); var selecteds = document.querySelectorAll('.selected');
2. HTML5
- 마크업 언어와 함께 사용하도록 디자인된 자바스크립트 API 를 상세히 설명하고 정의
2-1 클래스 관련
getElementsByClassName()
- 클래스 이름 문자열을 매개변수로 받음
- 해당 클래스를 가모두 가진 요소의 NodeList 반환
// div1 의 자손 중 selected 클래스가 있는 요소를 모두 찾음 var selected = document.getElementById('div1') .getElementByClassName('selected');
classList 프로퍼티
- 클래스 이름을 안전하고 단순하게 조작 가능
- DOMTokenList란 컬렉션 타입의 인스턴스
- add(value) - 주어진 문자열 값을 목록에 추가
- contains(value) - 주어진 값이 목록에 존재하면 ? true : false
- remove(value) - 주어진 문자열 값을 목록에서 제거
- toggle(value) - 값이 목록에 존재하면 ? 제거 : 추가
// disabled 클래스 제거 div.classList.remove('disabled'); // current 클래스 추가 div.classList.add('current'); // user 클래스 토글 div.classList.toggle('user'); // bd 클래스 포함여부 확인 if(div.classList.contains('bd')) { // do Something }
2-2 포커스 관리
사용자가 지금 페이지를 보고 있는지 알 수 있음
document.activeElement, focus()
var button = document.getElementById('myButton'); button.focus(); console.log(document.activeElement === button); // treu console.log(document.hasFocus()); // true
2-3 HTMLDocument의 변화
- readyState : 문서를 불러왔는지 확인
- loading - 문서를 불러오는 중
- complete - 문서를 완전히 불러옴
2-4 커스텀 데이터 속성
렌더링에 필요한 정보나 시멘틱 값이 아닌 데이터를 접두사
data-
가 붙은 비표준 속성에 제공dataset 프로퍼티로 접근 가능
<div id="myDiv" data-appId="111" data-myName="snack"></div> var div = document.getElementById("myDiv"); var appId = div.dataset.appId; var myName = div.dataset.myName;
요소에 데이터를 연결해야 하지만, 사용자에게는 보이고 싶지 않을 때 유용
2-5 마크업 삽입
innerHTML
- 읽기모드로 사용 시 요소와 주석, 텍스트 노드 등의 자식 노드를 모두 나타내는 HTML 표현을 반환 (직렬화 후 문자열로 반환)
- 쓰기 모드로 사용 시 주어진 값을 바탕으로 자식 노드를 교체
<script>
로 삽입된 것은 실행되지 않음
outerHTML
- 호출한 HTML 요소를 자식 노드와 함께 반환
<div>
<span>hi!</span>
</div>
//innerHTML - div 에서 innerHTML -> <span>만 포함하는 객체
//outerHTML - div 에서 outerHTML -> div 가 포함된 객체
insertAdjacentHTML
- beforebegin - 바로 앞 삽입
- afterbegine - 첫 번째 자식으로 삽입
- beforeend - 마지막 자식으로 삽입
- afterend - 바로 뒤에 삽입
메모리와 성능 문제
- 요소와 이벤트 핸들러 사이의 연결이 메모리에 남기 때문에, 위의 메소드를 사용할 땐 제거할 요소의 이벤트 핸들러나 자바스크립트 객체 프로퍼티를 모두 제거해야 함
2-6 scrollIntoView()
브라우저 창이나 컨테이너 요소를 스크롤해서 해당 요소가 뷰포트에 보이게 함
//forms[0] 요소로 이동 document.forms[0].scrollIntoView();
3. 전용 확장
3-1 문서모드
- IE에서 도입한 개념으로 각 모드마다 CSS, 자바스크립트 기능이 다름
- document.documentMode
- 특정 문서 모드를 강제할 수 있으며, 페이지가 어떻게 동작할지 힌트를 얻을 수 있음
3-2 children 프로퍼티
- 요소의 자식 요소만 포함하는 HTMLCollection
- 요소인 노드만 포함한다는 점을 제외하면 childNodes 와 같음
3-3 contains()
주어진 노드가 다른 노드의 자손인지 확인 가능
document.documentElement.contains(document.body); // true
3-4 innerText, outterText
- 텍스트 노드를 모두 결합한 값을 반환
<P>hello</P>
<ul>
<li>go 1</li>
<li>go 2</li>
</ul>
-----------------------------
/* result */
hello
go 1
go 2
- 파이어폭스 에서는 textContent
- outterText 의 경우 자신을 호출한 요소 전체를 변경하기에 사용을 지양
3-5 스크롤
'개발 관련 > javascript' 카테고리의 다른 글
17. 에러 처리와 디버깅 (0) | 2022.07.13 |
---|---|
13. 이벤트 (0) | 2022.07.13 |
10. DOM (0) | 2022.07.13 |
8. 브라우저 객체 모델 (0) | 2022.07.13 |
7. 함수 표현식 (0) | 2022.07.13 |