-Asynchronous JavaScript And XML
AJAX를 사용하면?
사용 예시
얄코님 코드 참고
HTML 문서에서 각 주제의 제목과 설명글이 나타나야 할 곳을 처음에 비워둠
<h2></h2>
<p></p>
<nav>
<ul>
<li class="javascript">JavaScript</li>
<li class="react">React</li>
<li class="dom">Dom</li>
<li class="ssr">SSR</li>
</ul>
</nav>
XMLHTTPRequest 버전
function 함수(code) {
const xhr = new XMLHttpRequest();
xhr.open('GET', './apis.json', true);
}
[
{
"code": "javaScript",
"name": "JavaScript",
"content": "JavaScript는 이런 특징을 가지고 있습니다."
},
{
"code": "react",
"name": "React",
"content": "React는 이런 특징을 가지고 있습니다."
},
{
"code": "dom",
"name": "Dom",
"content": "Dom은 이런 특징을 가지고 있습니다."
},
{
"code": "ssr",
"name": "SSR",
"content": "SSR은 이런 특징을 가지고 있습니다."
}
]
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
// 응답이 성공적으로 돌아왔을 때 실행할 일
if (xhr.status === 200) {
try {
// 서버로부터 받아온 JSON 형식의 텍스트를 파싱해서 데이터 추출
const data = JSON.parse(xhr.responseText);
const api = data.find(api => api.code === code);
// DOM의 기능들을 사용해서 요소들을 선택
document.querySelectorAll('#contents nav ul li')
// select 클래스를 더하거나 빼서 선택된 탭을 표시
.forEach(li => { li.classList.remove('selected') });
document.querySelector(`#contents nav ul li.${code}`)
.classList.add('selected');
document.querySelector('#contents h2')
// textContent 속성을 통해 제목과 내용을 채워 넣음
.textContent = api.name;
document.querySelector('#contents p')
.textContent = api.content;
} catch (e) {
console.error('Error parsing JSON:', e);
}
} else {
console.error('Network response was not ok');
}
}
};
// 문제 발생시 실행할 함수 넣어주기
xhr.onerror = function() {
console.error('Request error');
};
// send 메소드로 요청을 서버에 보냄
xhr.send();
}
document.querySelectorAll('#contents ul li')
.forEach(li => {
li.addEventListener('click', function(e) {
const code = Array.from(e.target.classList)
.find(c => { return c != 'selected' })
// 사용자가 이 탭의 버튼들 중 하나를 클릭할 때, 웹 페이지가 처음 열릴 때 각 주제의 코드와 함께 실행됨
getContents(code);
});
});
getContents('javascript')
Fetch API 버전
function getContents (code) {
fetch('./apis.json')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
const api = data.find(api => api.code === code);
document.querySelectorAll('#contents nav ul li')
.forEach(li => {li.classList.remove('selected')})
document.querySelector(`#contents nav ul li.${code}`)
.classList.add('selected');
document.querySelector('#contents h2')
.textContent = api.name;
document.querySelector('#contents p')
.textContent = api.content;
})
.catch(error => {
console.error('Error ocurred:', error);
});
}
document.querySelectorAll('#contents ul li')
.forEach(li => {
li.addEventListener('click', function(e) {
const code = Array.from(e.target.classList)
.find(c => { return c != 'selected' })
getContents(code);
});
});
getContents('javascript');