I’m working with Pokemon API and I’m displaying different cards with Pokemon info, which works fine.
Every card has a MORE INFO button, if you click there, a new page will open with more info of that particular Pokemon. But I’m not sure how to achieve that. I could add that "more info" card in the index.html but I need that extra info in a new page.
index.html
<main>
<div>
<button id="btn-pokemon" type="button">Click to see Pokemon</button>
</div>
<div class="card" id="details" >
<div class="more-details"></div>
</div>
<div class="container-pokemon" id="cardPokemon"></div>
</main>
Details.html
<div id=“details” >
<h2>Pokemon Details</h2>
<div class="more-details"></div>
</div>
App.js
const cardPokemon = document.querySelector("#cardPokemon");
const cardDetalle = document.querySelector('#detalle');
const details = document.querySelector('.more-details');
const btnPokemon = document.querySelector('#btn-pokemon');
const endPoint = "https://pokeapi.co/api/v2/pokemon/";
function showPokemon(poke) {
let tipoDePokemon = poke.types.map((type) => `<p>${type.type.name}</p>`);
tipoDePokemon = tipoDePokemon.join('');
let abilitiesPokemon = poke.abilities.map((ability) => `<p>${ability.ability.name}</p>`);
abilitiesPokemon = abilitiesPokemon.join('');
const containerPokemon = document.createElement("div");
containerPokemon.innerHTML = `
<div class="card-pokemon">
<span>${poke.id}</span>
<div class="img">
<img src="${poke.sprites.other["official-artwork"].front_default}" alt="${poke.name}">
</div>
<div class="info">
<div>
<h2>${poke.name}</h2>
<div>
<p>Tipo de Pokemon:</>
${tipoDePokemon}
<p>base_experience:</>
${poke.base_experience}
</div>
<div>
<p class="stat">${poke.height}m</p>
<p class="stat">${poke.weight}kg</p>
</div>
</div>
<button class="btn-detalle" onclick="seeDetail(${poke.id})"> MORE INFO </button>
</div>
`;
cardPokemon.append(containerPokemon)
}
function detailsPokemon(poke) {
details.innerHTML = `
<div class="card-pokemon">
<span>ID: ${poke.id}</span>
<h2 class="pokemon-nombre">${poke.name}</h2>
</div>
`;
}
function seeDetail(id){
console.log(id)
fetch(endPoint + id)
.then((response) => response.json())
.then(data => detailsPokemon(data))
window.open('details.html', '_blank');
}
btnPokemon.addEventListener('click', function() {
for (let i = 1; i <= 100; i++) {
fetch(endPoint + i)
.then((response) => response.json())
.then(data => showPokemon(data))
}
})
>Solution :
You can send the id through a query parameter.
In the script on index.html
:
function seeDetail(id){
window.open('details.html?id=' + id, '_blank');
}
Details.html
:
<div id="details">
<h2>Pokemon Details</h2>
<div class="more-details"></div>
</div>
<script>
const moreDetails = document.querySelector(".more-details");
function detailsPokemon(poke) {
moreDetails.innerHTML = `
<div class="card-pokemon">
<span>ID: ${poke.id}</span>
<h2 class="pokemon-nombre">${poke.name}</h2>
</div>
`;
}
const endPoint = "https://pokeapi.co/api/v2/pokemon/";
fetch(endPoint + new URLSearchParams(location.search).get('id'))
.then((response) => response.json())
.then(data => detailsPokemon(data))
</script>