Продолжил свой проект со своего последний вопрос.
Прямо сейчас он почти все делает так, как я хочу.
Основная функция этого веб-сайта - перебирать API World Of Tanks для создания карточек, показывающих провинции, которыми владеет наш клан.
Поэтому я использую следующий цикл for для создания карточек.
function loopProvince(provinces, jsonData) {
for (i = 0; i < provinces.length; i++) {
createCard(i);
getMaps(jsonData[clan_id][i].arena_id, i);
changeProvinceDetails(jsonData[clan_id], i + 1);
}
}
Проблема здесь в том, что если мы владеем 15 провинциями (поэтому скрипт должен создать 15 карт), он вместо этого создает 15 заполненных карт и пустую 16-ю. Мне было интересно, как я могу удалить 16-ю карту или вообще остановить ее создание.
Полный код:
//var clan_id = 500071433;
var clan_id = 500025989; // FAME
// Get province ID
//TODO: ein Feld zu viel --> Entfernen
var province_list = "https://api.worldoftanks.eu/wot/globalmap/clanprovinces/?application_id=bbdd3a54ffe280ff581db61299acab9c&clan_id = " + clan_id + "&fields=province_name%2C+province_id%2C+arena_id%2C+clan_id%2C+daily_revenue%2C+max_vehicle_level%2C+prime_time%2C+front_id";
// Get JSON Data
fetch(province_list)
.then(res => res.json())
.then((out) => {
loopProvince(out.data[clan_id], out.data);
})
.catch(err => {
throw err
});
function loopProvince(provinces, jsonData) {
for (i = 0; i < provinces.length; i++) {
createCard(i);
getMaps(jsonData[clan_id][i].arena_id, i);
changeProvinceDetails(jsonData[clan_id], i + 1);
}
}
function createCard(i) {
var card = `
<div class = "province" id = "province` + (i + 1) + `">
<div class = "province_title" id = "province_name` + (i + 1) + `">
<h2>Provinz ` + (i + 1) + `</h2>
</div>
<div class = "province_information">
<div class = "map_name" id = "province_map` + (i + 1) + `">
<p>Map Name</p>
</div>
<div class = "details">
<div class = "time" id = "province_time` + (i + 1) + `">
<p>Prime Time: XX:XX Uhr</p>
</div>
<div class = "tier" id = "province_tier` + (i + 1) + `">
<p>Stufe: X</p>
</div>
<div class = "income" id = "province_income` + (i + 1) + `">
<p>Einkommen: X/Tag</p>
</div>
</div> <!-- details -->
</div>
</div>
`;
document.getElementById('contentid').innerHTML += card;
}
function getMaps(arena_id, i) {
fetch('./data/maps.json')
.then((res) => res.json())
.then((jsonMap) => {
changeProvinceMap(jsonMap.data[arena_id].name_i18n, jsonMap.data[arena_id].minimap_location, i);
})
}
// start changing information
function changeProvinceDetails(json, i) {
changeProvinceName(json[i].province_name, i);
changeProvinceIncome(json[i].daily_revenue, i);
changeProvinceTier(json[i].max_vehicle_level, i);
changeProvinceTime(json[i].prime_time, i);
}
function changeProvinceName(province_name, i) {
document.getElementById("province_name" + i).innerHTML = "<h2>" + province_name + "</h2>";
}
function changeProvinceMap(province_map, province_minimap, i) {
document.getElementById("province_map" + i).innerHTML = "<p>" + province_map + "</p>";
document.getElementById("province_map" + i).setAttribute("style", "background:url(" + province_minimap + "); background-size:cover; background-position:center;");
}
function changeProvinceIncome(province_income, i) {
document.getElementById("province_income" + i).innerHTML = "<p>Einkommen: " + province_income + " / Tag </p>";
}
function changeProvinceTier(province_tier, i) {
document.getElementById("province_tier" + i).innerHTML = "<p>Stufe: " + province_tier + "</p>";
}
function changeProvinceTime(province_prime_time, i) {
document.getElementById("province_time" + i).innerHTML = "<p>Prime Time: " + province_prime_time + " Uhr</p>";
}body {
background: #EBEBEB;
font-family: sans-serif;
color: #343434;
}
.container {
display: grid;
grid-template-rows: auto 1fr auto;
grid-template-areas: "head" "information" "copyright";
height: 100vh;
grid-gap: 50px;
}
header {
display: grid;
background: #343434;
border-bottom: #ACACAC 5px solid;
}
#title {
grid-area: head;
padding: 20px;
font-size: 20px;
text-transform: uppercase;
font-weight: bold;
color: #ffffff;
}
.content {
grid-area: information;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));
grid-gap: 20px;
align-items: start;
}
.province {
background: #ACACAC;
display: grid;
grid-template-rows: auto 300px;
}
.province_title {
display: grid;
align-items: center;
justify-items: center;
background: #343434;
color: #ffffff;
}
.province_information {
height: minmax(200px, auto);
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-areas: "map details";
}
.province_information p {
margin: 0;
padding: 0;
}
.province_information .map_name {
grid-area: map;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-transform: uppercase;
font-weight: bold;
color: #343434;
background: white;
background-position: center;
background-size: cover;
}
.province_information .map_name>p {
background: #ffffff;
padding: 5px;
}
.province_information .details {
grid-area: details;
padding: 10px;
padding-right: 0;
display: grid;
grid-gap: 5px;
align-items: center;
}
.province_information .details .time {
font-weight: bold;
text-align: center;
font-size: 20px;
}
footer {
padding: 10px;
gird-area: copyright;
background: #343434;
border-top: #ACACAC 3px solid;
color: #ffffff;
}
/*
__ __ _ _
____ | / | | (_)
/ __ \| \ / | ___ __| |_ __ _
/ / _` | |/| |/ _ / _` | |/ _` |
| | (_| | | | | __/ (_| | | (_| |
\ \__,_|_| |_|\___|\__,_|_|\__,_|
\____/
*/
@media (max-width: 600px) {
.container {
grid-gap: 20px;
}
.content {
grid-area: information;
display: grid;
grid-template-columns: minmax(70%, 1fr);
grid-gap: 20px;
align-items: start;
justify-items: stretch;
}
.province_information {
height: minmax(200px, auto);
display: grid;
grid-template-columns: 1fr;
grid-template-row: 1fr 1fr;
grid-template-areas: "map" "details";
}
#title {
text-align: center;
}
}<!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">
<title>WOT Clan Wars Dashboard</title>
<link rel = "stylesheet" href = "css/style.css">
<script type = "text/javascript" src = "javascript/main.js"></script>
</head>
<body>
<div class = "container">
<header "head">
<div id = "title">
<h1>Clan Wars Dashboard</h1>
</div>
</header>
<div class = "content" id = "contentid">
<!-- generated by JavaScript -->
</div>
<!-- content -->
<footer>
Copyright © 2018 Kay Kleinvogel
</footer>
</div>
</body>
</html>Фоновые изображения здесь не работают, так как они сохраняются локально. Для всех файлов, включая maps.json и изображения, просто взгляните на Страница на Github.
Прошу прощения, если код запутан, так как это мой 1-й веб-проект, который больше, чем базовые руководства.
Спасибо за помощь :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пробовали делать «i <provinces.length - 1»? Это должно сработать.
Массивы отсчитываются от нуля, поэтому индексы массива начинаются от 0 до 14. Свойство length равно 15, поэтому цикл for будет выполняться до тех пор, пока не найдет элемент с индексом 15.
Если вы сомневаетесь в этом, запустите оператор console.info (i) внутри своего цикла, и вы увидите индексы всего, что он возвращает.
Надеюсь, это поможет :-)
На самом деле у вас есть 16 карт, поступающих из API. Проблема в том, что вы пропускаете первую, когда устанавливаете детали каждой карты.
changeProvinceDetails(jsonData[clan_id], i + 1);
Этот i+1 пропускает первый индекс. Вы можете компенсировать это, вычтя единицу, когда получите информацию из json.
function changeProvinceDetails(json, i) {
changeProvinceName(json[i-1].province_name, i);
changeProvinceIncome(json[i-1].daily_revenue, i);
changeProvinceTier(json[i-1].max_vehicle_level, i);
changeProvinceTime(json[i-1].prime_time, i);
}
Фиксированный:
function loopProvince(provinces, jsonData) {
for (i = 0; i < provinces.length; i++) {
createCard(i);
getMaps(jsonData[clan_id][i].arena_id, i+1);
changeProvinceDetails(jsonData[clan_id], i+1);
}
}
а также
function changeProvinceDetails(json, i) {
changeProvinceName(json[i-1].province_name, i);
changeProvinceIncome(json[i-1].daily_revenue, i);
changeProvinceTier(json[i-1].max_vehicle_level, i);
changeProvinceTime(json[i-1].prime_time, i);
}
решает проблему. Я использовал i + 1 для деталей провинции, но не для getMaps. Я должен был использовать метод резиновой утки. Тем не менее всем спасибо.
Хотя есть 16 провинций. Обратите внимание, как «Милан» присутствует в JSON в качестве первого элемента, а «Пробел» - это первая карточка на вашей странице.
он работает с текстом и информацией, но имя карты и фоновое изображение не меняются