* 해당 내용은 인프런 강의 중 이고잉님의 「웹브라우저 JavaScript」를 수강 후 작성한 노트입니다.
[무료] 웹브라우저 Javascript (자바스크립트) - 인프런 | 강의
생활코딩 자바스크립트 강좌 입니다. 웹브라우저를 직접 제어할 수 있는 자바스크립트 레퍼런스를 공부해 봅니다., - 강의 소개 | 인프런...
www.inflearn.com
2023.01.15 - [Computer Science/Etc.] - 웹 브라우저 JavaScript
웹 브라우저 JavaScript
* 해당 내용은 인프런 강의 중 이고잉님의 「웹브라우저 JavaScript」를 수강 후 작성한 노트입니다. https://www.inflearn.com/course/javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%95%EC%A2%8C/dashboard
hzyiunn.tistory.com
2023.01.15 - [Computer Science/Etc.] - 웹 브라우저 JavaScript2
웹 브라우저 JavaScript2
* 해당 내용은 인프런 강의 중 이고잉님의 「웹브라우저 JavaScript」를 수강 후 작성한 노트입니다. https://www.inflearn.com/course/javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%95%EC%A2%8C/dashboard
hzyiunn.tistory.com
jQuery 속성 제어 API 1 : .attr
- Element 객체의 메소드 중 setAttribute, getAttribute - jQuery 메소드 중 attr (removeAttribute - removeAttr)
jQuery 속성 제어 API 2 : .attr vs. .prop
- console.log(t1.attr('href'); 하면 설정한 attribute방식(./demo.html)
- console.log(t1.prop('href'); 하면 설정한 property방식(http://localhost/jQuery_Attribute.api/demo.html)
- console.log(t2.attr('checked')); 하면 checked 출력
- console.log(t2.prop('checked')); 하면 true 출력
- jQuery 내에서 property에 사용해야 하는 이름을 쓰거나 HTML 속성의 이름을 써도 보정되기 때문에 둘 중 아무거나 사용해도 됨.
jQuery 조회 범위 제한
- Element 객체에서 getElementBy~ 하면 범위 제한이 있었음.
- $(".marked", "#active").css("background-color", "red"); -> 인자1 : 효과 주고자 하는 element 지정. 인자2 : selector context. 첫 번째 인자에 대해 제어하려는 element.
- $("#active .marked").css("background-color", "red"); -> id가 active인 element의 하위 element 중에 marked라는 class 이름 가진 element
- $('#active').find('.marked').css("background-color", "red"); -> find 앞에 속해있는 jQuery 객체 집합 중에서 .marked 이름을 가진 class의 element만을 조회. 이 결과로 여기 해당되는 또 다른 jQuery object 리턴
- $('#active').css('color', 'blue').fine('.marked').css('color', 'red');
Node 객체
- DOM에서 시조와 같은 역할(가장 최상위의 조상). 모든 DOM 객체는 Node 객체 상속받음.
- Node.childNodes
- Node.firstChild
- Node.lastChild
- Node.nextSibling
- Node.prviousSibling
- Node.contains()
- Node.hasChildNodes()
- 각 노드의 종류나 이름, 값, 하위 element들에 대한 text값 알 수 있음(Node.nodeType Node.nodeName Node.nodeValue Node.textContent)
- 자식 관리 가능(appendChild(). removeChild())
Node 종류 API 1 : NodeType, NodeValue
- 현재 선택된 node 타입, 태그명 판단
- 노드의 종류에 따라 정해진 상수가 존재. 노드 종류에 따라 1~10까지 상수값이 있음. 때문에 비교할 때 숫자로 해도 되고 TEXT_NODE와 같이 변수로 비교해도 됨.
- body.firstChild.nextSibling.nodeName -> "UL"출력
Node 종류 API 2 : 재귀함수1
- 특정 element의 하위 element 조회하면서 작업 처리
Node의 변경 API 1 : 노드의 추가
- appendChild(child) - 노드 생성해야 함. 근데 이 일은 document 객체가 기능.
- document.createElement(tagname)
- document.createTextNode(data)
- insertBefore(newELement, referenceElement)
Node의 변경 API 2 : 노드 삭제, 교체
- target.parentNode.removeChild(target);
- target.replaceChild(a, target.firstChild);
jQuery Node 제어 API 1 : 추가
- manipulation 카테고리에 속하는 API
- before / [prepend / content / append] / after
jQuery Node 제어 API 2 : 제거
- remove : 선택된 element 제거
- empty : 선택된 element의 text node 제거
jQuery 노드 변경 API 3 : 교체, 복사, 이동
- reaplaceAll : 제어 대상 인자로 전달
$('#btn1').click(function()
{
$('<div>replaceAll</div>').replaceAll('#target1');
})
2. replaceWith : 제어 대상 먼저 지정
$('#btn2').click(function()
{
$('#target2').replaceWith('<div>replaceWith</div>');
})
3. clone() : 복사
<script type="text/javascript">
$('#btn1').click(function()
{
$('#source').clone().replaceAll('#target1');
})
$('#btn2').click(function()
{
$('#target2').replacewith($('source').clone());
})
</script>
4. append() : 이동
<div class = "target" id="target">
target 1
</div>
<div id="source">
source
</div>
<input type = "button" value="append source to target 1" id = "btn1" />
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
$('#btn1').click(function()
{
$('#target1').append($('#source'));
})
</script>
문자열을 이용한 노드 변경
- innerHTML() : 하위 element(자기 자신 제외)
- outerHTML() : 자기 자신 포함한 element
- innerText, outerText : 읽기를 하면 tag 제외한 상태로 읽어짐. 쓰기를 하면 tag 내용 그대로 출력됨
- insertAdjacentHTML() : 원하는 위치에 적절하게 코드 추가
Document 객체
- DOM의 시작점인 동시에 문서 전체를 의미하는 node
- DOM에서 정의되어 있는 일종의 규격. 실제 HTML에서 Document라는 객체가 사용되는 것은 아니고 HTMLDocument 객체를 사용함.
- 노드 생성 API : createElement() - 문서에서 사용할 node를 생성 / createTextNode()
- 문서 정보 API : title, URL referrer lastModified
Text 객체
- DOM tree에서 Node를 상속받는 객체로 CharacterData를 상속받음.
- 텍스트 노드 값을 가져오는 API : data. nodeValue
- 조작 : appendData(), deleteData(), insertData(), replaceData(), subStringData()
Text 객체 : 값 API
- nodeValue : console.log(t.nodeValue);
- data : console.log(t.data);
조작 API
- appendData()
- deleteData()
- insertData()
- replaceData()
- substringData()
문서의 기하학적 특성 1 : 엘리먼트의 위치와 크기
- 문서에 있는 여러 element 크기, 위치, 화면에서 사용하기 위한 스크롤 제어 등
- 요소의 크기와 위치 : t.getBoundingClientRect() - 객체가 출력됨(사각형의 bottom, height, left, right, top, width 출력) - margin+border+padding+content로 이루어짐. border+padding+content의 값이 width(margin제외한 크기).
- 부모 중 CSS position 값이 static인 td, th, table 엘리먼트가 있다면 이 엘리먼트가 offsetParent.
- 테두리 뺸 content만의 크기 : ClientWidth, ClientHeight
문서의 기하학적 특성 2 : 뷰포트
- 사용자에게 보여주는 영역, 문서는 전체 크기를 말함
- pageYOffset : 스크롤을 얼만큼 움직였는지 알 수 있음(세로)
- getBoundingClientRect().top : 보이는 뷰포트에서 content까지의 거리 -> 뷰포트의 좌표
- pageYOffset +getBoundingClientRect().top = 타겟 element와 bodyelement사이의 거리(문서의 거리)
문서의 기하학적 특성 3 : 스크롤 제어
- window.scrollTo(0, 1000); -> 문서의 스크롤을 page와의 offset 기준으로 1000만큼 이동.
문서의 기하학적 특성 4 : 스크린 크기
- 뷰포트 크기 : window.innerWidth, window.innerHeight
- 스크린 객체가 가진 크기(유저가 사용하는 모니터 크기) : screen.width, screen.height
JavaScript : 이벤트
- event target : event가 발생하는 대상 ex)button
- event type : event가 어떻게 발생하는 지 ex)클릭
- event handler : event가 발생했을 때 실행할 코드
JavaScript : 이벤트 등록 : 인라인 방식
- inline : 태그에 정해진 속성의 이름으로 값을 주는 방식으로 이벤트 설정. 태그 안에 속성이 직접적으로 들어감. this는 자기 자신을 의미함.
JavaScript : 프로퍼티 리스너 방식
- 이벤트 대상에 해당하는 객체의 프로퍼티로 이벤트 등록
- 이벤트 핸들러(함수)의 인자로 이벤트를 전달
- console.dir(event); - 인자로 들어온 event의 정보 획득 가능
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="button" id="target" value="button" />
<script type="text/javascript">
var t = document.getElementById('target');
t.onclick=function(event)
{
var event = event || window.event;
var target = event.target || event.srcElement;
console.log(event.target);
}
</script>
</body>
</html>
이벤트 등록 : addEventListener 방식
- addEventListener를 사용하는 이유 : 프로퍼티 방식으로 이벤트 등록하면 중복이 안되고 덮어서 1개만 실행됨. 이벤트 등록 과정이 여러번일 때 하나의 리스너를 이용해 복수 사용 가능.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="button" id="target" value="button" />
<script type="text/javascript">
var t = document.getElementById('target');
if(t.addEventListener)
{
t.addEventListener('click', function(event)
{
alert("hello world, "+event.target.value);
});
}
else if(t.attachEvent)
{
t.attachEvent('onclick', function(event)
{
alert('hello world, '+event.target.value);
})
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="button" id="target1" value="button" />
<input type="button" id="target2" value="button" />
<script type="text/javascript">
var t1 = document.getElementById('target1');
var t2 = document.getElementById('target2');
function btn_listener(event)
{
switch(event.target.id)
{
case 'target1':
alert(1);
break;
case 'target2':
alert(2);
break;
}
}
t1.addEventListener('click', btn_listener);
t2.addEventListener('click', btn_listener);
</script>
</body>
</html>
이벤트 전파 1 : 소개
- 버블링 : 가장 자식 event가 발생하고 부모 event가 마지막에 호출
- 캡처링 : 가장 부모의 event가 발생하고 가장 자식 event가 마지막에 호출
이벤트 전파 2 : Capturing
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html{border: 5px solid red; padding: 30px;}
body{border: 5px solid green; padding: 30px;}
fieldset{border: 5px solid blue; padding: 30px;}
input{border: 5px solid black; padding: 30px;}
</style>
</head>
<body>
<fieldset>
<legend>event propagation</legend>
<input type="button" id="target" value="target">
</fieldset>
<script type="text/javascript">
function handler(event)
{
var phases=['capturing', 'target','bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
}
document.getElementById('target').addEventListener('click', handler, true);
document.querySelector('fieldset').addEventListener('click', handler, true);
document.querySelector('body').addEventListener('click', handler, true);
document.querySelector('html').addEventListener('click', handler, true);
</script>
</body>
</html>
이벤트 전파 3 : Bubbling
- addEventListener의 3번째 인자 : capturing(true), bubbling(false 혹은 인자 사용 X)
- stopPropagation() : 이벤트 핸들러 끊어버림
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html{border: 5px solid red; padding: 30px;}
body{border: 5px solid green; padding: 30px;}
fieldset{border: 5px solid blue; padding: 30px;}
input{border: 5px solid black; padding: 30px;}
</style>
</head>
<body>
<fieldset>
<legend>event propagation</legend>
<input type="button" id="target" value="target">
</fieldset>
<script type="text/javascript">
function handler(event)
{
var phases=['capturing', 'target','bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
}
function stopHandler(event)
{
var phases=['capturing', 'target','bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
event.stopPropagation();
}
document.getElementById('target').addEventListener('click', handler, false);
document.querySelector('fieldset').addEventListener('click', handler, false);
document.querySelector('body').addEventListener('click', stopHandler, false);
document.querySelector('html').addEventListener('click', handler, false);
</script>
</body>
</html>
이벤트 기본 동작 취소
- web에서는.. 이벤트가 사용자가 직접 정의하여 사용 + 브라우저가 가진 이벤트와 이에 따른 동작
- 이벤트를 만든다는 것은 각각의 브라우저에 있는 구성 요소가 어떤 이벤트 발생 시 원하는 작업을 발생하게 하는 것. 끝난 후 브라우저가 갖고 있는 동작 방법이 최종적으로 실행됨.
- ie9 이하 버전에서는 preventDefault()가 아닌 event.returnValue를 false로 지정하면 됨.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>
<label>prevent event on</label><input id="prevent" type="checkbox" name="eventprevent" value="on" />
</p>
<p>
<a href="http://opentutorials.org" onclick="if(document.getElementById('prevent').checked) return false;">opentutorials</a>
</p>
<p>
<form action="http://opentutorials.org" onsubmit="if(document.getElementById('prevent').checked) return false;">
<input type="submit">
</form>
</p>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>
<label>prevent event on</label><input id="prevent" type="checkbox" name="eventprevent" value="on" />
</p>
<p>
<a href="http://opentutorials.org">opentutorials</a>
</p>
<p>
<form action="http://opentutorials.org">
<input type="submit">
</form>
</p>
<script type="text/javascript">
document.querySelector('a').onclick = function(event){
if(document.getElementById('prevent').checked)
return false;
};
document.querySelector('form').onclick = function(event){
if(document.getElementById('prevent').checked)
return false;
};
</script>
</body>
</html>
'Computer Science > Etc.' 카테고리의 다른 글
[Github] 깃허브에 폴더 전체 업로드하기 (0) | 2023.03.24 |
---|---|
웹 브라우저 JavaScript2 (0) | 2023.01.15 |
웹 브라우저 JavaScript (0) | 2023.01.15 |
LaTex에서 여러 형태의 글씨체 입력하기 (4) | 2022.05.18 |
LaTex에서 한글 논문 참고문헌(reference) 입력하기 (2) | 2022.05.10 |
댓글