A browser built-inXMLHttpRequestobject (to request data from a web server)
JavaScript and HTML DOM (to display or use the data)
참고: AJAX는 실제로 항상 XML을 사용하여 데이터를 전송하는 것은 아니다. 이름이 그렇다 할 뿐이지 실제로는 plain txt 파일이나, JSON파일로 전송하는 경우들이 있다.
중요한 점은 AJAX는 비동기식(asynchronously)으로 웹서버와 데이터를 주고받을(Exchange of data) 수 있다는 점이 획기적인 기능이다. 이 기능을 통해서 웹 페이지를 새로고침을 하지 않고도 웹 페이지의 부분만을 새로고칠 수 있다.
AJAX작동 방식: 이 정도는 기본으로 숙지할것 (모든 내용이 순차적으로 일어남)
AJAX의 핵심은 바로 XMLHttpRequest object.인데요, 이 객체가 바로 서버와 데이터를 교환하는 역할을 수행합니다.
모든 최신 브라우저(Crome, Firefox, IE7+, Edge, Safari, Opera)에는 XMLHtpRequest 개체가 내장되어 있습니다.
생성법:
보안 문제로, 최신 브라우저들은 여러 도메인 간의 접근을 막고 있는데요, 그래서 웹페이지에서 접근하고자 하는 XML파일은 사용하고 있는 해당 브라우저 서버와 같은 위치에 있어야 합니다.
최신 브라우저는 XMLHttpRequest Object 대신 Fetch API를 사용할 수도 있습니다. Fetch API 인터페이스를 통해 웹 브라우저는 웹 서버에 HTTP 요청을 할 수 있는데, 대신 XMLHttpRequest Object를 사용하는 경우 Fetch를 더 간단한 방법으로 동일한 작업을 수행할 수 있습니다.
아래 두 이미지는 꼭 중요한 내용이니 숙지하시기 바랍니다.
(추가로, 아래 내용은 네트워크 수업을 들었으면 더 이해하시기 쉬울겁니다. HTTP 헤더 내용이 조금 들어가 있네요)
첫번째로 XHTTP객체가 생성되었으면, 이 객체로 XmlHttpRequest를 서버에게 보내게 됩니다. 이러기 위해선, XMLHttpRequest 객체의 open(), send() 함수를 사용하게 됩니다.
아래 사진에서 보시는 바와 같이, 맨 처음에 open()함수를 통해 서버에게 어떤 request를 보내는것인지 그것에 대한 정보를 전달하게 됩니다.
그리고 send()함수로 Get, Post 방식에 따라 적절하게 함수를 호출합니다.
*** open()에서 3번째 파라미터는 async를 정하는데 사용됩니다. 주로 async:true; 값을 사용하여 비동기식으로 진행합니다.
데이터 교환에 있어, GET 방식이 POST방식 보다 빠르지만, POST방식을 따를 것을 권장합니다.
다음과 같은 경우 항상 POST 요청을 사용해야합니다.:
캐시된 파일은 선택사항이 아닐때(즉, 서버의 파일 또는 데이터베이스를 꼭 업데이트해야할 때).
서버에 대량의 데이터를 보내야 할때. (POST방식에는 크기 제한이 없다.)
사용자 입력(알 수 없는 문자를 포함할 수 있음)을 전송할때 POST가 GET 보다 강력하고 안전한 방법이다. (데이터 유실을 막음)
AJAX를 이용하여 서버에게 request를 보낼 수 있고, 이에 대한 response를 받아서 원하는 작업을 수행할 수 있다.
JS Browser BOM은 JavaScript가 브라우저와 "대화"할 수 있도록 도와주는 브라우저 개체 모델(BOM)이다.
The Window Object
윈도우 객체는 document객체의 parent 노드로써, 현 윈도우 페이지를 나타낸다.
윈도우 사이즈, 윈도우 열기, 닫기 등을 한다.
Window Location
윈도우의 정보를 알아내는데 사용된다.
현재 페이지의 url, path 주소 정보,
Window History
현재 윈도우 히스토리를 트래킹하고 있어서 현재페이지에서 뒤로가기, 앞으로 가기 버튼을 만들수 있다.
(예를 들면 결제 페이지에서 "뒤로 가기" 버튼을 클릭해서 정보를 수정한다던지)
Popup Boxes
팝업 창을 활성화 시켜 작업을 수행할 수 있다.
근데 팝업창은 단발성으로 그렇게 많이 사용되지 않아서 패스~
JavaScript Timing Events
Timing Events: 이벤트를 단발성, 주기적으로 활성화하기 위해서 사용하는 기능이다.
window 객체는 일정 시간이 지난 뒤에 함수를 호출할 수 있도록 다음 메소드를 제공합니다. 1. setTimeout() --> 일정 시간 후 한번만 실행 2. setInterval() --> 주기적으로 일정 시간 후에 실행됨
또한, 이렇게 설정된 함수의 호출을 취소할 수 있도록 다음 메소드를 제공합니다. 3. clearTimeout() --> setTimeOut()이 실행되고, 일정 시간 후에 이벤트가 일어나기 전에 미리 취소하는 것 4. clearInterval() --> setInterval()이 실행되고, 일정 시간 후에 주기적으로 이벤트가 일어나기 전에 취소하는 것
기본적인 문법은 각각 아래와 같습니다: (window prefix 생략가능)
setTimeOut method:
window.setTimeout(호출할함수, 지연시간);
setInterval method:
window.setInterval(호출할함수, 지연시간);
함수 취소 방법 문법도 중요한데, timeoutID를 (timing함수 반환값을 저장하는 변수) clear 해줘야 한다!!
window.clearTimeout(timeoutID);
window.clearInterval(timeoutID);
아래는 주기적 함수 실행 함수인 setInterval()을 실행 중에 멈춰버리는 clearInterval()함수 예제입니다.
JavaScriptCookies
쿠키는 주로 사용자 정보를 일정 기간 동안 저장하여, 사용자가 웹에 접근할때 서버에서 미리 사용자 정보로 사용자를 위해 커스텀 정보를 주거나 할 때 사용된다. 쿠키를 통해 또한 서버의 작업을 줄여줄 수 있다.
document.getElementById("demo").innerHTML = 'The first paragraph (index 0) inside "main" is: ' + x[0].innerHTML;
3. (class방식)
var y = document.getElementsByClassName("intro");
document.getElementById("demo").innerHTML ='The first paragraph (index 0) inside "main" is: ' + y[0].innerHTML;
(중요!!)
원하는 특정 태그의 CSS속성을 가지는 element만 선별하기.
퀴즈!!:
정답은:
addEventListener , click
JS DOM HTML (내용, 속성, css스타일 바꾸기)
위에서 언급했듯이, DOM 성질을 활용하여 내용을 수정하기도, 속성을 바꾸기도 할 수 있다.
(내용 수정하기) document.getElementById(id).innerHTML = new HTML (속성 수정하기) document.getElementById(id).attribute = new value (css 스타일 수정하기)document.getElementById("p2").style.color="blue";document.getElementById("p2").style.color="blue";
var id = setInterval(frame,5); --> function frame() 을 5?? 단위 간격으로 돌리겠다는 뜻이 맞는지 모르겠는디...
clearInterval(id); --> 위에서 세팅한 주기 기간을 clear시킴....??
JavaScriptHTML DOM Navigation
모든 HTML요소는 노드로 표현될 수 있다. 때문에 노드를 추가하고 제거하는게 계층별로 이루어질 수 있다.
nodeName: 노드의 element 태그 이름을 알아낼 수 있고
(ex) <h1 id="id01">My First Page</h1> 에서 id="id01"은 nodeName= h1을 가진다.
큐 형태처럼 노드 앞에 새 노드 추가와 노드 뒤에 새 노드 추가가 가능하다 (insertBefore(), appendChild() respectively)
노드 제거:
노드 대체:
replaceChild();
JavaScript HTML DOM Collections
HTML 요소들을 묶음으로, 즉, collection으로 받아 올 수 있는데,
varx = document.getElementsByTagName("p"); --> p 태그를 가지는 요소들의 collection을 var x가 가지게 된다.
An HTMLCollection is NOT an array!
한가지 주의해야할 점은 HTML collection은 엄밀히 따지자면 배열이 아니다!! 각 인덱스를 조회하는 방법은 배열과 유사하나 배열이 가지는 기능인 valueOf(), pop(), push(), or join() 는 사용하지 못한다.
웹페이지 크기에 따라 유동적으로 화면 크기에 맞춰 HTML 과 CSS가 적용됨을 말합니다. 이를 통해 가독성을 유지할 수 있고, 다양한 기기의 화면 사이즈에 최적화된 사이즈로 웹페이지를 보여지게 할 수 있습니다. (주로 데스크탑 보다 작은 기기들이 원래는 웹페이지가 작게 보여서 발생하는 불편함을 해결하기 위해 만들어짐).
What is The Viewport?
viewport는 웹 페이지에서 사용자가 볼 수 있는 영역을 말합니다.
뷰포트는 장치에 따라 다르며, 휴대폰의 경우 컴퓨터 화면보다 크기가 더 작습니다.
HTML5는 웹 디자이너들이 <meta> 태그를 통해 viewport를 제어할 수 있는 방법을 도입했다.
모든 웹 페이지에 다음 보기 포트 요소를 포함해야 합니다.
<meta name ="viewport" content ="width = device-width, initial-scale =1.0"> 이렇게 하면 페이지의 크기 및 배율을 제어하는 방법에 대한 브라우저 지침을 제공합니다.
width(너비) = device-width(장치 너비) 부분은 (장치에 따라 다름) 장치의 화면 너비를 따르도록 페이지 너비를 설정합니다.
initial-scale=1.0 파트는 브라우저에 의해 페이지가 처음 로드될 때 초기 확대/축소 수준을 설정합니다.
What is a Grid-View?
gridview란 페이지를 여러 작은 column으로 나눌 수 있는데 이걸 토대로 페이지 layout을 만들 수 있습니다.
Building a Responsive Grid-View
responsive gridview를 만드는 간단한 방법 중 하나는 바로 box-sizing과 float 속성을 활용하는 방법입니다.
하지만, 실상에는 column이 2개 이상이 필요로 할 수 있어서, 세밀하게 웹 페이지를 만들기 위해서 12개의 column으로 나눕니다.
먼저 한 열에 대한 백분율을 계산해야 합니다. 즉, 100% / 12개 열에 대한 백분율이 ® 8.33%입니다.
그런 다음 12개 열 각각에 대해 클래스를 하나씩 만들고, 해당 섹션에 걸쳐야 하는 열 수를 정의하는 숫자를 만듭니다.
이렇게 아래와 같이 웹페이지 사이즈에 따라 적용될 class를 정의하고
(ex: 웹 페이지 사이즈가 50%일때는 .col-6 클래스가 적용이 되도록 할 수 있다)
아래 HTML 코드와 같이 특정 element가 웹 페이지 사이즈 변동에 따라 적용되고자 하는 class를 명시합니다.
ex) 웹 페이지가 75%일 때는 col-9 클래스가 적용이 됩니다.
이제 아래 부분이 정말 중요합니다.
저희는 모든 element들을 float:left로 설정했기 때문에, 본래의 웹 페이지 flow에 따르지 못하게 됩니다. 그래서 다른 element 요소가 있으면 그 요소는 마치 위 float:left가 적용된 element가 없는 것처럼 적용이 되어서 겹쳐서 보여지게 됩니다. 이걸 막기 위해서 사용하는 속성이 바로, clear: both; 입니다.
그리고 display: table; 를 사용합니다. (이걸 왜 하는지는 안나와있어 인터넷에 찾아보고 추가해서 정리할게요. )
Media Query:
media query는 특정 조건이 만족되면 적용되는데, 미디어 쿼리(media query)는 width, height, color 속성과 같은 미디어 관련 속성을 이용한 표현식을 통해 스타일이 적용되는 범위를 조절할 수 있습니다.
위 그림 처럼, 각 상황에 따른 미디어쿼리를 적용할 시에 화면이 작아졌을때 element가 작아서 보기가 불편했던 문제점들을 해결할 수 있습니다.