javascript - 纯JS中表格元素的下一个/上一个按钮
问题描述
我有一个包含大量数据的表格,当我在一定数量的条目(10、20、50、100 或所有结果)中显示元素时,我需要添加分页。我不需要页数,一个按钮next和previous就足够了。
我是 javascript 的初学者,不能使用 jquery 或 react 或数据表来帮助我,所以这必须在纯 JS 中完成。你知道我该怎么做吗?先感谢您。
let datas = document.getElementById("data");
superHeroes(data);
var caracters = [];
let nbr = 20;
let first = 0;
let actualPage = 1;
/* let pages = document.getElementById('my-page');
let pageCount = pages.length; */
// fonctions asychrones afin de lire les données Json sans devoir attendre l'exécution des autres
async function fetching() { // on attend le retour des données
caracters = await fetch('https://rawcdn.githack.com/akabab/superhero-api/0.2.0/api/all.json')
.then(res => res.json());
console.log(caracters)
};
function printHeroes(nbElement, offset) {
var Tab = "";
for (i = offset; i < offset + nbElement; i++) {
Tab += `
<tr>
<td><img src="${caracters[i].images.xs}"/> </td>
<td class="hero-name"> ${caracters[i].name} </td>
<td class="hero-fullname"> ${caracters[i].biography.fullName} </td>
<td class="hero-powerstats"> ${caracters[i].powerstats.intelligence}
${caracters[i].powerstats.strength}
${caracters[i].powerstats.speed}
${caracters[i].powerstats.durability}
${caracters[i].powerstats.power}
${caracters[i].powerstats.combat} </td>
<td class="hero-race"> ${caracters[i].appearance.race} </td>
<td class="hero-gender"> ${caracters[i].appearance.gender} </td>
<td class="hero-height"> ${caracters[i].appearance.height} </td>
<td class="hero-weight"> ${caracters[i].appearance.weight} </td>
<td class="hero-placeOfBirth"> ${caracters[i].biography.placeOfBirth} </td>
<td class="hero-alignment"> ${caracters[i].biography.alignment} </td>
</tr> `
}
return Tab;
}
async function superHeroes() {
await fetching();
// NOMBRE D'ELEMENTS PAR PAGE :
let nbrSelector = document.getElementById("maxRows");
nbrSelector.addEventListener("change", function () {
nbElement = parseInt(this.value);
datas.innerHTML = printHeroes(nbElement, 0);
})
// PASSER A LA PAGE SUIVANTE :
let Next = document.querySelector('#btn-next');
Next.addEventListener("click", function goForward() {
if (first + nbr <= nbElement + first) {
first += nbr;
actualPage++;
datas.innerHTML = printHeroes(nbElement, 0);
}
})
// PASSER A LA PAGE PRECEDENTE :
let Prev = document.querySelector('#btn-previous');
Prev.addEventListener("click", function goBackward() {
if (first - nbr >= 0) {
first -= nbr;
actualPage--;
datas.innerHTML = caracters + printHeroes(nbElement, 0);
}
});
}
And here's my HTML :
<body id="my-page">
<h1>Superheroes Database</h1>
<br /><br />
<p>All of them in one place</p>
<br /><br />
<input type="text" id="search" onkeyup="search()" placeholder="Search for names...">
<form>
<label class="selector" for="th-select">Search...</label>
<select id="th-list">
<option value="name">NAME</option>
<option value="name">FULL NAME</option>
<option value="name">RACE</option>
<option value="name">POWERSTATS (Intelligence)</option>
<option value="name">POWERSTATS (Strength)</option>
<option value="name">POWERSTATS (Speed)</option>
<option value="name">POWERSTATS (Durability)</option>
<option value="name">POWERSTATS (Power)</option>
<option value="name">POWERSTATS (Combat)</option>
<option value="name">GENDER</option>
<option value="name">PLACE OF BIRTH</option>
<option value="name">ALIGNMENT</option>
<option value="name" selected>ANY</option>
</select>
</form>
<form>
<label class="custom-select" for="maxRows-select">Nombre d'éléments par page : </label>
<select id="maxRows">
<option value=10>10</option>
<option value=20 selected>20</option>
<option value=50>50</option>
<option value=100>100</option>
<option value=563>All</option>
</select>
</form>
<p id="no-result"></p>
<button class="btn-page" id="btn-previous"> ᗕ previous </button>
<button class="btn-page" id="btn-next"> next ᗒ </button>
<!-- TABLE CONSTRUCTION-->
<table id="table" class="tableau" style="width:100%">
<thead>
<!-- HEADING FORMATION -->
<tr>
<!-- met le contenu sur une ligne -->
<th rowspan="2">Picture</th> <!-- en-tête du tableau -->
<th rowspan="2">Name</th>
<th rowspan="2">Full Name</th>
<th rowspan="2">Powerstats</th>
<th rowspan="2">Race</th>
<th rowspan="2">Gender</th>
<th rowspan="2">Height</th>
<th rowspan="2">Weight</th>
<th rowspan="2">Place of Birth</th>
<th rowspan="2">Alignement</th>
</thead>
<tbody id="data">
</tbody>
<p id="no-result"></p>
</body>
</html>```
解决方案
到目前为止,您的程序还不是解决方案:因此 next 和 prev 可以正常工作,您会看到搜索按钮
var caracters = [];
let datas = document.getElementById("data");
var maxHeroes = 0;
var nbElement = 0;
var nbrPages = 0;
var actualPage = 0;
superHeroes(datas);
/* let pages = document.getElementById('my-page');
let pageCount = pages.length; */
// fonctions asychrones afin de lire les données Json sans devoir attendre l'exécution des autres
async function fetching() { // on attend le retour des données
caracters = await fetch('https://rawcdn.githack.com/akabab/superhero-api/0.2.0/api/all.json')
.then(res => res.json());
//console.log(caracters)
};
function printHeroes(nbElement, offset) {
var Tab = "";
for (i = offset * nbElement; i < (offset + 1) * nbElement; i++) {
if (i >= maxHeroes) break;
Tab += `
<tr>
<td><img src="${caracters[i].images.xs}"/> </td>
<td class="hero-name"> ${caracters[i].name} </td>
<td class="hero-fullname"> ${caracters[i].biography.fullName} </td>
<td class="hero-powerstats"> ${caracters[i].powerstats.intelligence}
${caracters[i].powerstats.strength}
${caracters[i].powerstats.speed}
${caracters[i].powerstats.durability}
${caracters[i].powerstats.power}
${caracters[i].powerstats.combat} </td>
<td class="hero-race"> ${caracters[i].appearance.race} </td>
<td class="hero-gender"> ${caracters[i].appearance.gender} </td>
<td class="hero-height"> ${caracters[i].appearance.height} </td>
<td class="hero-weight"> ${caracters[i].appearance.weight} </td>
<td class="hero-placeOfBirth"> ${caracters[i].biography.placeOfBirth} </td>
<td class="hero-alignment"> ${caracters[i].biography.alignment} </td>
</tr> `
}
return Tab;
}
async function superHeroes(datas) {
await fetching();
// NOMBRE D'ELEMENTS PAR PAGE AND Dipslay the first data:
let nbrSelector = document.getElementById("maxRows");
nbElement = parseInt(nbrSelector.value);
maxHeroes = caracters.length;
nbrPages = (maxHeroes % nbElement ? 1 : 0) + Math.floor(maxHeroes / nbElement);
actualPage = 1;
datas.innerHTML = printHeroes(nbElement, 0);
nbrSelector.addEventListener("change", function() {
nbElement = parseInt(this.value);
nbrPages = (maxHeroes % nbElement ? 1 : 0) + Math.floor(maxHeroes / nbElement);
actualPage = 1;
datas.innerHTML = printHeroes(nbElement, 0);
})
// PASSER A LA PAGE SUIVANTE :
let Next = document.querySelector('#btn-next');
Next.addEventListener("click", function goForward() {
if (actualPage < nbrPages) actualPage++;
datas.innerHTML = printHeroes(nbElement, actualPage - 1);
});
// PASSER A LA PAGE PRECEDENTE :
let Prev = document.querySelector('#btn-previous');
Prev.addEventListener("click", function goBackward() {
if (actualPage > 1) actualPage--;
datas.innerHTML = printHeroes(nbElement, actualPage - 1);
});
}
<body id="my-page">
<h1>Superheroes Database</h1>
<br /><br />
<p>All of them in one place</p>
<br /><br />
<input type="text" id="search" onkeyup="search()" placeholder="Search for names...">
<form>
<label class="selector" for="th-select">Search...</label>
<select id="th-list">
<option value="name">NAME</option>
<option value="name">FULL NAME</option>
<option value="name">RACE</option>
<option value="name">POWERSTATS (Intelligence)</option>
<option value="name">POWERSTATS (Strength)</option>
<option value="name">POWERSTATS (Speed)</option>
<option value="name">POWERSTATS (Durability)</option>
<option value="name">POWERSTATS (Power)</option>
<option value="name">POWERSTATS (Combat)</option>
<option value="name">GENDER</option>
<option value="name">PLACE OF BIRTH</option>
<option value="name">ALIGNMENT</option>
<option value="name" selected>ANY</option>
</select>
</form>
<form>
<label class="custom-select" for="maxRows-select">Nombre d'éléments par page : </label>
<select id="maxRows">
<option value=10>10</option>
<option value=20 selected>20</option>
<option value=50>50</option>
<option value=100>100</option>
<option value=563>All</option>
</select>
</form>
<p id="no-result"></p>
<button class="btn-page" id="btn-previous"> ᗕ previous </button>
<button class="btn-page" id="btn-next"> next ᗒ </button>
<!-- TABLE CONSTRUCTION-->
<table id="table" class="tableau" style="width:100%">
<thead>
<!-- HEADING FORMATION -->
<tr>
<!-- met le contenu sur une ligne -->
<th rowspan="2">Picture</th>
<!-- en-tête du tableau -->
<th rowspan="2">Name</th>
<th rowspan="2">Full Name</th>
<th rowspan="2">Powerstats</th>
<th rowspan="2">Race</th>
<th rowspan="2">Gender</th>
<th rowspan="2">Height</th>
<th rowspan="2">Weight</th>
<th rowspan="2">Place of Birth</th>
<th rowspan="2">Alignement</th>
</thead>
<tbody id="data">
</tbody>
<p id="no-result"></p>
</body>