#javascript #python #jquery #django
#javascript #python #jquery #django
Вопрос:
У меня есть запрос в Django, который показывает все сообщения текущего пользователя, упорядоченные по дате начала сообщения.
Я хочу отобразить a DIV
в шаблоне HTML с надписью: <div>“Will start soon”</div>
,за 15 минут до времени начала публикации.
Кто-нибудь знает в Javascript, как я могу отобразить этот HTML div
-код в течение последних 15 минут перед началом публикации?
У меня есть два поля для работы этого скрипта: Start_date и start_time
Большое вам спасибо! Любая идея приветствуется!
<div class="publish-reminder invisibles" data-publish-time="{{ post.date_start }} {{ post.start_time }}">Will start soon</div>
for (let publishReminder of document.querySelectorAll("div.publish-reminder.invisibles")){
setTimeout(function() {
publishReminder.classList.remove("invisibles");
}, new Date(publishReminder.getAttribute("data-publish-time") - new Date()));
}
Комментарии:
1. Мы будем рады вам помочь. Но мы ожидаем, что вы, по крайней мере, предприняли попытку создать это. Включите свой код в вопрос.
Ответ №1:
Здесь следует учитывать две вещи:
Скрытый div
У вас может быть скрытое div
подобное
<div class="publish-reminder invisible" data-publish-time="2020-10-08 01:07:00"><!-- Some content here --></div>
И CSS
.invisible {
display: none;
}
Генерация HTML на сервере
Ваш сервер генерирует некоторый HTML, и вам нужно проверить при загрузке страницы, будет ли публикация опубликована менее чем за 15 минут. Если сообщение должно быть опубликовано менее чем за 15 минут, не создавайте invisible
класс в div
. Поскольку этот вопрос касается Javascript, я не буду подробно рассказывать о рендеринге на стороне сервера.
Рендеринг на стороне клиента
Давайте сделаем что-то вроде этого:
for (let publishReminder of document.querySelectorAll("div.publis-reminder.invisible")) {
setTimeout(function() {
publishReminder.classList.remove("invisible");
}, new Date(publishReminder.getAttribute("data-publish-time") - new Date()));
}
Объяснение:
- мы получаем все напоминания о публикации, которые (все еще невидимы)
- мы зацикливаем их
- мы вычисляем время, когда они должны отображаться, вычитая текущую дату из даты публикации и передавая полученные миллисекунды в качестве второго параметра
setTimeout
- при обратном вызове мы удаляем
invisible
class
Редактировать
После тестирования я понял, что в реализации есть проблемы. Вот доказательство концепции:
function getDateString(dt) {
return `${dt.getFullYear()}-${(dt.getMonth() 1)}-${dt.getDate()} ${dt.getHours()}:${dt.getMinutes()}:${dt.getSeconds()}`;
}
var dateStrings = [];
var dt;
dt = new Date();
dt.setMinutes(dt.getMinutes() 5);
dateStrings.push(getDateString(dt));
dt = new Date();
dt.setMinutes(dt.getMinutes() 15);
dateStrings.push(getDateString(dt));
dt = new Date();
dt.setMinutes(dt.getMinutes() 16);
dateStrings.push(getDateString(dt));
dt = new Date();
dt.setMinutes(dt.getMinutes() 17);
dateStrings.push(getDateString(dt));
var divs = `
<div class="publish-reminder invisible" data-publish-time="${dateStrings[0]}">First article</div>
<div class="publish-reminder invisible" data-publish-time="${dateStrings[1]}">Second article</div>
<div class="publish-reminder invisible" data-publish-time="${dateStrings[2]}">Third article</div>
<div class="publish-reminder invisible" data-publish-time="${dateStrings[3]}">Fourth article</div>
`;
document.body.innerHTML = divs;
for (let publishReminder of document.querySelectorAll("div.publish-reminder.invisible")) {
setTimeout(function() {
publishReminder.classList.remove("invisible");
}, ((new Date(publishReminder.getAttribute("data-publish-time"))) - (new Date())) - (15 * 60 * 1000));
}
Скрипка: https://jsfiddle.net/Lp02h5u4/2 /
Комментарии:
1. Привет @Lajos Arpad спасибо за ваш ответ! Я отредактировал код в вопросе с вашим ответом, но он не работает… скрипт всегда удаляет класс и показывает сообщение… Я что-то пропустил или забыл? Спасибо!!
2. @chrislumber добро пожаловать. Вам нужно иметь правильные значения в каждом из этих divs для атрибута data-publish-time .
3. @chrislumber вы были правы. Были проблемы в реализации. Отредактировал мой ответ, добавив проверенное доказательство концепции вместе со ссылкой, где вы можете его протестировать.
4. Ты крут!!!! Код работает!! Но есть ошибка, которую я нашел для будущих дней… Например, если дата публикации находится в следующем году «2021-01-01 08:00:00», функция удаляет «невидимый» класс… Вы знаете, почему это происходит?
5. @chrislumber рад помочь. Ошибка интересная. По-видимому, число было слишком большим, чтобы setTimeout мог правильно его обработать. Я добавил меры безопасности, см. jsfiddle.net/vokzL10y
Ответ №2:
Вы можете использовать функцию setTimeout, она будет отображать div по истечении заданного времени
setTimeout(function()
{
$('.publish-reminder').show();// or fade, css display however you'd like.
}, 5000);
он отобразит div через 5 секунд