第一个AJAX调用XMLHttpRequest

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

第一个AJAX调用XMLHttpRequest

  • 创建对象,用于浏览器和服务器的通信,不需要刷新浏览器
const request = new XMLHttpRequest();
  • 通过GET请求方式在API中请求数据
request.open('GET', 'https://restcountries.com/v3.1/name/Russia');

在这里插入图片描述

注:我这里的API是在GitHub中找的,大家也可以找类似的API使用

上面API有讲解如何去请求数据

  • 然后就发送请求,之后直接打印响应的文本看一下是否可以请求到数据
request.send();
console.log(request.responseText);
  • 当然请求是异步的,上面可能会由于数据没有准备好等请求返回不了我们想要的,所以使用load来监听数据的介绍js
request.addEventListener('load', function () {
  console.log(request.responseText);
});

在这里插入图片描述

  • 之后我们在浏览器测试一下数据是否可以正常接收,返回的数据是以json的格式返回的,我们将其转换为JavaScript对象的形式,当然现在都是JSON的方式来返回数据,XML格式已经过时淘汰了
request.addEventListener('load', function () {
  const data = JSON.parse(this.responseText);
  console.log(data);

之后我们编写一个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模板
    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代码中
 countriesContainer.insertAdjacentHTML('beforeend', html);
 countriesContainer.style.opacity = 1;

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);
}
  • 之后就能将漂亮的表格输出出来了
    在这里插入图片描述

目前我们是通过硬编码的方式传入国家的名称,我们可以通过函数的方式来调用

'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');

这里和上面的显示画面是一样的