const wrap = document.createElement('div');
wrap.setAttribute('class', 'sw-wrap');
const list = document.createElement('div');
list.setAttribute('class', 'sw-list');
wrap.appendChild(list);
////////////////////////////////////////////
var swapi = new XMLHttpRequest();
swapi.open("GET", "http://swapi.co/api/films/", true);
swapi.onload=function(){
var data=JSON.parse(this.response);
data.results.forEach( film => {
console.log(film.title);
const wrap = document.createElement('div');
wrap.setAttribute('class', 'sw-wrap');
const list = document.createElement('div');
list.setAttribute('class', 'sw-list');
const item = document.createElement('div');
item.setAttribute('class', 'sw-item');
const info = document.createElement('div');
info.setAttribute('class', 'sw-item__info');
const description = document.createElement('div');
description.setAttribute('class', 'opening_crawl');
const title = document.createElement('h3');
title.textContent=film.title;
const episode = document.createElement('h3');
episode.textContent=film.episode_id;
const director = document.createElement('div');
director.textContent=film.director;
const release = document.createElement('div');
release.textContent=film.release_date;
list.appendChild(item);
item.appendChild(info);
item.appendChild(description);
info.appendChild(title);
info.appendChild(episode);
info.appendChild(director);
info.appendChild(release);
});
}
swapi.send();
<div class="sw-wrap">
<div class="sw-list">
<div class="sw-item">
<div class="sw-item__info">
<h3 class="title">A New Hope</h3>
<h3 class="episode_id">4</h3>
<div class="director">George Lucas</div>
<div class="producer">Gary Kurtz, Rick McCallum</div>
<div class="release_date">1977-05-25</div>
</div>
<div class="opening_crawl">.</div>
</div>
</div>
</div>
const wrap = document.createElement('div');
wrap.setAttribute('class', 'sw-wrap');
const list = document.createElement('div');
list.setAttribute('class', 'sw-list');
wrap.appendChild(list);
////////////////////////////////////////////
var swapi = new XMLHttpRequest();
swapi.open("GET", "http://swapi.co/api/films/", true);
swapi.onload=function(){
var data=JSON.parse(this.response);
data.results.forEach( film => {
console.log(film.title);
const item = document.createElement('div');
item.setAttribute('class', 'sw-item');
const info = document.createElement('div');
info.setAttribute('class', 'sw-item__info');
const description = document.createElement('div');
description.setAttribute('class', 'opening_crawl');
const title = document.createElement('h3');
title.textContent=film.title;
const episode = document.createElement('h3');
episode.textContent=film.episode_id;
const director = document.createElement('div');
director.textContent=film.director;
const release = document.createElement('div');
release.textContent=film.release_date;
list.appendChild(item);
item.appendChild(info);
item.appendChild(description);
info.appendChild(title);
info.appendChild(episode);
info.appendChild(director);
info.appendChild(release);
});
}
swapi.send();
<div id="content"></div>
document.getElementById('content').appendChild(wrap);
(function() {
'use strict';
// Инициализируем объект методов swapi
const swapi = {
// Метод инициализации, принимает массив объектов данных из API и объект настроек
init(response, setting) {
// Зададим основной контейнер куда будут вставлятся данные
// Можно явно указать в свойстве container или создать и вернуть в свойстве create()
const element = setting.container || setting.create()
// Выводим данные на страницу
appendCollectionOutput(element, filterArray(response, (data, index) => {
return parseHtml(setting.items(data, index))
}))
}
}
// Инициализация запроса к API
ajax({
url: 'https://swapi.co/api/films/',
method: 'GET',
contentType: 'application/json; charset=UTF-8',
success(response) {
// Инициализируем плагин, передаем данные из API и пишем объект настроек
swapi.init(JSON.parse(response).results, {
// Определяем куда будет вставлятся html из функции items(data)
container: document.querySelector('.swapi-container'),
// Определяем шаблон вывода
items(data) {
return `
<div class="sw-wrap">
<div class="sw-list">
<div class="sw-item">
<div class="sw-item__info">
<h3 class="title">${data.title}</h3>
<h3 class="episode_id">${data.episode_id}</h3>
<div class="director">${data.director}</div>
<div class="producer">${data.producer}</div>
<div class="release_date">${data.release_date}</div>
</div>
<div class="opening_crawl">.</div>
</div>
</div>
</div>
`
}
})
}
})
/**
* Вставка HTMLCollection на страницу
* @param {Node} element - Node элемент, куда будет вставлятся коллекция
* @param {HTMLCollection} collection - масив HTMLCollection
**/
function appendCollectionOutput(element, collection) {
for (let i = 0; i < collection.length; i++) {
element.appendChild(collection[i][0])
}
}
/**
* Парсинг HTML из строки
* @param {string} string - html строка
* @returns {HTMLCollection} - html коллекция node узлов
**/
function parseHtml(string) {
const template = document.implementation.createHTMLDocument();
template.body.innerHTML = string;
return template.body.children;
}
/**
* Фильтр и перебор по массиву
* @param {array} data - массив данных
* @param {function} filter - функция для фильтрации
* @returns {array} - отфильтрованный массив данных
**/
function filterArray(data, filter) {
const array = [];
for (let i = 0; i < data.length; i++) {
array.push(filter(data[i], i));
}
return array;
}
/**
* XMLHttpRequest
* @param {object} params - параметры запроса
* url (string), method (string), contentType (string), data (any), async (boolean), success (function), error (function)
**/
function ajax(params) {
var request = new XMLHttpRequest();
request.open(params.method || 'GET', params.url || window.location.href, params.async || true);
request.setRequestHeader('Content-Type', params.contentType || 'application/x-www-form-urlencoded; charset=UTF-8');
request.onreadystatechange = function() {
if (this.readyState === 4) {
if (this.status >= 200 && this.status < 400) {
if (params.success) params.success(this.response, this.statusText, this.status);
} else {
if (params.error) params.error(this);
}
}
};
request.send(params.data ? JSON.stringify(params.data) : '');
request = null;
}
})()
container: document.querySelector('.swapi-container')
create() {
document.body.insertAdjacentHTML('afterBegin', function() {
return '<div class="swapi-container"></div>'
}())
return document.querySelector('.swapi-container')
}