In this project, we will use REST Countries API to fetch data.
We will learn to:
- fetch data from API
- paginate data
- filter data based on select option
HTML
<div class="container"> <select name="select" id="select"> <option value="All">All</option> <option value="Africa">Africa</option> <option value="Asia">Asia</option> <option value="Europe">Europe</option> <option value="Oceania">Oceania</option> <option value="North America">North America</option> <option value="South America">South America</option> </select> <div class="countries_wrapper"></div> <div class="pagination"> <ul></ul> </div> </div>
CSS
html { box-sizing: border-box; } *, *::before, *::after { box-sizing: inherit; } body { padding: 0; margin: 0; height: 100vh; background-color: #48014B; display: flex; justify-content: center; } .container { width: 80%; margin-top: 50px; } .countries_wrapper { display: flex; flex-wrap: wrap; gap: 1rem; } .country_detail { display: flex; flex-direction: column; } .country { padding: 5px; text-align: center; font-family: Arial, Helvetica, sans-serif; color: #fff; background-color: #FC255A; border-top: 2px solid #000; } h2, p { margin: 0; padding: 0; } ul { margin-top: 50px; padding: 0; } li { display: inline-block; padding: 12px; color: #ddd; background-color: #FC255A; border: 1px solid #000; cursor: pointer; } i { padding: 5px; color: #fff; } .current { background-color: #fff; color: #FC255A; } #select { margin-bottom: 15px; padding: 9px; font-size: 1.2rem; border: none; outline: none; }
JS
let list = []; let postPerPage = 6; const countries = document.querySelector('.countries_wrapper'); const pagination = document.querySelector('.pagination'); const selectValue = document.querySelector('#select'); function getCountries() { const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://restcountries.com/v3.1/all'); xhr.onreadystatechange = function () { if (this.readyState === 4) { if (this.status === 200) { list = JSON.parse(this.response); loadCountries(1); } } }; xhr.send(); } function loadCountries(page) { countries.innerHTML = ''; let startPost = (page - 1) * postPerPage; let endPost = page * postPerPage; let currentPage = list.slice(startPost, endPost) currentPage.forEach(element => { let mainDiv = document.createElement('div'); mainDiv.classList.add('country_detail'); let detailDiv = document.createElement('div'); detailDiv.classList.add('country'); let header2 = document.createElement('h2'); let p = document.createElement('p'); let img = document.createElement("img"); img.setAttribute("src", element.flags.png); header2.innerHTML = element.name.common; if (element.capital) { p.innerHTML = `Captial: ${element.capital[0]}`; } mainDiv.append(img); detailDiv.append(header2) detailDiv.append(p); mainDiv.append(detailDiv) countries.append(mainDiv) }) data.init(Math.ceil(list.length / postPerPage)); } let data = { ul: document.querySelector('ul'), list: "", page: 1, step: 3, add(x, y) { console.log('x', x, 'y', y) for (let i = x; i < y; i++) { data.list += '<li>' + i + '</li>'; } }, first() { data.list += '<li>1</li><i>...</i>'; }, last() { data.list += '<i>...</i><li>' + data.size + '</li>'; }, click() { data.page = +this.innerHTML; loadCountries(data.page); data.start(); }, paginationLi() { let li = pagination.getElementsByTagName('li'); for (var num = 0; num < li.length; num++) { if (+li[num].innerHTML === data.page) li[num].className = 'current'; li[num].addEventListener('click', data.click, false); } }, finish() { data.ul.innerHTML = data.list; data.list = ""; data.paginationLi(); }, start() { console.log(data.size) if (data.size < postPerPage) { data.add(1, (data.size + 1)); } else if (data.page < data.step * 2 + 1) { data.add(1, data.step * 2 + 4); } else if (data.page > data.size - data.step * 2) { data.first(); data.add(data.size - data.step - 3, data.size + 1); } else { data.first(); data.add(data.page - data.step + 1, data.page + data.step); data.last(); } data.finish(); }, init(paginationData) { data.size = paginationData; data.start(); } } async function fetchRegion(region) { const response = await fetch(`https://restcountries.com/v3.1/region/${region}`); const data = await response.json(); console.log(data); list = data; loadCountries(1); } selectValue.addEventListener('change', function () { if (this.value === "All") { getCountries() } else { fetchRegion(this.value); } }) function init() { selectValue.value = "All"; getCountries() } document.addEventListener('DOMContentLoaded', init);