第一个AJAX调用XMLHttpRequest
- 创建对象,用于浏览器和服务器的通信,不需要刷新浏览器
js
const request = new XMLHttpRequest();
- 通过GET请求方式在API中请求数据
js
request.open('GET', 'https://restcountries.com/v3.1/name/Russia');
注:我这里的API是在GitHub中找的,大家也可以找类似的API使用
上面API有讲解如何去请求数据
- 然后就发送请求,之后直接打印响应的文本看一下是否可以请求到数据
js
request.send();
console.log(request.responseText);
- 当然请求是异步的,上面可能会由于数据没有准备好等请求返回不了我们想要的,所以使用load来监听数据的介绍js
js
request.addEventListener('load', function () {
console.log(request.responseText);
});
- 之后我们在浏览器测试一下数据是否可以正常接收,返回的数据是以json的格式返回的,我们将其转换为JavaScript对象的形式,当然现在都是JSON的方式来返回数据,XML格式已经过时淘汰了
js
request.addEventListener('load', function () {
const data = JSON.parse(this.responseText);
console.log(data);
之后我们编写一个HTML模版,之后会以卡片的形式来展现的网页中
这里先看一下,我们预设的HTML代码
html
<!DOCTYPE html>
<html lang="en">
<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" />
<link rel="stylesheet" href="style.css" />
<script defer src="script.js"></script>
<title>异步 JavaScript</title>
</head>
<body>
<main class="container">
<div class="countries">
<!--
<article class="country">
<img class="country__img" src="" />
<div class="country__data">
<h3 class="country__name">COUNTRY</h3>
<h4 class="country__region">REGION</h4>
<p class="country__row"><span>👫</span>POP people</p>
<p class="country__row"><span>🗣️</span>LANG</p>
<p class="country__row"><span>💰</span>CUR</p>
</div>
</article>
-->
</div>
<!-- <button class="btn-country">Where am I?</button> -->
<div class="images"></div>
</main>
</body>
</html>
这里注释的代码就是我们要插入的HTML模版
- 现在我们就开始制作HTML模板
js
const html = `
<article class="country">
<img class="country__img" src=${data[0].flags.png} />
<div class="country__data">
<h3 class="country__name">${data[0].name.common}</h3>
<h4 class="country__region">${data[0].region}</h4>
<p class="country__row"><span>👫</span>${(
data[0].population / 1000000
).toFixed(0)} people</p>
<p class="country__row"><span>🗣️</span>${data[0].languages.rus}</p>
<p class="country__row"><span>💰</span>${
data[0].currencies.RUB.name
}</p>
</div>
</article>`;
});
其中的参数来JavaScript对象找就行,很简单,这里不做详细赘述
- 然后我们将我们的模板插入到HTML代码中
js
countriesContainer.insertAdjacentHTML('beforeend', html);
countriesContainer.style.opacity = 1;
css的预设代码如下
css
* {
margin: 0;
padding: 0;
box-sizing: inherit;
}
html {
font-size: 62.5%;
box-sizing: border-box;
}
body {
font-family: system-ui;
color: #555;
background-color: #f7f7f7;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.container {
display: flex;
flex-flow: column;
align-items: center;
}
.countries {
/* margin-bottom: 8rem; */
display: flex;
font-size: 2rem;
opacity: 0;
transition: opacity 1s;
}
.country {
background-color: #fff;
box-shadow: 0 2rem 5rem 1rem rgba(0, 0, 0, 0.1);
font-size: 1.8rem;
width: 30rem;
border-radius: 0.7rem;
margin: 0 3rem;
/* overflow: hidden; */
}
.neighbour::before {
content: 'Neighbour country';
width: 100%;
position: absolute;
top: -4rem;
text-align: center;
font-size: 1.8rem;
font-weight: 600;
text-transform: uppercase;
color: #888;
}
.neighbour {
transform: scale(0.8) translateY(1rem);
margin-left: 0;
}
.country__img {
width: 30rem;
height: 17rem;
object-fit: cover;
background-color: #eee;
border-top-left-radius: 0.7rem;
border-top-right-radius: 0.7rem;
}
.country__data {
padding: 2.5rem 3.75rem 3rem 3.75rem;
}
.country__name {
font-size: 2.7rem;
margin-bottom: 0.7rem;
}
.country__region {
font-size: 1.4rem;
margin-bottom: 2.5rem;
text-transform: uppercase;
color: #888;
}
.country__row:not(:last-child) {
margin-bottom: 1rem;
}
.country__row span {
display: inline-block;
margin-right: 2rem;
font-size: 2.4rem;
}
.btn-country {
border: none;
font-size: 2rem;
padding: 2rem 5rem;
border-radius: 0.7rem;
color: white;
background-color: orangered;
cursor: pointer;
}
.images {
display: flex;
}
.images img {
display: block;
width: 80rem;
margin: 4rem;
}
.images img.parallel {
width: 40rem;
margin: 2rem;
border: 3rem solid white;
box-shadow: 0 2rem 5rem 1rem rgba(0, 0, 0, 0.1);
}
- 之后就能将漂亮的表格输出出来了
目前我们是通过硬编码的方式传入国家的名称,我们可以通过函数的方式来调用
js
'use strict';
const btn = document.querySelector('.btn-country');
const countriesContainer = document.querySelector('.countries');
///
const getCountrydata = function (country) {
const request = new XMLHttpRequest();
request.open('GET', `https://restcountries.com/v3.1/name/${country}`);
request.send();
request.addEventListener('load', function () {
const data = JSON.parse(this.responseText);
console.log(data);
const html = `
<article class="country">
<img class="country__img" src=${data[0].flags.png} />
<div class="country__data">
<h3 class="country__name">${data[0].name.common}</h3>
<h4 class="country__region">${data[0].region}</h4>
<p class="country__row"><span>👫</span>${(
data[0].population / 1000000
).toFixed(0)} people</p>
<p class="country__row"><span>🗣️</span>${data[0].languages.rus}</p>
<p class="country__row"><span>💰</span>${
data[0].currencies.RUB.name
}</p>
</div>
</article>`;
countriesContainer.insertAdjacentHTML('beforeend', html);
countriesContainer.style.opacity = 1;
});
};
getCountrydata('us');
这里和上面的显示画面是一样的