1. Js008_BOM1_window.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>BOM - window </title>
</head>
<!--
BOM : Browser Object Model
(브라우저 객체 모델)
JavaScrpt 는 소위 BOM 이라 불리우는 '브라우저 객체 모델' 을 통해
'브라우저' 를 제어 합니다.
BOM 은 특별히 '표준' 이 정해져 있는 모델이 아닙니다.
그러나,
오늘날 대부분의 브라우저들이
'JavaScript' 를 통해 그리고 'BOM 의 object 들과 method' 들로 통해
제어되고 있으며 이들 브라우저들이 대체로 같은 이름의 object 와 method 들은 사용하다 보니
BOM 이 마치 '표준'처럼 여겨져 사용되고 있습니다.
(사실, 브라우저마다 조금씩 다르게 구현된 부분도 있습니다)
BOM 의 object 계층은 다음과 같습니다.
window
├─ document
├─ screen
├─ location
├─ history
└─ navigator
■ window 객체
BOM 의 최상위 객체.
모든 '전역(global)' 객체, 변수, 함수는 자동적으로 window 객체 멤버가 된다.
일반적으로 window객체가 '생략' 되며, 이 경우
자동적으로 window 객체 멤버입니다.
document 또한 window 객체 멤버임에 주목!
window.document.getElementById("header");
↕
document.getElementById("header");
-->
<!-- var 없이 변수 선언하면 전부 window 객체..!! -->
<script>
// 전역변수 x, window 소속
var x = 10;
function myFunc1() {
//document.getElementById("result1").innerHTML
// = "전역 x = " + x;
window.document.getElementById("result1").innerHTML
= "전역 x = " + window.x; //+ ", 전역 a = " + a;
}
function myFunc2() {
x = x + 3;
document.getElementById('result2').innerHTML = x;
}
function myFunc3() {
a = 40; // 함수 안에서 선언했다고 다 지역변수 아니다, var 사용하지 않으면 자동으로 전역변수다..!!
document.getElementById('result3').innerHTML = a;
}
function myFunc4() {
a += 20; // myFunc3에서 a를 선언해야 사용 가능
document.getElementById('result4').innerHTML = a;
}
// 함수 안에서 지역변수로 사용할 거라면 꼭!! var 사용하기..!!
</script>
<body>
<h2>window 객체</h2>
<br>
<button type="button" onclick="myFunc1();">전역 변수 x </button>
: <span id="result1"></span><br><br>
<button type="button" onclick="myFunc2();">전역 변수 x 3증가 </button>
: <span id="result2"></span><br><br>
<button type="button" onclick="myFunc3();">a = 40</button>
: <span id="result3"></span><br><br>
<button type="button" onclick="myFunc4();">a = a + 20 </button>
: <span id="result4"></span><br><br>
<hr>
<script>
//alert(), confirm(), prompt() 도 window 소속
function myFunc5() {
var answer = window.confirm('confirm() 도 window 소속');
document.getElementById('result5').innerHTML = answer;
}
function myFunc6() {
var name = window.prompt('너의 이름은?');
document.getElementById('result6').innerHTML = name;
}
</script>
<input type="button" onclick="window.alert('alert함수도 window 소속')" value='alert() 함수'/><br><br>
<input type="button" onclick="myFunc5()" value='confirm() 함수'/>
: <span id="result5"></span><br><br>
<input type="button" onclick="myFunc6()" value='prompt() 함수'/>
: <span id="result6"></span><br><br>
<hr>
<h4>open() 함수</h4>
<!--
팝업 창 띄움
요즘은 대부분의 브라우저가 팝업을 허용하지 않는 옵션이 켜져 있어서 특별한 경우 아니면 쓰진 않는것을 추천
-->
<script>
function myFunc7(){
// open(url, 새창이름, 새창옵션);
// 리턴값도 window 객체
myWindow = open('Js008_BOM1_pop.html', '팝업창', 'width=350, height=400, left=50, top=10')
}
</script>
<button type="button" onclick="myFunc7()">open()</button>
<br><br>
<button type="button" onclick="myWindow.close()">close()</button> <!-- 열린 창 닫기 -->
<br><br>
<hr>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
** Js008_BOM1_pop.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Popup </title>
</head>
<body>
~~~ 닫아보세요 ~~~<br><br>
<!-- Chrome 에서는 동작 안함 -->
<button type="button" onclick="TODO">닫기</button>
<p id="result8"></p>
</body>
</html>
2. Js008_BOM2_screen.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>BOM - screen</title>
</head>
<!--
window.screen object
(window) 는 생략 가능
'사용자 스크린 (모니터) 를 다루는 객체'
다음과 같은 property 값이 있다.
screen.width 스크린 크기
screen.height
screen.availWidth 사용 사용 가능한 영역 (OS 차지 영역 (ex:작업표시줄) 제외)
screen.availHeight
screen.colorDepth 색상 bit 수
screen.pixelDepth (최근 브라우저에선 colorDepth 와 pixelDepth 는 같다)
반면에 다음은 '브라우저'의 크기다
window.innerWidth 와 window.innerHeight 브라우저 안 내부 영역 <body> 영역
window.outerWidth 와 window.outerHeight 브라우저 창 전체 크기
// 실제로는 브라우저 호환 등의 문제로 다음과 같이 체크해야 한다 (IE8 이하..)
var w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;
-->
<script>
function showScreen(){
document.getElementById("demo").innerHTML =
"Screen width & height : " + screen.width + " x " + screen.height + "<br>" +
"availWidth & arailHeight : " + screen.availWidth + " x " + screen.availHeight + "<br>" +
"Screen Color Deptn : " + screen.colorDepth + "<br>" +
"Screen Pixel Depth: " + screen.pixelDepth + "<br>" +
"window.innerWidth x innerHeight: " + window.innerWidth + " x " + window.innerHeight + "<br>" +
"window.outerWidth x outerHeight: " + window.outerWidth + " x " + window.outerHeight + "<br>"
;
}
</script>
<!--
onload : 해당 element 의 로딩이 끝나면 호출
onresize : element 사이즈 변경될 때마다 호출
-->
<body onresize="showScreen()" onload="showScreen()">
<p id="demo"></p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
3. Js008_BOM3_location.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>BOM - location</title>
</head>
<!--
window.location object
브라우저의 현재 URL 정보를 다루거나,
다른 페이지로 이동할때 사용함 ( 새로운 request 발생 ! )
location.href : 현 페이지의 href (URL) 값 리턴함.★★★
location.hostname : 호스트 이름 ex) www.naver.com
location.pathname : 현 페이지의 경로 (프로토콜 제외)
location.protocol : 웹 프로토콜 리턴 (http: or https:)
location.port : 포트번호 (80 http, 443 https 인 경우, 브라우저에서 안보여주거나 0 을 표시)
location.assign : 새 웹문서 로딩
location.search : 쿼리문자열
location.reload() : 새로고침
-->
<body>
<h3>location</h3>
<script>
//TODO // 현재시각: reload() 확인용
</script>
<!-- location.assign()보다 location.href를 많이 사용함,
[주의!!] 인터넷 익스플로어에서는 location.href를 함수처럼 사용하나
인터넷 익스플로어 이외에는 함수처럼 사용하지 않기 때문에 동작되지 않는다..!! -->
<p id="demo"></p>
<button type="button" onclick="location.assign('https://www.naver.com')">assign()</button>
<br><br>
<button type="button" onclick="location.href='https://www.daum.net'"> location.href = </button>
<br><br>
<button type="button" onclick="location.reload()"> reload() </button>
<br>
<script>
document.getElementById("demo").innerHTML =
"현재 페이지 URL : <br>" + location.href + "<br>" +
"호스트 이름 : <br>" + location.hostname + "<br>" +
"현 페이지 경로 : <br>" + location.pathname + "<br>" +
"프로토콜 : <br>" + location.protocol + "<br>" +
"포트번호 : <br> " + location.port + "<br>" +
"쿼리문자열 : <br> " + location.search + "<br>"
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
4. VSC workspace 설정 해지
: 단축키 Ctrl + Shift + P > remove 검색 > Workspaces: Remove Folder from Workspace... 클릭
> Select workspace folder를 현재 작업페이지로 선택
> File > Open Recent > Clear Recently Opened
5. Js008_BOM4_history1.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>history 1</title>
</head>
<!--
※ 본 예제는 history1 ~ history3 3개의 html 파일 필요, title 과 h1 주목.
'브라우저가 기억하고 있는' 이전/이후 페이지로 이동 (★새로 request를 발생하는 것이 아니다★)
history.back() 이전 페이지 이동
history.forward() 이후 페이지 이동
history.go(숫자) 이동 숫자, -2 를 입력하면 2단계 이전 방문
history.length 방문기록에 저장된 목록의 개수를 반환
history object 로 이동시는 새로운 request 를 발생시키는 것이 아니라
브라우저가 기억하는 사이트를 표시하는 것이기 때문에
form 에 직전에 입력한 것까지도 그대로 복원된다. (password, file 등은 브라우저 별로 예외)
-->
<body>
<h2>history 1</h2>
<script>
document.write(new Date() + "<br>"); // 시간 확인, 새로고침 여부 확인용
document.write("history.length : " + history.length + "<hr>");
</script>
이름: <input type="text"/><br><br>
<input type="button" value="history 2" onclick="location.href = 'Js008_BOM4_history2.html'"/>
<input type="button" value="history 3" onclick="location.href = 'Js008_BOM4_history3.html'"/>
<br>
<hr>
<input type="button" value="back()" onclick="history.back()">
<input type="button" value="forward()" onclick="history.forward()">
<input type="button" value="go(-1)" onclick="history.go(-1)">
<input type="button" value="go(-2)" onclick="history.go(-2)">
<input type="button" value="go(1)" onclick="history.go(1)">
<input type="button" value="go(2)" onclick="history.go(2)">
<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
** Js008_BOM4_history2.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>history 2</title>
</head>
<!--
브라우저가 기억하고 있는 이전/이후 페이지 이동
history.back() 이번 페이지 이동
history.forward() 이후 페이지 이동
-->
<body>
<h2>history 2</h2>
<script>
document.write(new Date() + "<br>"); // 시간 확인, 새로고침 여부 확인용
document.write("history.length : " + history.length + "<hr>");
</script>
별명: <input type="text"/><br><br>
<input type="button" value="history 1" onclick="location.href = 'Js008_BOM4_history1.html'"/>
<input type="button" value="history 3" onclick="location.href = 'Js008_BOM4_history3.html'"/>
<br>
<hr>
<input type="button" value="back()" onclick="history.back()">
<input type="button" value="forward()" onclick="history.forward()">
<input type="button" value="go(-1)" onclick="history.go(-1)">
<input type="button" value="go(-2)" onclick="history.go(-2)">
<input type="button" value="go(1)" onclick="history.go(1)">
<input type="button" value="go(2)" onclick="history.go(2)">
<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
** Js008_BOM4_history3.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>history 3</title>
</head>
<!--
브라우저가 기억하고 있는 이전/이후 페이지 이동
history.back() 이번 페이지 이동
history.forward() 이후 페이지 이동
-->
<body>
<h2>history 3</h2>
<script>
document.write(new Date() + "<br>"); // 시간 확인, 새로고침 여부 확인용
document.write("history.length : " + history.length + "<hr>");
</script>
별명: <input type="text"/><br><br>
<input type="button" value="history 1" onclick="location.href = 'Js008_BOM4_history1.html'"/>
<input type="button" value="history 2" onclick="location.href = 'Js008_BOM4_history2.html'"/>
<br>
<hr>
<input type="button" value="back()" onclick="history.back()">
<input type="button" value="forward()" onclick="history.forward()">
<input type="button" value="go(-1)" onclick="history.go(-1)">
<input type="button" value="go(-2)" onclick="history.go(-2)">
<input type="button" value="go(1)" onclick="history.go(1)">
<input type="button" value="go(2)" onclick="history.go(2)">
<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
6. Js009_DOM1_get.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8"/>
<title>DOM:get함수들</title>
</head>
<!--
■ DOM (Document Object Model)
HTML 페이지가 로드 되면
브라우저는 이 HTML 페이지를 다루기위한
DOM 을 생성합니다.
■ DOM 은 'W3C 표준' 입니다.
- 이는 모든 언어에 오픈된 규약입니다.
즉, JavaScript 외에 다른 언어로도
DOM 표준을 따르는 HTML문서를 다룰수 있다.
- 'W3C DOM 표준'은 크게 3파트로 구성
1. Core DOM
2. XML DOM
3. HTML DOM
■ HTML DOM 표준의 목적은!
HTML element를 다루기 위한
표준방법을 제시하는 겁니다.
■ JavaScript 는 DOM 구조의 HTML페이지를
다루기 위한 언어입니다.
- JS는 DOM 안의 모든 element를 변경할수 있다.
- JS는 DOM 안의 모든 attribute를 변경할수 있다.
- JS는 DOM 안의 모든 CSS 를 변경할수 있다.
- JS는 DOM 안의 element 나 attribute를 삭제할수 있다.
- JS는 DOM 안에 element 나 attribute를 추가할수 있다
- JS는 DOM 안의 event를 다룰수 있다.
- JS는 DOM 안에 event를 추가할수 있다.
■ JavaScript 는
window.document 객체를 통해 DOM 구조 다룹니다
-->
<body>
<!-- getElementById(아이디) : 해당 '아이디' 값을 가진 element 한개 리턴 (여러개 있으면 첫번째만 리턴) -->
<h2>getElementById(아이디)</h2>
<p id="demo1">첫번째 demo 입니다</p>
<p id="demo1">두번째 demo 입니다</p>
<p id="demo3">세번째 demo 입니다</p>
<script>
// id 값이 중복되는 경우 첫번째 element 만 가져온다.
// id 값은 유니크한 값으로 원래는 중복된 값을 지정해서는 안됨..!!
// CSS 세상에서는 중복되더라도 원래 안되지만 모두 검색되나
// JS 세상에서는 짤없이 첫번째 element 만 가져온다.
document.write('결과' + document.getElementById('demo1').innerHTML);
</script>
<hr>
<!-- getElementsByTagName(태그) : '태그' 의 'element들' 을 배열로 리턴 -->
<h2>getElementsByTagName(태그)</h2>
<div>div 입니다</div>
<div>div 입니다</div>
<div>div 입니다</div>
<script>
// div element들을 찾아서 차례대로 "div1 입니다" "div2 입니다".. 로 내용 바꾸기
var elements = document.getElementsByTagName("div");
for(i = 0; i < elements.length; i++) {
var element = elements[i];
element.innerHTML = "div" + i + "입니다!";
}
// 해당 스크립트가 실행될때 아래의 코드가 로딩이 되지 않은 상태였기 때문에
// 아래의 div에는 적용되지 않음...!!
</script>
<hr>
<!-- getElementsByClassName(클래스) : '클래스' 의 'element들' 을 배열로 리턴 -->
<h2>getElementsByClassName(클래스)</h2>
<div class="c1 c2 c3">c1 c2 c3</div>
<div class="c3">c3</div>
<div class="c2 c3 c4">c2 c3 c4</div>
<div class="c4 c5 c6">c4 c5 c6</div>
<script>
// c3 class 를 갖고 있는 element 의
// 배경색을 노랑색으로 바꾸세요
// getElementsByClassName("c3")
// element.style.background
var elements = document.getElementsByClassName("c3");
for(i = 0; i < elements.length; i++) {
var element = elements[i];
element.style.backgroundColor = "yellow";
}
</script>
<hr>
<!-- getElementsByName(name) : 'name' 의 'form element들' 을 배열로 리턴 -->
<h2>getElementsByName(name)</h2>
<form>
name1: <input type="text" value="name1" name="name1"/><br>
name1: <input type="text" value="name1" name="name1"/><br>
name2: <input type="text" value="name2" name="name2"/><br>
</form>
<script>
// name=name1 인 element들을 찾아서
// 배경색을 노란색으로 하고 입력사이즈를 50으로 변경해보기
var elements = document.getElementsByName('name1');
for(i = 0; i < elements.length; i++) {
var element = elements[i];
// 배경색을 노란색
element.style.backgroundColor = "yellow";
// 입력사이즈를 50..!!
element.style.size = 50;
// value 가 없는 attribute 의 경우
// true, false로 설정해주거나
element.disabled = true;
// 아래와 같이 설정해주면 된다
element.value = "getElementsByName";
}
</script>
<hr>
<!-- querySelectorAll(selector) : 'CSS selector' 의 'element들' 을 배열로 리턴 -->
<h2>querySelectorAll(selector)</h2>
<p class="intro">class intro</p>
<p class="intro">class intro</p>
<p class="retro">class retro</p>
<script>
// p.intro selector 에 해당하는 element 들을 찾아서 배경색 하늘색으로
var elements = document.querySelectorAll("p.intro");
for(i = 0; i < elements.length; i++) {
var element = elements[i];
element.style.backgroundColor = "cyan";
}
</script>
<!--
HTML DOM 구조에서 object collection 사용 가능
document.anchors
document.body
document.documentElement
document.embeds
document.forms
document.head
document.images
document.links
document.scripts
document.title
-->
<hr>
<!-- document.forms : document 의 모든 <form> element 들 -->
<h2>document.forms</h2>
<form name="frm1">
<input value="폼 1_1" name="input1_1"/>
<input value="폼 1_2" name="input1_2"/>
</form>
<form name="frm2">
<input value="폼 2_1" name="input2_1"/>
<input value="롬 2_2" name="input2_2"/>
<input value="롬 2_3" name="input2_3"/>
</form>
<form name="frm3">
<input value="폼 3_1" name="input3_1"/>
<input value="폼 3_2" name="input3_2"/>
<input value="폼 3_3" name="input3_3"/>
<input value="폼 3_4" name="input3_4"/>
</form>
<p id="frm_result1"></p>
<p id="frm_result2"></p>
<script>
// form 들을 다 뒤져서 form element 들의 value 들을
var frm1 = document.forms['frm1'];
var result = "";
for(i = 0; i < frm1.length; i++) { // 여기서 form.length 는 그 안의 form element 들의 개수
result += frm1.elements[i].value + " "; // form 요소의 elements 배열
}
document.getElementById('frm_result1').innerHTML = result;
document.getElementById('frm_result2').innerHTML =
//document.forms['frm2']['input2_2'].value;
document.forms.frm2.input2_2.value;
</script>
<hr>
<!-- document.images : document 의 모든 <img> element 들 -->
<h2>document.images</h2>
<img src="https://www.w3schools.com/js/pic_htmltree.gif">
<img src="https://www.w3schools.com/js/pic_navigate.gif">
<p id="demo4"></p>
<script>
// 모든 이미지들의 테두리를 4px solid blu 로 만들기
var elements = document.images; // <img> element 들
for(i = 0; i < elements.length; i++) {
var element = elements[i];
element.style.border = "4px solid blue";
}
document.getElementById('demo4').innerHTML = elements.length + " 개의 이미지";
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
7. Js009_DOM2_event1.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM eventListener</title>
</head>
<style>
div#demo {
width:200px;
height:200px;
background-color: yellow;
text-align: center;
}
</style>
<body>
<!--
event : ~~할때
event listener : 위 event 때에 동작하는 함수
특정 element 에 event listener 를 추가 하는 방법
element.addEventListener("이벤트", 함수)
element.on이벤트 = 함수
특정 element 에 event listener 를 삭제 하는 방법
element.removeEventListener("이벤트", 함수)
element.on이벤트 = undefined
Listener 로 동작하는 함수는 이벤트 발생때마다 동작(호출)되는데
이때 발생된 이벤트 정보가 담긴 event 객체를 매개변수로 받을수 있다.
event.type : 이벤트 타입
event.target : 이벤트가 발생한 객체
DOM 모든 이벤트
https://www.w3schools.com/jsref/dom_obj_event.asp
DOM event 객체
https://www.w3schools.com/jsref/obj_event.asp
-->
<div id="demo">이벤트 없어요</div><br>
<button id="add_event">이벤트 추가</button>
<button id="remove_event">이벤트 삭제</button>
<p id="event"></p>
<script>
var demoBox = document.getElementById("demo");
var addButton = document.getElementById("add_event");
var removeButton = document.getElementById("remove_event");
function clickHandler(event) {
document.getElementById('event').innerHTML = event.type + ' ' + event.target;
var bgcolor = demoBox.style.background;
if(bgcolor != 'greenyellow') {
demoBox.style.background = 'greenyellow'
} else {
demoBox.style.background = 'yellow'
}
}
function mouseOverHandler(event) {
document.getElementById('event').innerHTML = event.type + " " + event.target;
demoBox.style.outline = "3px solid red";
}
addButton.addEventListener("click", function() {
demoBox.addEventListener("click", clickHandler); // 이벤트 등록
demoBox.innerHTML = "클릭해보세요";
// onXXX() attribute 사용하여 이벤트 등록
demoBox.onmouseover = mouseOverHandler;
demoBox.onmouseout = function(event) {
demoBox.style.outline = ""
}
})
removeButton.addEventListener('click', function() {
demoBox.removeEventListener('click', clickHandler); // 이벤트 해제
demoBox.innerHTML = "이벤트 없어요"
// onXXX() attribute 사용하여 이벤트 해제
demoBox.onmouseover = undefined; // 이벤트 삭제
demoBox.onmouseout = undefined;
})
</script>
<!-- Window object 에 event handler 추가 -->
<p id="windowSize"></p>
<script>
/*
// resize 는 onresize 임
// 화면을 줄이면 그때 화면에 값 출력..!!
// 첫 번째 방법
window.addEventListener("resize", function() {
document.getElementById('windowSize').innerHTML
= window.innerWidth + " x " + window.innerHeight;
})
*/
// 화면을 줄이면 그때 화면에 값 출력..!!
// 두 번째 방법
window.onresize = function() {
document.getElementById('windowSize').innerHTML
= window.innerWidth + " x " + window.innerHeight;
}
// 페이지 '전체' 로딩 완료 후
// 페이지 로딩 되자마자 화면에 값 출력
window.onload = function() {
document.getElementById('windowSize').innerHTML
= window.innerWidth + " x " + window.innerHeight;
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
8. Js009_DOM2_event2.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM bubble/capture</title>
</head>
<style>
ul, li {padding: 5px;margin: 3px;}
ul{background-color: pink;}
li{background-color: cyan;}
</style>
<!--
element.addEventListener("이벤트", 함수, useCapture)
https://javascript.info/bubbling-and-capturing
window.event 객세 사용
event.stopPropagation();
-->
<body>
<ul>
<li onclick="show(this)">Coffee</li>
<li onclick="show(this)">Tea
<ul>
<li onclick="event.stopPropagation(); show(this)">Black tea</li>
<li onclick="show(this)">Green tea</li>
</ul>
</li>
<li>Milk</li>
</ul>
<script>
function show(e) {
// text 만 보이기
alert(e.childNodes[0].nodeValue);
}
</script>
<br>
<ul id="ad">
<li>커피</li>
<li>차
<ul>
<li>홍차</li>
<li>녹차</li>
</ul>
</li>
<li>우유</li>
</ul>
<script>
// 위 <li> 클릭하면 show(this) 가 작동되도록 이벤트
var li = document.querySelectorAll("ul#ad li");
for(i=0; i < li.length; i++) {
//li[i].addEventListener("click", function() {show(this);}); // bubbling 방식
li[i].addEventListener("click", function() {show(this);}, true); // capturing 방식
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
9. Js009_DOM3_node.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM Navigation</title>
</head>
<!--
DOM 에서 node
node type (종류) 와 nodeType 값
Element node 1 <h1 class="heading">W3Schools</h1>
Attribute node 2 class = "heading" (deprecated)
Text node 3 W3Schools
Comment node 8
Document node 9 HTML 문서 자신, <html> 의 부모
DOCUMENT_TYPE_NODE 10 <!Doctype html>
** 명심! Element node 가 text 를 갖고 있는 것이 아니다!!!
JS 로 DOM 의 node 간 navigate 할수 있다.
- parentNode
- childNodes[nodenumber]
- firstChild
- lastChild
- nextSibling
- previousSibling
- attributes
-->
<body>
<h2>childNodes, nodeValue</h2>
<!-- childNodes 와 nodeValue -->
<h3 id="id01">My First Page</h3>
<p id="id02"></p>
<script>
document.getElementById('id02').innerHTML
//= document.getElementById('id01').innerHTML
//= document.getElementById('id01').firstChild.nodeValue;
= document.getElementById('id01').childNodes[0].nodeValue
;
// nodeValue 는
// - Element node 의 nodeValue 는 undefined
// - Text node 의 nodeValue 는 text값
// - Attribute node 의 nodeValue 는 attribute value
</script>
<br><hr>
<h2>document.body</h2>
<p onclick="alert(document.body.innerHTML)">클랙하면 body 의 컨텐츠가!</p>
<br><hr>
<h2>document.documentElement</h2>
<p onclick="alert(document.documentElement.innerHTML)">클릭하면 document 의 컨텐츠가!</p>
<br><hr>
<h2>nodeType</h2>
<p id="id03"></p>
<script>
document.getElementById('id03').innerHTML
= document.getElementById('id01').nodeType; // 1: element node
</script>
<!-- document.body 노드 밑의
모든 child 노드의 nodeValue, nodeType 을 출력해보세요
hint) document.body.childNodes 사용
-->
<br><hr>
<h2>childNodes, nodeName, nodeType, nodeValue</h2>
<!-- body elment node 의 child 들의 nodeName, nodeType, nodeValue -->
<p id="id04"></p>
<script>
var c = document.body.childNodes;
var txt = "";
for(i = 0; i < c.length; i++) {
txt += c[i].nodeName + " | "
+ c[i].nodeType + " | "
+ c[i].nodeValue
+ "<br>";
}
document.getElementById('id04').innerHTML = txt;
</script>
<br><hr>
<h2>attributes</h2>
<!-- 특정 element.attributes : attribute node 만 추출한다 -->
<img id="img01"
src="https://www.w3schools.com/html/img_girl.jpg"
alt="girl"
width="150"
height="200"/>
<p id="id05"></p>
<script>
var c = document.getElementById('img01').attributes;
var txt = "";
for(i = 0; i < c.length; i++) {
txt += c[i].nodeName + " | "
+ c[i].nodeType + " | "
+ c[i].nodeValue + " | "
+ "<br>";
}
document.getElementById('id05').innerHTML = txt;
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
10. Js009_DOM4_ element.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM - Node</title>
<style>
div { padding: 3px; }
p { background-color: cyan;}
table, th, td{
border: 1px solid black;
border-collapse: collapse;
padding: 5px;
}
td{
background-color: orange;
}
span, input{
display:inline-block;
width:200px;
}
</style>
</head>
<!--
node 를 생성할수 있다.!
생성된 노드를 원하는 node 에 붙일수 있다.!
document.createElement()
document.createTextNode()
E.appendChild(A) :
A를 E의 마지막 child 로 append 된다.
E.insertBefore(A, B) :
E 의 child 중에 B 앞에 A를 child 로 insert 한다.
E.removeChild(A) :
E 의 child 중에 A 를 제거한다.
-->
<!--
attribute 를 세팅할수도 있다
E.setAttribute("attribute 이름", "attribute 값");
attribute 를 제거
E.removeAttribute("attribute 이름");
attribute 값 리턴
E.getAttribute("attribute 이름");
attribute 를 갖고 있는지 여부, true/false 리턴
E.hasAttribute("attribute 이름");
-->
<body>
<div id="div1" style="background-color: yellow">
div1입니다
<p id="p1">p1 입니다</p>
<p id="p2">p2 입니다</p>
</div>
<script>
var para;
var node;
var parent, child;
var element = document.getElementById("div1");
// 단계별로 확인해보자
// appendChild()
para = document.createElement("p"); // <p> element 생성
node = document.createTextNode("appendChild()로 추가"); // #text 노드 생성
para.appendChild(node);
element.appendChild(para); // div1 의 마지막 child 로 append 됨
// insertBefore()
para = document.createElement("p"); // <p> element 생성
node = document.createTextNode("insertBefore()로 추가"); // #text 노드 생성
para.appendChild(node);
child = document.getElementById('p1');
element.insertBefore(para, child)
// removeChild()
parent = document.getElementById('div1');
child = document.getElementById('p2');
parent.removeChild(child);
</script>
<div>
<table id="table1">
<tr>
<th>이름</th>
<th>아이디</th>
</tr>
<tr>
<td><!-- this 는 그 element다 -->
<span onclick="doChange(this)">
홍길동
</span>
</td>
<td>
<span onclick="doChange(this)">
Mr.Hong
</span>
</td>
</tr>
</table>
</div>
<script>
//document.getElementById('table1').style.border = "4px solid red";
//document.getElementById('table1').setAttribute('style', 'border: 4px solid red');
document.getElementById('table1').style.setProperty('border', '4px solid red')
</script>
<script>
function doChange(e) {
var nodeName = e.nodeName.toUpperCase();
var parent = e.parentNode;
if(nodeName == "SPAN") {
// e 가 <span> 이었으면 <input> 으로 바꾸기
var txt = e.innerHTML.trim();
parent.removeChild(e);
var node = document.createElement("input");
node.value = txt;
// 두가지 케이스(포커스가 이동할때, 엔터를 입력할때) 일 때는 다시 <span>으로 변경 되어야 함
node.setAttribute('onfocusout', 'doChange(this)'); // 포커스 이동
node.setAttribute('onkeydown', 'doEnter(this)'); // 엔터 입력
parent.appendChild(node);
node.focus();
} else if (nodeName == "INPUT") {
// e 가 <input> 이었으면 <span>으 로 바꾸기
// 두가지 케이스(포커스가 이동할때, 엔터를 입력할때) 일 때는 다시 <span>으로 변경 되어야 함
var txt = e.value.trim();
parent.removeChild(e);
var node = document.createElement("span");
var txtNode = document.createTextNode(txt);
node.appendChild(txtNode);
node.setAttribute('onclick', 'doChange(this)');
parent.appendChild(node);
}
}
function doEnter(e) {
if(event.keyCode == 13) { // Enter 키 코드 값 13
doChange(e);
}
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
[주의!] F12 개발자 모드는 소스 보는 곳이 아님, DOM을 보는 곳임!!
11. 동기(Synchronous) 방식
: request 하면 client 는 response 를 받을때까지 다음(다른)작업 진행 못함,
브라우저에선 request 가 발생하면 기존의 페이지를 없애고 response 받은 뒤에야 페이지를
다시 그려주는 ‘페이지 reloading’ 이 발생
예) 주문한 후에 커피가 나올때까지 순서대로 기다리는 방식
12. 비동기(Asynchronous) 방식
: 비동기로 request 해도, 바로 다음(다른) 작업 진행 가능,
‘페이지 reloading’ 이 발생없이 작동 가능,
response 되는 순서는 꼭 request 되는 순서와 일치 하지 않을수 있다,
클라이언트 입장에선 비동기로 request 한거에 대한 response 가 언제 도착할지 모르기 때문에
response 도착시 이벤트 처리를 통해 처리해야 한다.
예) 주문한 후에 진동벨이 울리면 커피를 가지로 오는 방식
13. AJAX(Asynchronous Javascript And XML)
: 브라우저(클라이언트)에서 페이지 리로딩 과정 없이 서버와 백그라운드에서 비동기 방식으로
request-response 가능하게 하는 기술(주의! 언어가 아니라 기술임..!!)
14. AJAX 를 구현하기
Client -------- 1) 백그라운드로 request할 URL 설계 ---------------> Server
Client -------- 2) 어떻게 request 할지 설계 ------------------------> Server
Client <------ 3) 그 URL로 서버에 무슨 동작을 할 것인가 설계 ----- Server
Client <------ 4) 동작 후에 어떤 결과를 response할 것인지 설계 --- Server
Client -------- 5) response 받아서 어떻게 처리할지 설계 ------------ Server
15. AJAX reuqest는 데이터를 response 받는 용도로 주로 XML, JSON에서 많이 다루나
포맷과 무관하게 모든 데이터들이 전부 response 가능하다.
16. Js010_amin.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM Animation</title>
<style>
#container {
width: 400px;
height: 400px;
position: relative;
background: yellow;
}
#animate {
width: 50px;
height: 50px;
position: absolute;
background-color: red;
}
</style>
</head>
<!--
window 객체에 다음의 함수들이 있다.
setInterval(함수, 시간간격)
: '시간간격' 으로 함수 수행 , ms 단위
: 리턴값은 '애니메이션id' 객체 리턴
clearInterval('애니메이션id')
: ''애니메이션id' 의 애니메이션 종료
-->
<body>
<button onclick="clock();">시간</button>
<br><br>
<p id="timeboard"></p>
<script>
var clockAnimId = undefined;
function clock(){
if(!clockAnimId) {
// 애니메이션 시작
setInterval(tick, 1000);
} else {
// 애니메이션 종료
clearInterval(clockAnimId);
clockAnimId = undefined;
}
}
function tick() {
var d = new Date(); // 현재 시간
document.getElementById("timeboard").innerHTML
= d.getFullYear() + "/" +
+ (d.getMonth() + 1) + "/" // 월은 0 부터 시작
+ d.getDate() + " "
+ d.getHours() + ":"
+ d.getMinutes() + ":"
+ d.getSeconds();
}
</script>
<hr>
<button onclick="myMove()">Click Me</button>
<br><br>
<div id ="container">
<div id ="animate"></div>
</div>
<script>
function myMove() {
var elem = document.getElementById('animate');
var pos = 0;
var id = setInterval(frame, 5);
function frame() {
if(pos == 350) {
clearInterval(id);
} else {
pos++;
elem.style.top = pos + 'px';
elem.style.left = pos + 'px';
}
}
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
17. Js011_AJAX1.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX</title>
</head>
<!--
■ 동기화 (Synchronous) 방식
request - response 관계
■ AJAX
1. Asynchronous JavaScript And XML.
: 자바스크립트르 활용한 비동기 프로그래밍
: 꼭 XML만 다루지는 않음.. 텍스트, JSON 등 다룰수 있슴
(결국 AJAX 는 근시안적 작명의 오류)
2. AJAX는 프로그래밍 언어가 아니다!
3. XMLHttpRequest object 를 사용하여 서버에 request를 보내고
DOM 을 사용하여 화면에 업데이트 한다.
4. 일본어로: アジャックス
■ AJAX 장점!
1. 페이지 로딩 후에도, 서버로부터 데이터 끌고 올수 있다.
2. 페이지 리로딩 없이, 서버로부터 데이터 끌고 와서 페이지 업데이트 가능
→ 페이지 변경시 필요한 네트웍 트래픽(시간, 대역폭) 절약
3. 서버에 데이터 전송이 서버 조작이 가능하다 (백그라운드로!)
■ AJAX 사용예
1. 아이디 중복 체크
2. 포탈 검색어 입력시 suggestion.
3. 실시간 정보 업데이트 : 실검, 날씨, 뉴스, 주식 정보등..
4. 스크롤 페이징
5. 각종 API
6. SPA (Single Page Web : 단일페이지 웹) 구현
■ AJAX 작동절차
1. 웹페이지 이벤트 발생 (클릭, 입력, 등...)
2. XMLHttpRequest object 생성
3. XMLHttpRequest object 가 서버에 request 한다.
4. 서버가 request 처리
5. 서버가 response 를 웹페이지에 보낸다
6. 웹페이지에서 response 를 읽는다.
7. 읽은 내용으로 화면을 업데이트 한다
-->
<!--
※ 크롬의 경우 타 소스로의 AJAX 요청을 원천적으로 차단합니다.
same-origin policy 정책
-->
<body>
<div id="demo">
<h2>AJAX XMLHttpRequest</h2>
<button type="button" onclick="loadDoc()">Change Content</button>
</div>
<script>
var url = "https://www.w3schools.com/js/ajax_info.txt";
function loadDoc() {
var xhttp = new XMLHttpRequest(); // XHR
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
// 진동벨 울렸을때 수행할 동작들..!!
document.getElementById('demo').innerHTML
= this.responseText;
}
};
// open(method, url, async, user, psw) : request 에 대해 명시
// 커피주문
xhttp.open('GET', url, true);
// request 보내기..!
xhttp.send();
}
</script>
<!--
XMLHttpRequest object 의 메소드들
open(method, url, async, user, psw) : request 에 대해 명시
- method: GET or POST
- url
- async: true (asynchronous) or false (synchronous)
- user: optional user name
- psw: optional password
send() : GET 방식으로 서버에 request 보냄
send(string) : POST 방식으로 서버에 request 보냄
setRequestHeader() :
-->
<!--
XMLHttpRequest object 의 property 들.
1. onreadystatechange : 함수설정. readyState 값이 바뀔때마다 호출됨.
2. readyState : XMLHttpRequest 상태(state) 값 저장
[값] : [의미]
0 : request 준비 안됨 (초기화 안됨)
1 : 서버 연결됨
2 : request 수신됨.
3 : request 처리중
4 : request 끝나고, response 준비됨.
3. responseText : response 데이터를 문자열로.
3. responseXML : response 데이터를 XML로.
4. status : request 상태값
[값] : [의미]
200 : OK
403 : Forbidden
404 : Not Found
500 : Internal Server Error
참조 : https://www.w3schools.com/tags/ref_httpmessages.asp
5. statusText : 상태정보 텍스트 : (ex: 'OK' , 'Not Found');
-->
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
18. Js011_AJAX2.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX - XML</title>
<style>
table,th,td {
border : 1px solid black;
border-collapse: collapse;
}
th,td {
padding: 5px;
}
</style>
</head>
<script>
// 샘플 XML
var xml_1 = 'https://www.w3schools.com/js/cd_catalog.xml';
var xml_2 = 'https://www.w3schools.com/js/note.xml';
</script>
<body>
<h2>AJAX + XML 데이터 1</h2>
<button type="button" onclick="loadCdData()">내 CD 목록</button>
<button type="button" onclick="TODO">지우기</button>
<br><br>
<table id="demo"></table>
<script>
function loadCdData() {
var xhttp = new XMLHttpRequest;
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
myFunction(this.responseXML);
}
};
xhttp.open("GET", xml_1, true);
xhttp.send();
}
function myFunction(xmlDOM) {
var i;
var table = "<tr><th>Artist</th><th>Title</th></tr>";
var x = xmlDOM.getElementsByTagName("CD");
for(i = 0; i < x.length; i++) {
table += "<tr>";
table += "<td>" + x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue + "</td>";
table += "</tr>";
}
document.getElementById('demo').innerHTML = table;
}
</script>
<hr>
<h2>AJAX + XML 데이터 2</h2>
<p><b>Status:</b> <span id="A1"></span></p>
<p><b>Status text:</b> <span id="A2"></span></p>
<p><b>Response:</b> <span id="A3"></span></p>
<button onclick="loadNote(xml_2)">노트 데이터 가져오기</button>
<script>
function loadNote(url) {
// TODO
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
19. Js011_AJAX3.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX - JSON</title>
<style>
table,th,td {
border : 1px solid black;
border-collapse: collapse;
}
th,td {
padding: 5px;
}
</style>
</head>
<script>
// 샘플 JSON
var json_1 = 'https://www.w3schools.com/js/json_demo.txt';
</script>
<!--
JSON 문자열은
JSON.parse() 를 사용하면 JavaScript object 로 손쉽게 변환된다
-->
<body>
<h2>AJAX + JSON</h2>
<button type="button" onclick="loadPet()">애완동물 목록 보기</button>
<button type="button" onclick="clearTable()">지우기</button>
<br><br>
<table>
<tr>
<th>이름</th>
<td id="name"></td>
</tr>
<tr>
<th>나이</th>
<td id="age"></td>
</tr>
<tr>
<th>애완동물목록</th>
<td id="pets"></td>
</tr>
</table>
<script>
function loadPet(){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
var myObj = JSON.parse(this.responseText);
document.getElementById('name').innerHTML = myObj.name;
document.getElementById('age').innerHTML = myObj.age;
result = "";
for(i=0; i < myObj.pets.length; i++) {
result += myObj.pets[i].animal
+ " : " + myObj.pets[i].name + "<br>";
}
document.getElementById("pets").innerHTML = "<div>" + result + "</div>";
}
}
xhttp.open('GET', json_1, true);
xhttp.send();
}
function clearTable(){
document.getElementById('name').innerHTML = "";
document.getElementById('age').innerHTML = "";
document.getElementById('pets').innerHTML = "";
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
20. Js011_AJAX4.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX API서울시 지하철호선별 역별 승하차 인원 정보</title>
<style>
table,th,td {
border : 1px solid black;
border-collapse: collapse;
}
th,td {
padding: 5px;
}
</style>
</head>
<!--
■서울시 지하철호선별 역별 승하차 인원 정보
http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12914&srvType=A&serviceKind=1¤tPageNo=1
샘플url
XML 버젼
http://openapi.seoul.go.kr:8088/키값을넣으세요/xml/CardSubwayStatsNew/1/5/20181001
예) http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/xml/CardSubwayStatsNew/1/5/20181001
JSON 버젼
http://openapi.seoul.go.kr:8088/키값을넣으세요/json/CardSubwayStatsNew/1/5/20181001
예) http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/json/CardSubwayStatsNew/1/5/20181001
-->
<body>
<h1>서울시 지하철 승하차 인원 정보</h1>
<form>
날짜 (yyyyMMdd): <input type="text" name="date" id="date" value="20200505"/><br><br>
<button type="button" onclick="loadData()">승하차정보 가져오기</button>
<button type="button" onclick="removeTable()">지우기</button>
</form>
<br><br>
<h2>AJAX + XML</h2>
<table id="demoXML"></table>
<hr>
<h2>AJAX + JSON</h2>
<table id="demoJSON"></table>
<script>
var api_key = "704c4a6d7262696e33396a544e7551";
function removeTable(){
document.getElementById('demoXML').innerHTML = "";
document.getElementById('demoJSON').innerHTML = "";
}
function loadData() {
var date = document.getElementById('date').value.trim();
// xml
var url = "http://openapi.seoul.go.kr:8088/" + api_key + "/xml/CardSubwayStatsNew/1/5/" + date;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
parseXML(this.responseXML);
}
};
xhttp.open('GET', url, true);
xhttp.send();
// JSON
var url = "http://openapi.seoul.go.kr:8088/" + api_key +"/json/CardSubwayStatsNew/1/5/" + date;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var jsonObj = JSON.parse(this.responseText);
parseJSON(jsonObj);
}
};
xhttp.open("GET", url, true);
xhttp.send();
} // end loadData()
function parseXML(xmlDOM) {
var table = "<tr><th>호선</th><th>역명</th><th>승차인원</th><th>하차인원</th></tr>";
var row = xmlDOM.getElementsByTagName("row");
for(i = 0; i < row.length; i++){
table += "<tr>";
table += "<td>" + row[i].getElementsByTagName("LINE_NUM")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("SUB_STA_NM")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("RIDE_PASGR_NUM")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("ALIGHT_PASGR_NUM")[0].childNodes[0].nodeValue + "</td>";
table += "</tr>";
}
document.getElementById('demoXML').innerHTML = table;
}
function parseJSON(jsonObj){
var row = jsonObj.CardSubwayStatsNew.row;
var table = "<tr><th>호선</th><th>역명</th><th>승차인원</th><th>하차인원</th></tr>";
for(i = 0; i < row.length; i++){
table += "<tr>";
table += "<td>" + row[i].LINE_NUM + "</td>";
table += "<td>" + row[i].SUB_STA_NM + "</td>";
table += "<td>" + row[i].RIDE_PASGR_NUM + "</td>";
table += "<td>" + row[i].ALIGHT_PASGR_NUM + "</td>";
table += "</tr>";
}
document.getElementById("demoJSON").innerHTML = table;
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
21. Js011_AJAX5.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX API서울시 지하철역사정보</title>
<style>
table,th,td {
border : 1px solid black;
border-collapse: collapse;
}
th,td {
padding: 5px;
}
</style>
</head>
<!--
■서울시 지하철 역사 정보
http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12753&srvType=A&serviceKind=1¤tPageNo=1
샘플url
XML 버젼
http://swopenAPI.seoul.go.kr/api/subway/키값넣으세요/xml/stationInfo/0/5/서울
예] http://swopenAPI.seoul.go.kr/api/subway/4d46796d7366726f3833774a774955/xml/stationInfo/0/5/서울
JSON 버젼
http://swopenAPI.seoul.go.kr/api/subway/키값넣으세요/json/stationInfo/0/5/서울
예] http://swopenAPI.seoul.go.kr/api/subway/4d46796d7366726f3833774a774955/json/stationInfo/0/5/서울
-->
<body>
<h1>서울시 지하철 역사 정보</h1>
<form>
역명: <input type="text" id="stationname" value="서울"/><br><br>
<button type="button" onclick="loadData()">역사정보 가져오기</button>
<button type="button" onclick="removeTable()">지우기</button>
</form>
<br><br>
<h2>AJAX + XML</h2>
<table id="demoXML"></table>
<hr>
<h2>AJAX + JSON</h2>
<table id="demoJSON"></table>
<script>
var api_key = "704c4a6d7262696e33396a544e7551";
function removeTable(){
document.getElementById('demoXML').removeChild(document.getElementById('demoXML').childNodes[0]);
document.getElementById('demoJSON').removeChild(document.getElementById('demoJSON').childNodes[0]);
}
function loadData() {
// 장소를 인코딩 하기
var place = decodeURI(document.getElementById('stationname').value.trim());
// xml
var url = "http://swopenAPI.seoul.go.kr/api/subway/" + api_key + "/xml/stationInfo/0/5/" + place;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
parseXML(this.responseXML);
}
};
xhttp.open('GET', url, true);
xhttp.send();
// JSON
var url = "http://swopenAPI.seoul.go.kr/api/subway/" + api_key + "/json/stationInfo/0/5/" + place;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var jsonObj = JSON.parse(this.responseText);
parseJSON(jsonObj);
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function parseXML(xmlDOM) {
var table = "<tr><th>역명</th><th>아이디</th><th>호선</th><th>영문명</th></tr>";
var row = xmlDOM.getElementsByTagName("row");
for(i = 0; i < row.length; i++){
table += "<tr>";
table += "<td>" + row[i].getElementsByTagName("statnNm")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("subwayId")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("subwayNm")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("statnNmEng")[0].childNodes[0].nodeValue + "</td>";
table += "</tr>";
}
document.getElementById('demoXML').innerHTML = table;
}
function parseJSON(jsonText){
var stationList = jsonText.stationList;
var table = "<tr><th>역명</th><th>아이디</th><th>호선</th><th>영문명</th></tr>";
for(i = 0; i < stationList.length; i++) {
table += "<tr>";
table += "<td>" + stationList[i].subwayId+ "</td>";
table += "<td>" + stationList[i].subwayId + "</td>";
table += "<td>" + stationList[i].subwayNm + "</td>";
table += "<td>" + stationList[i].statnNmEng + "</td>";
table += "</tr>";
}
document.getElementById("demoJSON").innerHTML = table;
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
22. Js011_AJAX6.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>AJAX API자치구단위 서울 생활인구 일별 집계표</title>
<style>
table,th,td {
border : 1px solid black;
border-collapse: collapse;
}
th,td {
padding: 5px;
}
</style>
</head>
<!--
■자치구단위 서울 생활인구 일별 집계표
http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-15379&srvType=S&serviceKind=1¤tPageNo=1
http://openapi.seoul.go.kr:8088/(인증키)/(요청파일타입)/SPOP_DAILYSUM_JACHI/(요청시작INDEX)/(요청종료INDEX)/(기준일ID)/(시군구코드)
샘플url
XML 버젼
http://openapi.seoul.go.kr:8088/(인증키)/xml/SPOP_DAILYSUM_JACHI/1/5/
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/xml/SPOP_DAILYSUM_JACHI/1/5/
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/xml/SPOP_DAILYSUM_JACHI/1/5/20190101
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/xml/SPOP_DAILYSUM_JACHI/1/5/20190101/11000
JSON 버젼
http://openapi.seoul.go.kr:8088/(인증키)/json/SPOP_DAILYSUM_JACHI/1/5/
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/json/SPOP_DAILYSUM_JACHI/1/5/
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/json/SPOP_DAILYSUM_JACHI/1/5/20190101
예] http://openapi.seoul.go.kr:8088/4d46796d7366726f3833774a774955/json/SPOP_DAILYSUM_JACHI/1/5/20190101/11000
※ 한번에 1000개 까지의 데이터만 볼수 있슴
-->
<body>
<h1>자치구단위 서울 생활인구 일별 집계표</h1>
<form>
날짜: <input type="date" id="stdr_de_id" value="2019-01-01" placeholder="yyyy-mm-dd"/><br>
시작index <input type="number" id="start_index" value="1"/><br>
끝index <input type="number" id="end_index" value="5"/><br><br>
<button type="button" onclick="loadData()">정보 가져오기</button>
<button type="button" onclick="removeTable()">지우기</button>
</form>
<br><br>
<h2>AJAX + XML</h2>
<table id="demoXML"></table>
<hr>
<h2>AJAX + JSON</h2>
<table id="demoJSON"></table>
<script>
var api_key = "704c4a6d7262696e33396a544e7551"; // 자신의 키값 입력하기!
function removeTable(){
document.getElementById('demoXML').removeChild(document.getElementById('demoXML').childNodes[0]);
document.getElementById('demoJSON').removeChild(document.getElementById('demoJSON').childNodes[0]);
}
function loadData() {
var date = document.getElementById('stdr_de_id').value.replace(/-/g,"");
//replaceAll((date + ""), "-", "");
var start_index = document.getElementById('start_index').value.trim();;
var end_index = document.getElementById('end_index').value.trim();;
// XML 버젼
var url = "http://openapi.seoul.go.kr:8088/" + api_key + "/xml/SPOP_DAILYSUM_JACHI/" + start_index + "/" + end_index + "/" + date;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
parseXML(this.responseXML);
}
};
xhttp.open('GET', url, true);
xhttp.send();
// JSON
var url = "http://openapi.seoul.go.kr:8088/" + api_key + "/json/SPOP_DAILYSUM_JACHI/" + start_index + "/" + end_index + "/" + date;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var jsonObj = JSON.parse(this.responseText);
parseJSON(jsonObj);
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function parseXML(xmlDOM) {
var table = "<tr><th>날짜</th><th>구ID</th><th>총생활인구수</th><th>일최대이동인구수</th></tr>";
var row = xmlDOM.getElementsByTagName("row");
for(i = 0; i < row.length; i++){
table += "<tr>";
table += "<td>" + row[i].getElementsByTagName("STDR_DE_ID")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("SIGNGU_CODE_SE")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("TOT_LVPOP_CO")[0].childNodes[0].nodeValue + "</td>";
table += "<td>" + row[i].getElementsByTagName("DAIL_MXMM_LVPOP_CO")[0].childNodes[0].nodeValue + "</td>";
table += "</tr>";
}
document.getElementById('demoXML').innerHTML = table;
}
function parseJSON(jsonText){
var row = jsonText.SPOP_DAILYSUM_JACHI.row;
var table = "<tr><th>날짜</th><th>구ID</th><th>총생활인구수</th><th>일최대이동인구수</th></tr>";
for(i = 0; i < row.length; i++) {
table += "<tr>";
table += "<td>" + row[i].STDR_DE_ID+ "</td>";
table += "<td>" + row[i].SIGNGU_CODE_SE + "</td>";
table += "<td>" + row[i].DAY_LVPOP_CO + "</td>";
table += "<td>" + row[i].DAIL_MXMM_LVPOP_CO + "</td>";
table += "</tr>";
}
document.getElementById("demoJSON").innerHTML = table;
}
</script>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</body>
</html>
23. JSON(JavaScript Object Notation)
XML(Extensible Markup Language)
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
2020.05.13 (0) | 2020.05.13 |
---|---|
2020.05.12 (0) | 2020.05.12 |
2020.05.08 (0) | 2020.05.08 |
2020.05.07 (0) | 2020.05.07 |
2020.05.06 (0) | 2020.05.06 |