В приведенной ниже демонстрации используются функция async
и ключевое слово await
, поэтому Promise контролирует асинхронное взаимодействие между клиентом (вами) и тестовым сервером в данный момент времени. конечная точка (первый параметр) . Передается селектор (второй необязательный параметр) элемента DOM, чтобы указать, где следует отображать изображения (по умолчанию "body"
, если не определено).
fetchImages("https://sub.domain.tld/path/to/json", "tagName#id.className[attribute]"/*or "body"*/)
fetch()
- это асинхронная функция, которая гарантирует ответ или отклонение запрошенных данных через ключевое слово await
. Метод .json()
(также предшествующий await
) извлекает JSON.
const response = await fetch(`https://api.myjson.com/bins/19fk22`);
let imgArray = await response.json();
/* At this point the JSON is stored in a variable called imgArray
imgArray = [
"https://i.ibb.co/hZj77BZ/lena01.jpg",
"https://i.ibb.co/7XxsBr5/lena02.png",
"https://i.ibb.co/X7SCb3w/lena03.png"
]
*/
Далее, массив JSON (он же imgArray
) проходит через метод массива .forEach((src, idx) => {...
. Каждый URL (src
первый параметр) в пределах imgArray
обрабатывается. Ниже приведена пошаговая разбивка первого URL обрабатываемого изображения ( Обратите внимание, как второй параметр idx
используется на шаге # 3 ):
Ссылка на элемент DOM, в который изображения будут помещены в
const node = document.querySelector('.gallery')
// <header class="gallery">|<= images will be inserted here =>|</header>
Извлеките имя файла изображения с помощью .split()
let name = src.split('/')
// ['https:', 'i.ibb.co', 'hZj77BZ', 'lena01.jpg']
.pop()
// 'lena01.jpg'
.split('.')
// ['lena01', 'jpg']
.shift();
// 'lena01'
Назначить шаблонный литерал для htmlString
переменной (let html
) и затем интерполировать ${values}
и / или ${expressions}
let html = `
<figure style="animation: ${3 * (idx+1)}s fadeIn">`
/* <figure style="animation: 3s fadeIn">
Each iteration is assigned an increased CSS animation-duration value.
The first image fades in for 3sec, the second image fades in for 6sec, third 9sec, etc.
The actual code for the animation is in the CSS.
*/
`<img src="${src}">`
// <img src="https://i.ibb.co/hZj77BZ/lena01.jpg">
`<figcaption>${name}</figcaption>`
/* <figcaption>LENA01</figcaption>
The name value from step #2 is inserted as a caption and styled by CSS
*/
`</figure>`;
node.insertAdjacentHTML("beforeend", html);
/* .insertAdjacentHTML(position, htmlString) is .innerHTML on steroids
@Param: [Position]: "beforebegin", "afterbegin", "beforeend", or "afterend"
@Param: [htmlString]: strongly suggest that template literals be used instead of literal strings
Демо
const endpoint = `https://api.myjson.com/bins/19fk22`;
const fetchImages = async(endpoint, selector = "body") => {
const response = await fetch(endpoint);
let imgArray = await response.json();
imgArray.forEach((src, idx) => {
const node = document.querySelector(selector);
let name = src.split('/').pop().split('.').shift();
let html = `
<figure style="animation: ${3 * (idx+1)}s fadeIn">
<img src="${src}">
<figcaption>${name}</figcaption>
</figure>`;
node.insertAdjacentHTML("beforeend", html);
});
}
fetchImages(endpoint, '.gallery');
.gallery {
display: flex;
justify-content: center;
width: 96%;
margin: 10px auto;
padding: 5px;
background: rgb(138, 56, 201);
}
figure {
width: 50vw;
margin: 10px 2.5px 5px;
}
figcaption {
font: 700 small-caps 3vw/1 Arial;
color: gold;
text-align: center;
}
img {
width: 100%;
height: auto;
}
@keyframes fadeIn {
from {
opacity: 0;
}
50% {
opacity: 0.66;
}
to {
opacity: 1;
}
}
<header class='gallery'></header>