Вставлять блок мероприятия на сайт до определенного времени

104
09 марта 2021, 11:40

Есть baner.html, в котором лежит:

<div class="rec" id="intro-dm">
   <a rel="nofollow" target="_blank" href="https://festnext.com/"> 
    <img id="recim" src="wow/1e25ca161855538d40b45cee2f3e27d6/IMG/banner/rec_mal.jpg" width="100%" alt="Приглашение на выступление"/></a>
</div>

Нужно чтобы код из файла вставлялся в <div class="Baner" id="baorzon"></div> до наступления определенного времени (например 29.06.19:20:00:000 Мск).Не пользовательского времени, а общего.

Как это реализовать, чтобы в дальнейшем можно было лишь менять содержимое baner.html, и время до которого оно видно?

На данный момент вставляю через:

<link rel="import" ...>

var link = document.querySelector('link[rel=import]');
var content = link.import.querySelector('#intro-dm'); 
document.body.appendChild(content.cloneNode(true)); 
Answer 1

По факту мы можем использовать время на клиенте:

  • записывать даты окончания мероприятия в формате UTC+0;
  • прибавлять к нему клиентское смещение по времени;
  • разницу полученного времени и текущего клиентского считать критерием окончания или актуальности мероприятия.

В качестве примера.

// Текущая дата/время на клиенте. 
const DATE_NOW = new Date(); 
 
// Блок для вывода информации. 
const BAORZON = document.querySelector('#baorzon'); 
 
// Массив мероприятий. 
const REMAININGS = [{ 
  "title": "Посмотреть тур", 
  "link": "https://ru.stackoverflow.com/tour", 
  "image": "https://via.placeholder.com/180x180/FFFF00/000000?text=Картинка+1", 
  "expired_at": "2019-07-01 3:45" // UTC+0 
}, { 
  "title": "Почитать справку", 
  "link": "https://ru.stackoverflow.com/help", 
  "image": "https://via.placeholder.com/180x180/000000/FFFFFF?text=Картинка+2", 
  "expired_at": "2019-07-01 20:05" // UTC+0 
}, { 
  "title": "Подправить даты в ответе", 
  "link": "https://ru.stackoverflow.com/help", 
  "image": "https://via.placeholder.com/180x180/0000FF/808080?text=Картинка+3", 
  "expired_at": "2020-07-01 16:01" // UTC+0 
}]; 
 
// Ищем и отрисовываем первое мероприятие, 
// срок которого еще не истек. 
renderRemaining(findRemaining(REMAININGS)); 
 
// // Либо подгружаем файл `*.json`. 
// fetch('remainings.json') 
//     .then((response) => response.json()) 
//     .then(function(remainings) { 
//         renderRemaining(findRemaining(remainings)); 
//     }) 
//     .catch(function(err) { 
//         console.error('Не удалось загрузить список мероприятий', err); 
//     }); 
 
// Поиск первого мероприятия, срок которого еще не истек. 
function findRemaining(remainings) { 
  return remainings.find(function(remaining) { 
    // Получим дату, когда истекает срок мероприятия 
    // в формате UTC + смещение по клиентскому времени. 
    let dt = dateFromString(remaining.expired_at); 
 
    // Проверяем, что дата мероприятия истекла/не истекла. 
    // Если истекла - `true`, не истекла - `false`. 
    let expired = (dt - DATE_NOW) < 0; 
 
    // Нам нужно мероприятие "не просрочка". 
    // Возвращаем булево значение. Не запутайтесь! 
    console.log('expired: '+expired, dt - DATE_NOW, dt, DATE_NOW); 
 
    return !expired; 
  }); 
} 
 
// Отрисовка мероприятие на странице. 
function renderRemaining(remaining) { 
  // Если нашли активное мероприятие. 
  if (remaining) { 
    let wrapper = document.createElement('div'); 
    let link = document.createElement('a'); 
    let img = document.createElement('img'); 
 
    wrapper.id = 'intro-dm'; 
    wrapper.classList.add('rec'); 
    link.href = remaining.link; 
    link.target = '_blank'; 
    img.src = remaining.image; 
    img.alt = remaining.title; 
    img.title = remaining.title; 
 
    BAORZON.appendChild(wrapper); 
    wrapper.appendChild(link); 
    link.appendChild(img); 
  } else { 
    BAORZON.innerHTML = 'Нет активных мероприятий.' 
  } 
} 
 
// Парсинг даты/времени из формата YYYY-MM-DD HH:MM 
// в формат UTC + смещение по клиентскому времени. 
// Либо используйте `new Date(dateString);`, где `dateString` в формате 
// http://es5.javascript.ru/x15.9.html#x15.9.1.15 
function dateFromString(str) { 
  const matches = str.match(/^(\d{4})\-(\d{1,2})\-(\d{1,2})\s+(\d{1,2}):(\d{1,2})$/); 
 
  if (6 !== matches.length) return false; 
 
  return new Date(Date.UTC( 
    parseInt(matches[1], 10), // год 
    // исчисление месяцев начинается с нуля 
    parseInt(matches[2], 10) - 1, // месяц 
    parseInt(matches[3], 10), // день 
    parseInt(matches[4], 10), // час 
    parseInt(matches[5], 10) // минут 
  )); 
}
<div class="baner" id="baorzon"></div>

READ ALSO
Разделить строку на массив слов c++

Разделить строку на массив слов c++

В Java есть функцияsplit которая разделяет строку вокруг регулярного выражения и возвращает массив строк, так вот есть ли в C++ (стандартной библиотеке)...

96
Подключение локальной БД из файла на С++

Подключение локальной БД из файла на С++

Пытаюсь подключиться к базе данных, созданной через Visual Studio (Средства -> Подключиться к базе данных)

104
Помогите понять различия

Помогите понять различия

У меня есть два класса:

105
Обработка ошибок lua c++

Обработка ошибок lua c++

Как можно реализовать вывод ошибки lua например: "Syntax error in scriptlua 4 line"

98