0822 개발일지
24783 단어 대구AI스쿨JavaScriptJavaScript
학습내용
자바스크립트 DOM 기능
github커밋
DOM 문서 객체 모델
- DOM (The Document Object Model)
- document(js와 연결된 html문서), element(html태그), attribute(html태그의 속성들)
자바스크립트 html 접근 방법
getElement ~
getElements~
:collection
이라는 유사배열 형태로 반환함. 배열 일부 메서드만 활용 가능getElementsByTagName
: 태그명으로 접근 -> 배열로 반환getElementsByClassName
: 클래스명으로 접근 -> 배열로 반환getElementById
: id로 접근 -> 하나의 객체로 반환
querySelector
- css 선택자와 동일한 방식으로 접근
- 가장 먼저 나오는 태그, 클래스 객체 하나만 반환
- 속도는 이전 방식이 조금 더 빠르지만 편의성 좋음
querySelectorAll
querySelectorAll
: 해당되는 태그, 클래스 객체 전부collection
으로 반환- collection과 반복문을 결합해 일괄 디자인 적용이 가능함
for (var i = 0; i < containers.length; i++) {
containers[i].style.backgroundColor = 'blue';
}
html 태그, 내부 content 선택 및 변경 관련
innerHTML, outerHIML
element.innerHTML
: element 안 내용물을 문자열 형태로 반환element.outerHTML
: element 자기 자신 포함한 내용물 문자열 형태 반환- 새로운 태그 삽입, 수정 등 전부 가능함
var header = document.querySelector('.masthead');
console.log(header.innerHTML);
console.log(header.outerHTML);
header.innerHTML = "<h1>Hello World</h1>";
textContent, innerText
textContent
: html에 작성된 텍스트에 접근 및 수정innerText
: css 속성 적용된 상태로 접근 및 수정
var heading = document.querySelector('.masthead-heading');
console.log(heading.innerText); // IT'S NICE TO MEET YOU
console.log(heading.textContent); // It's Nice To Meet You
html 태그 생성 createElement()
createElement()
: 만들 태그 종류를 인수로 넘겨준다. html 문서에 실제로 삽입하기 전까진 코드 상으로만 존재하는 태그가 된다.
var h3Test = document.createElement('h3');
h3Test.textContent = 'Hello world';
html 태그 삽입
1. appendChild()
appendChild()
: 부모 태그 안 마지막에 삽입- 어떤 부모태그에서 사용하느냐에 따라 위치 변경됨
appendChild() 사용 시 주의점
- 같은 부모를 가진 형제 태그들 안에 appendChild() 사용 시 가장 마지막 형제태그에만 적용됨
var subHeading = document.querySelector('.masthead-subheading');
var heading = document.querySelector('.masthead-heading');
var btn = document.querySelector('.masthead .btn');
subHeading.appendChild(h3Test);
heading.appendChild(h3Test);
btn.appendChild(h3Test); // btn 안에만 태그 삽입됨
2. insertAdjacentHTML()
- 부모 태그 관련 없이 내가 원하는 위치에 태그 삽입 가능함
insertAdjacentHTML(position, text)
position
: 'beforebegin' 열림태그 전, 'afterbegin' 열림태그 후, 내용물 전, 'beforeend' 내용물 후, 닫힘태그 전, 'afterend' 닫힘태그 후text
: html 태그 포함해서 문자열로 전달
var heading = document.querySelector('.masthead-heading');
var txt = "<h3>!!!!!!!!!!</h3>";
heading.insertAdjacentHTML('beforeend', txt);
html 태그 삭제
1. removeChild()
- 부모 기준으로 삭제해야 되니 삭제할 태그와 그 부모 태그 알아야 함
parentElement
: 태그의 바로 위 부모 태그 반환
var headContainer = document.querySelector('.masthead .container'); // 부모 지정
var heading = document.querySelector('.masthead-heading'); // 삭제할 태그
headContainer.removeChild(heading);
heading.parentElement.removeChild(heading);
2. remove()
- 부모 태그 등 관계 없이 특정 태그 삭제
heading.remove();
html 자식태그 선택
fisrtElementChild
: 부모태그의 여러 자식 요소 중 첫 번째 선택lastElementChild
: 부모태그의 여러 자식 요소 중 마지막 선택
css 제어방식 3가지
- html style 속성으로 바로 들어가서 cascading으로 인해 가장 우선 적용됨
1. style 뒤에 css 속성값 이름 camelCase로 작성
heading.style.color = 'red';
heading.style.backgroundColor = "pink";
heading.style.fontSize = '25px';
2. style.cssText
- 약점: 오타에 취약함
heading.style.cssText = "color: red; background-color: blue; font-size: 25px";
3. setAttribute() 메서드 사용
setAttribute('변경할 속성', '속성값')
- style의 경우 cssText 방법과 동일하게 문자열 넣어야 되므로 비추천
- id를 새로 추가한 후 해당 id로 요소 선택하는 방식 사용 가능
heading.setAttribute("id", "heading-test");
document.querySelector('#heading-test').style.backgroundColor = "pink";
css 클래스 접근방식 2가지
1. className
- 클래스 전부를 문자열로 가져옴
- 개별 클래스 접근하려면 문자열 split->배열 인덱스 접근 2단계 필요
var heading = document.querySelector('.masthead-heading');
var headingClass = heading.className;
var headingArr = headingClass.split(' ');
console.log(headingClass); // masthead-heading text-uppercase
console.log(headingArr[1]);
- className으로 새로운 클래스 추가: 기존 클래스에 덮어 씌워짐
heading.className = 'asthead-heading text-uppercase test';
heading.className += ' test';
2. classList
DOMTokenList
라는 유사배열 형태로 가져옴- 개별 클래스 접근 시 split 필요 없이 배열 인덱스로 접근할 수 있음
새로운 클래스 추가, 삭제
classList.add()
: 새 클래스 추가classList.remove()
: 기존 클래스 삭제classList.toggle()
: 인수로 준 클래스가 이미 있으면 삭제, 없으면 생성
heading.classList.add('test1', 'test2');
heading.classList.remove(headingClass[1]);
heading.classList.toggle('test1');
클래스 있는지 여부 판별: contains()
contains()
: 인수가 포함되어 있으면 true, 없으면 false
console.log(heading.classList.contains('text-uppercase')); // true
eventListener
이벤트 종류
- 'click', 'submit', 'keyup'(키보드입력) 등: javascript 이벤트 타입 검색하기
- 참고링크:w3school
이벤트 추가, 삭제
- 이벤트 리스너의 두 번째 인자로 콜백함수가 들어가는데, 별도의 함수를 따로 만들어 함수명만 넣어줄 수도 있고 익명함수를 사용할 수도 있다.
// 1. 별도 함수 사용
var heading = document.querySelector('.masthead-heading');
function test() {
console.log('click');
};
heading.addEventListener('click', test);
heading.removeEventListener('click', test);
// 2. 익명 함수 사용
heading.addEventListener('click', function (){
console.log('click');
});
removeEventListener
를 사용하기 위해서는addEventListener
에서 사용한 콜백함수를 정확히 지정해서 삭제해야 하는데, 함수는 참조형 데이터타입이라 값이 같아도 주소값이 다르면 다른 객체로 취급된다. 따라서 별도 함수를 만들어 함수명만 전달하는 방식을 사용해야 한다.
// 틀린 방법: add, remove의 콜백함수는 값은 같아도 주소값이 다름
heading.addEventListener('click', function (){
console.log('click');
});
heading.removeEventListener('click', function (){
console.log('click');
});
// 바른 방법
function test() {
console.log('click');
};
heading.addEventListener('click', test);
heading.removeEventListener('click', test);
태그 기본 기능 삭제: preventDefault()
- 콜백함수 매개변수로 e(이벤트 객체) 전달 -> e에서 메서드 사용
- 아래 코드에선 a태그 본연의 기능(링크, 위치로 이동)을 삭제함
- 어제 혼자 만들었던 메뉴 버튼엔 추후 링크로 이동 기능 필요하니 preventDefault() 필요 없을 듯
var btn = document.querySelector('#btn');
btn.addEventListener('click', function(e) {
e.preventDefault();
console.log('hello world');
});
어려웠던 점
main.js:219 Uncaught TypeError: Cannot read property 'addEventListener' of null at main.js:219
에러 자주 발생함
해결방법
- 보통 querySelector 인수에 오타가 나서 html 태그를 불러오지 못해서 null이 전달된 경우가 많았다. 자주보니 에러만 봐도 어느 부분에서 무제가 있는지 대충 알 것 같다.
소감
main.js:219 Uncaught TypeError: Cannot read property 'addEventListener' of null at main.js:219
에러 자주 발생함- 보통 querySelector 인수에 오타가 나서 html 태그를 불러오지 못해서 null이 전달된 경우가 많았다. 자주보니 에러만 봐도 어느 부분에서 무제가 있는지 대충 알 것 같다.
소감
이전 실습에서 종종 썼던 내용들을 하나씩 정리할 수 있어서 도움이 되었다.
Author And Source
이 문제에 관하여(0822 개발일지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lee_yesol421/0822-개발일지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)