HTML 파일 비동기 통신
ajax 비동기 통신을 사용하여 html 데이터 파일을 html요소인 main에 넣는 실습을 진행한다. 이번 실습은 SPA(single-page application)방식이다.
ajax 라이브러리를 이용해서 기존의 HMLHttpRepuest를 생성하고
.open()
,.send()
를 진행하는 긴 과정을 간소화하여 비동기 통신할 수 있다.Dom 라이브러리로 각 요소들을 Dom 객체에 참조하여 Dom의 메소드를 사용한다.
Dom의 기능 뿐만 아니라 네이티브 메서드도 사용할 수 있다.
;(function (global, $, ajax) {
'use strict'
/* Dom 객체에 참조 -------------------------------------- */
var $links = $('nav a')
var $main = $('main.content')
/* 이벤트 핸들러 ----------------------------------------- */
var ajaxCallHTML = function (e) {
// 앵커 요소의 기본 링크 능력을 상실
e.preventDefault()
var href = this.getAttribute('href')
/* 요소에 상태 클래스 추가/제 ----------------------------- */
// 라이브러리가 메서드가 아닌 네이티브 메서드 사
// 다른 앵커 요소를 클릭했을 때 이전에 클릭한 요소의 색상이 여전히 남아있지 않도록 한다.
$links.each(function (link) {
if (link.classList.contains('is-active')) {
link.classList.remove('is-active')
}
})
// 앵커 요소를 클릭했을 때 색상이 활성화 되로록 한다.
this.classList.add('is-active')
/* 비동기 통신 실행 ------------------------------------- */
// ajax 비동기 통신 수행
// typeof data는 string
ajax.get(href).then(function (data) {
$main.html(data)
})
}
/* 앵커 요소 순환 및 이벤트 바인딩 ---------------------------- */
$.each($links, function (link, index) {
// eq() : $link를 개별적으로 출력
// Dom 객체가 각가의 앵커 요소를 출력
var $link = $links.eq(index)
$link.on('click', ajaxCallHTML)
})
})(window, Dom, ajax)
<!DOCTYPE html>
<html lang="ko-KR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Ajax 비동기 통신</title>
<style>
body {width: 740px; margin: 100px auto; font: 1rem/1.5 "Spoqa Han Sans";}
nav {margin-bottom: 50px;}
nav ul {list-style: none; padding-left: 0; display: flex;}
nav li { box-sizing: border-box; flex: 1 0 50%; text-align: center; }
nav a {display: block; padding: 0.8em; color: #7e7e7e; border-top: 2px solid #d7d7d7; border-bottom: 4px double #d7d7d7; text-decoration: none; transition: all 0.15s ease-out;}
nav a:hover, nav a.is-active {color: #1990c0; border-color: #1990c0; border-bottom: 4px solid #1990c0;}
</style>
<link rel="stylesheet" href="css/ediya.css">
</head>
<body>
<nav>
<ul>
<li><a href="./data/ajax-define.html">Ajax란?</a></li>
<li><a href="./data/ajax-http-request.html">HTTP request 만들기</a></li>
</ul>
</nav>
<main class="content"></main>
// 라이브러리 코드 파일
<script src="./js/ajax.js"></script>
<script src="./js/Dom.js"></script>
// 작업 파일
<script src="./js/action.js"></script>
</body>
</html>
<h1>AJAX란?</h1>
<p>
에이젝스(Ajax)란? <code>JavaScript</code>와 <abbr title="eXtensible Markup Language">XML</abbr> 또는 <abbr title="JavaScript Object Notation">JSON</abbr>을 사용해 비동기 통신 방법으로
웹 애플리케이션을 제작하는 것을 말합니다. 간단히 말하면 서버측 스크립트와 통신하기 위한
<code>XMLHttpRequest</code>객체를 사용하는 것을 말합니다.
</p>
<p>다시 말해 아래와 같이 두가지로 정리됩니다.</p>
<ul>
<li>페이지 일부분을 업데이트 하기 위한 정보를 서버에 요청할 수 있다.</li>
<li>서버로부터 받은 데이터로 작업을 한다.</li>
</ul>
<h1>HTTP Request 만들기</h1>
<p>
JavaScript를 이용하여 서버로 보내는 HTTP 요청(Request)를 만들기 위해서는 이런 기능을 제공하는 클래스 인스턴스가 필요합니다. 이런 클래스는 IE(Internet Explorer)에서는 XMLHTTP 라고 불리는 엑티브X 객체(ActiveX object)를 말합니다. Mozzlia, Safari나 다른 브라우저는 Microsoft의 ActiveX객체의 메서드(method)와 속성(property)을 지원하기 위해 XMLHttpRequest 클래스를 구현 하고 있습니다.
</p>
<p>따라서, 다음과 같이 하면 모든 브라우저에서 사용할 수 있는 인스턴스를 만들 수 있습니다.</p>
<pre><code class="language-js">var httpRequest;
if (window.XMLHttpRequest) { // 모질라, 사파리등 그외 브라우저, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 8 이상
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}</code></pre>
사용된 jQuery 메서드 (확인하기)
jQuery.each( array, callback )
.each(function)
.eq(index)
.get(index)
.html()
Last updated